Melarikan diri dari urutan dengan "echo -e" di shell yang berbeda

20

Saya hanya memperhatikan bahwa sepertinya flag -etidak ada untuk echoperintah di shell saya di Linux. Apakah ini hanya pengaturan yang kacau atau itu "normal"?

Beberapa kode sebagai contoh:

#!/bin/sh
echo -e "\e[3;12r\e[3H"

Cetakan:

-e \e[3;12r\e[3H

Ini berhasil sebelumnya! Saya kira beberapa sttyperintah menjadi sangat salah dan sekarang tidak berfungsi lagi. Seseorang menyarankan bahwa saya shsebenarnya adil bash.

BrainStone
sumber
Tidak ada yang namanya "Linux shell" . Misalnya ada echobuilt - in dari /bin/shshell yang disediakan oleh dashpaket pada Debian (sistem operasi yang dapat menggunakan Linux atau FreeBSD sebagai kernelnya).
Stéphane Chazelas
Dan inilah mengapa saya hanya memasukkan karakter melarikan diri dalam skrip saya ketika saya membutuhkannya.

Jawaban:

20

Karena Anda menggunakan sh, tidak bash, maka echoperintah di shtidak memiliki opsi -e. Dari shhalaman manual:

echo [-n] args...
            Print the arguments on the standard output, separated by spaces.
            Unless the -n option is present, a newline is output following the
            arguments.

Dan itu juga tidak ada \e:

        If any of the following sequences of characters is encountered
        during output, the sequence is not output.  Instead, the specified
        action is performed:

        \b      A backspace character is output.

        \c      Subsequent output is suppressed.  This is normally used at
                the end of the last argument to suppress the trailing new
                line that echo would otherwise output.

        \f      Output a form feed.

        \n      Output a newline character.

        \r      Output a carriage return.

        \t      Output a (horizontal) tab character.

        \v      Output a vertical tab.

        \0digits
                Output the character whose value is given by zero to three
                octal digits.  If there are zero digits, a nul character
                is output.

        \\      Output a backslash.

        All other backslash sequences elicit undefined behaviour.
cuonglm
sumber
5
Beberapa shimplementasi implementasi echo -e, pada saat kompilasi bashdapat dikatakan tidak mendukung echo -e. Hanya saja sh tertentu (mungkin dash) tidak mendukung -esedangkan tertentubash tidak.
Stéphane Chazelas
17

-ebukan POSIX (pada kenyataannya, gema POSIX umumnya tidak menerima opsi (meskipun diizinkan untuk mendukung -n), lihat di sini ), dan /bin/shpada sistem Anda tampaknya shell POSIX. -eadalah ekstensi yang diterima di beberapa shell, tetapi Anda tidak harus bergantung pada itu, itu tidak portabel. Idealnya, gunakan printf, atau beralih ke menggunakan shell yang telah echo -e.

Juga lihat peringatan \edalam komentar di bawah ini, yang harus diganti dengan \033.

printf '\033[3;12r\033[3H'
Chris Down
sumber
3
seperti yang ditunjukkan gnouc, shtidak mengenali \ekeduanya. Gunakan\033
rici
4

Perhatikan bahwa kapan saja dan di hampir semua shell, Anda dapat mengetahui "gema" mana yang akan dipanggil dengan mengetik type echoatau which echo. Biasanya shell builtin. Jadi itu tergantung pada "gema" mana yang diinstal dan pada shell mana yang Anda gunakan.

piojo
sumber
4
which echojangan digunakan, kemungkinan tidak akan memberi tahu Anda jika Anda menggunakan builtin karena whichbiasanya biner eksternal. typeitu bagus.
Chris Down
1
Terlihat dengan baik, meskipun pada shell utama saya (zsh), itu adalah builtin (seperti yang diungkapkan oleh type whichatau which which). ;)
piojo