Ketika saya mencoba untuk mencetak beberapa teks berwarna menggunakan urutan escape ANSI melalui perintah built-in echo
, tampaknya \e
urutan 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 echo
mendukung -e
switch karena itu mengartikan dengan benar \n
ketika 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.
sumber
Jawaban:
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:
\e
lolos/bin/echo
dari 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/echo
antara 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 bashecho
bekerja 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):Ini adalah bagian yang cocok dari halaman manual bash:
sumber
$'string'
urutan melarikan diri diaktifkan, terima kasih.\e
bukan bagian dari standar POSIX; implementasi GNU coreutils diperluas pada standar. OS X tidak.Mencoba
\x1B
alih-alih\e
.sumber
\x1B
alih-alih\e
bekerja, terima kasih.1B
adalah nilai hex dari karakter Escape .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)sumber
\033
alih-alih\e
bekerja, terima kasih.33
adalah nilai oktal dari karakter Escape .033
akan menjadi cara standar untuk menulis oktal.Satu cara lain untuk mencetak urutan pelarian ANSI dalam shell adalah dengan menggunakan
/usr/bin/printf
.sumber
Untuk melengkapi jawaban bermanfaat yang ada dengan beberapa informasi latar belakang :
Jika Anda memanggil hanya
echo
dengan 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 .
\e
adalah 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 denganecho -e
;\e
dukungan telah ditambahkan keecho
builtin 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.sumber
Mereka mungkin mencoba menyesuaikan diri dengan POSIX: http://www.opengroup.org/onlinepubs/9699919799/
Bagian PILIHAN menyatakan antara lain:
sumber
-e
.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
sumber
Anda mungkin memeriksa apakah ,, melarikan diri karakter non-ascii '' telah dicentang di menu opsi tampilan terminal.app.
sumber