Mengapa tidak menggemakan dukungan "\ e" (melarikan diri) saat menggunakan argumen -e di MacOSX

36

Ketika saya mencoba untuk mencetak beberapa teks berwarna menggunakan urutan escape ANSI melalui perintah built-in echo, tampaknya \eurutan escape dalam string yang saya berikan diartikan secara literal alih-alih sebagai "escape" yang seharusnya diwakilinya. Ini hanya terjadi di Macan Tutul Salju - contoh di bawah ini berfungsi sebagaimana dimaksud dalam Macan Tutul.

Rupanya echomendukung -eswitch karena itu mengartikan dengan benar \nketika menggunakannya:

~ $ 
~ $ echo "\n"
\n
~ $ echo -e "\n"


~ $ 

Tetapi ketika saya mencoba menggunakan \e, saya mendapatkan ini:

~ $ echo -e "\e[34mCOLORS"
\e[34mCOLORS
~ $ 

Seperti saya katakan, di Leopard, di atas akan memberi saya string "WARNA" dalam warna.

Adakah yang tahu alasan mengapa ini bisa menjadi perubahan yang dimaksudkan? Bagaimana dengan solusi untuk mencetak urutan pelarian ANSI dari skrip Bash di Snow Leopard?

Versi Bash shell pada mesin Leopard saya adalah 3.2.17(1)-releasedan 3.2.48(1)-releasepada mesin Snow Leopard saya.

hasseg
sumber
1
Pertanyaan itu bertentangan dengan pos. Dalam pertanyaan Anda merujuk ke / bin / gema, sementara di pos Anda menggunakan gema tanpa jalur, yang paling mungkin adalah gema bawaan shell Anda.
0x89
Tentu saja - terima kasih telah memperhatikan. Saya memperbaiki pertanyaan untuk mencerminkan hal ini.
hasseg

Jawaban:

24

Saya tidak bisa memberi tahu Anda mengapa itu tidak mendukung argumen itu (Anda mungkin harus bertanya kepada programmer tentang itu). Saya hanya tahu bahwa di kotak linux saya, saya mendapatkan ini:

$ /bin/echo --help
Usage: /bin/echo [SHORT-OPTION]... [STRING]...
  or:  /bin/echo LONG-OPTION
Echo the STRING(s) to standard output.

  -n             do not output the trailing newline
  -e             enable interpretation of backslash escapes
  -E             disable interpretation of backslash escapes (default)
      --help     display this help and exit
      --version  output version information and exit

If -e is in effect, the following sequences are recognized:
*emphasized text*
  \0NNN   the character whose ASCII code is NNN (octal)
  \\     backslash
  \a     alert (BEL)
  \b     backspace
  \c     produce no further output
  \f     form feed
  \n     new line
  \r     carriage return
  \t     horizontal tab
  \v     vertical tab

NOTE: your shell may have its own version of echo, which usually supersedes
the version described here.  Please refer to your shell's documentation
for details about the options it supports.

Report echo bugs to [email protected]
GNU coreutils home page: <http://www.gnu.org/software/coreutils/>
General help using GNU software: <http://www.gnu.org/gethelp/>
Report echo translation bugs to <http://translationproject.org/team/>
  • ini tidak menyebutkan \elolos
  • dikatakan bahwa itu /bin/echodari gnu coreutils. Saat apel mengubah sumber komponen sistem unix mereka dari waktu ke waktu (mis. Pindah dari zsh ke bash), periksa apakah ada perubahan /bin/echoantara Leopard dan Snow Leopard. Jika itu adalah gnu, Anda dapat bertanya kepada orang-orang di gnu.org mengapa mereka memilih untuk tidak memasukkan urutan itu.

Adapun workarounds (itu lebih menarik): Tidak menggunakan /bin/echo, tetapi builtin bash echobekerja pada kotak linux. Jika mereka berubah menjadi bash tanpa echo bawaan (atau sesuatu yang bahkan lebih tidak jelas), Anda juga bisa mencoba fitur shell yang tidak dikenal luas ini (setidaknya berfungsi dalam bash dan zsh):

$ echo $'\e[34m''COLORS'

Ini adalah bagian yang cocok dari halaman manual bash:

   Words  of  the  form  $'string' are treated specially.  The word expands to string, with
   backslash-escaped characters replaced as specified by the ANSI  C  standard.   Backslash
   escape sequences, if present, are decoded as follows:
          \a     alert (bell)
          \b     backspace
          \e     an escape character
          \f     form feed
          \n     new line
          \r     carriage return
          \t     horizontal tab
          \v     vertical tab
          \\     backslash
          \'     single quote
          \nnn   the  eight-bit  character whose value is the octal value nnn (one to three
                 digits)
          \xHH   the eight-bit character whose value is the hexadecimal value  HH  (one  or
                 two hex digits)
          \cx    a control-x character

   The expanded result is single-quoted, as if the dollar sign had not been present.

   A  double-quoted string preceded by a dollar sign ($) will cause the string to be trans
   lated according to the current locale.  If the current locale is C or POSIX, the  dollar
   sign  is  ignored.  If the string is translated and replaced, the replacement is double-
   quoted.
0x89
sumber
4
Saya tidak menyadari $'string'urutan melarikan diri diaktifkan, terima kasih.
hasseg
1
\ebukan bagian dari standar POSIX; implementasi GNU coreutils diperluas pada standar. OS X tidak.
Martijn Pieters
49

Mencoba \x1B alih-alih \e.

LiraNuna
sumber
6
\x1Balih-alih \ebekerja, terima kasih.
hasseg
10
Hanya untuk referensi, 1Badalah nilai hex dari karakter Escape .
TachyonVortex
15

Apakah \033masih berfungsi? Jika tidak, mudah-mudahan Anda dapat menekan Ctrl + V diikuti oleh tombol Escape (jika mac memiliki kunci-kunci itu) untuk membuat karakter kontrol nyata di dalam baris perintah (yang tentu saja tidak bekerja dengan baik dalam skrip, tergantung pada editor)

mihi
sumber
5
\033alih-alih \ebekerja, terima kasih.
hasseg
4
Hanya untuk referensi, 33adalah nilai oktal dari karakter Escape .
TachyonVortex
Hanya untuk referensi pembaca di masa depan 033akan menjadi cara standar untuk menulis oktal.
ocodo
11

Satu cara lain untuk mencetak urutan pelarian ANSI dalam shell adalah dengan menggunakan /usr/bin/printf.

hasseg
sumber
3
printf adalah cara portabel untuk menampilkan sesuatu dalam shell. Ada terlalu banyak rasa gema ...
mouviciel
6

Untuk melengkapi jawaban bermanfaat yang ada dengan beberapa informasi latar belakang :

Jika Anda memanggil hanya echodengan nama - yang bertentangan dengan jalurnya, /bin/echo- Anda menggunakan Bash bawaan daripada utilitas eksternal.

Perilaku elemen Bash asli seperti builtin biasanya portabel dalam arti Bash, yang berarti mereka harus bekerja sama pada platform apa pun yang mampu menjalankan Bash .

\eadalah pengecualian yang aneh yang memengaruhi versi 3.x Bash di macOS (hingga hari ini, pada v10.13.5 (High Sierra), macOS dilengkapi dengan versi Bash 3.x yang usang, karena alasan hukum).

\e(dan aliasnya \E) harus bekerja dengan echo -e; \edukungan telah ditambahkan ke echobuiltin di Bash 2.0 . , tapi entah kenapa tidak ada dalam versi 3.x stok di macOS.

\e tidak berfungsi dalam versi 3.x Bash aktif platform lain , seperti MSYS di Windows.

Sebaliknya, jika Anda menginstal dan menggunakan 4.x Bash di macOS, \e tidak berfungsi.

mklement0
sumber
2

Mereka mungkin mencoba menyesuaikan diri dengan POSIX: http://www.opengroup.org/onlinepubs/9699919799/

Bagian PILIHAN menyatakan antara lain:

Implementations shall not support any options.
Caotic
sumber
Berikut adalah tautan langsung ke materi yang saya pikir Anda maksud: opengroup.org/onlinepubs/9699919799/utilities/echo.html
Dijeda hingga pemberitahuan lebih lanjut.
Nggak. Halaman ini terus menulis: 'Jika operan pertama adalah -n, atau jika ada operan yang mengandung karakter <backslash>, hasilnya ditentukan-implementasi.' Juga, gema macOS tidak menafsirkan -e.
Yongwei Wu
2

FYI, Kami baru saja akan menambahkan \ e dukungan ke / bin / echo dan / usr / bin / printf di coreutils. Perhatikan standar C tidak menentukan \ e, tetapi gcc, perl, bash, ksh dan tcsh mendukungnya

pixelbeat
sumber
0

Anda mungkin memeriksa apakah ,, melarikan diri karakter non-ascii '' telah dicentang di menu opsi tampilan terminal.app.

Tadeusz A. Kadłubowski
sumber