Farklı kabuklarda “echo-e” ile kaçış dizileri


20

Linux'taki kabuğumdaki komut -eiçin bayrağın olmadığı anlaşılıyor echo. Bu sadece berbat bir ayar mı yoksa "normal" mi?

Örnek olarak bazı kodlar:

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

Baskılar:

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

Bu daha önce işe yaradı! Sanırım bazı sttykomutlar çok yanlış gitti ve artık çalışmıyor. Birisi benim shsadece adil olduğumu öne sürdü bash.


"Linux kabuğu" diye bir şey yoktur . Örneğin var içinde yerleşik sağladığı şekilde kabuk Debian paketinin (onun çekirdeğidir Linux veya FreeBSD olabilir bir işletim sistemi). echo/bin/shdash
Stéphane Chazelas

İşte bu yüzden senaryomda ihtiyaç duyduğumda kaçış karakterleri koyuyorum.

Yanıtlar:


20

Çünkü kullandınız sh, değil bash, echokomutun shseçeneği yok -e. Gönderen shman:

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.

Ve o da yok \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.

5
Birkaç shuygulama desteği echo -e, derleme zamanında bashdesteklememesi söylenebilir echo -e. Sadece işte belirli sh olduğunu (muhtemelen dash) desteklemez -eise o belirlibash yapar.
Stéphane Chazelas

17

-ePOSIX değildir (aslında, POSIX echo genellikle hiçbir seçeneği kabul etmez (desteklemeye izin verilir -n), buraya bakın ) ve /bin/shsisteminizde bir POSIX kabuğu gibi görünüyor. -ebazı kabuklarda kabul edilen bir uzantıdır, ancak buna güvenmemelisiniz, taşınabilir değildir. İdeal olarak, kullanın printfveya sahip bir kabuk kullanmaya geçin echo -e.

Ayrıca, \eaşağıdaki yorumlarda değiştirilmesi gereken uyarılara bakın \033.

printf '\033[3;12r\033[3H'

3
gnouc'un işaret ettiği gibi, shtanımaz \e. Kullanın\033
rici

4

Herhangi bir zamanda ve hemen hemen her kabukta, type echoveya "yazarak" yankılanacağını anlayabileceğinizi unutmayın which echo. Genellikle bir kabuk yerleşiktir. Bu yüzden hangi "echo" un kurulu olduğuna ve kullandığınız kabuğa bağlıdır.


4
which echokullanılmamalıdır, muhtemelen bir yerleşik kullanıyorsanız which, genellikle harici bir ikili olup olmadığını söylemeyecektir . typeyine de iyidir.
Chris Down

1
Peki, ana kabuğumda (zsh) olsa da, bir yerleşiktir ( type whichveya tarafından ortaya çıkarıldığı gibi which which). ;)
piojo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.