it-swarm.asia

Mengapa tidak mendukung gema "\ e" (melarikan diri) saat menggunakan argumen -e di MacOSX

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

Rupanya echo tidak mendukung saklar -e karena ia benar mengartikan \n saat 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)-release dan 3.2.48(1)-release pada mesin Snow Leopard saya.

35
hasseg

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 \e lolos
  • dikatakan bahwa ini adalah /bin/echo dari gnu coreutils. Saat Apple mengubah sumber komponen sistem unix mereka dari waktu ke waktu (mis. Pindah dari zsh ke bash), periksa apakah ada perubahan untuk /bin/echo antara Leopard dan Snow Leopard. Jika itu gnu, Anda dapat bertanya kepada orang-orang di gnu.org mengapa mereka memilih untuk tidak memasukkan urutan itu.

Sedangkan untuk workarounds (itu lebih menarik): Tidak menggunakan /bin/echo, tapi bash's builtin echo bekerja pada kotak linux. Jika mereka berubah menjadi bash tanpa builtin echo (atau sesuatu yang bahkan lebih tidak jelas), Anda juga dapat mencoba fitur Shell yang tidak diketahui secara 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.
24
0x89

Coba \x1B alih-alih \e.

49
LiraNuna

Apakah \033 masih 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)

14
mihi

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

11
hasseg

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

Jika Anda memohon echo dengan nama saja - sebagai lawan dari pathnya, /bin/echo - Anda menggunakan Bash builtin daripada utilitas eksternal.

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

\e adalah pengecualian aneh yang memengaruhi versi 3.x Bash pada macOS (hingga hari ini, pada v10.13.5 (High Sierra), macOS hadir dengan versi Bash 3.x yang sudah kedaluwarsa, karena alasan hukum).

\e (dan alias \E) harus bekerja dengan echo -e; \e dukungan telah ditambahkan ke echo builtin di Bash 2. . , tetapi entah kenapa tidak ada dalam versi 3.x stock di macOS.

\e tidak bekerja di versi 3.x Bash pada platform lainnya, seperti MSYS pada Windows.

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

6
mklement0

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

2
pixelbeat

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

Bagian PILIHAN menyatakan antara lain:

Implementations shall not support any options.
2
Caotic

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