Sekwencje specjalne z „echo -e” w różnych powłokach

20

Właśnie zauważyłem, że wydaje się, że flaga -enie istnieje dla echopolecenia w mojej powłoce w systemie Linux. Czy to tylko pomieszane ustawienie, czy jest to „normalne”?

Niektóre kody jako przykład:

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

Wydruki:

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

To działało wcześniej! Wydaje mi się, że niektóre sttypolecenia poszły bardzo źle, a teraz to już nie działa. Ktoś zasugerował, że mój shbył właściwie sprawiedliwy bash.

BrainStone
źródło
Nie ma czegoś takiego jak „powłoka Linux” . Jest na przykład wbudowane w skorupkach jak dostarczane przez pakiet na Debianie (system operacyjny, który może mieć Linux lub FreeBSD jako jego jądra). echo/bin/shdash
Stéphane Chazelas
I dlatego właśnie wstawiam znaki specjalne do mojego skryptu, kiedy ich potrzebuję.

Odpowiedzi:

20

Ponieważ użyłeś sh, nie bash, wtedy echopolecenie w shnie ma opcji -e. Z shstrony podręcznika:

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.

I nie ma \eteż:

        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
źródło
5
Kilka shimplementacji obsługuje echo -e, w czasie kompilacji bashmożna powiedzieć, aby nie obsługiwały echo -e. Po prostu ten konkretny sh (prawdopodobnie dash) nie obsługuje, -epodczas gdy ten konkretnybash .
Stéphane Chazelas
17

-enie jest POSIX (w rzeczywistości echo POSIX zasadniczo nie akceptuje żadnych opcji (choć może to obsługiwać -n), patrz tutaj ), aw /bin/shtwoim systemie wydaje się być powłoką POSIX. -ejest rozszerzeniem akceptowanym w niektórych powłokach, ale nie powinieneś na nim polegać, nie jest przenośne. Najlepiej użyj printflub przełącz się na używanie powłoki, która ma echo -e.

Zobacz także zastrzeżenia \ew komentarzach poniżej, które należy zastąpić \033.

printf '\033[3;12r\033[3H'
Chris Down
źródło
3
jak wskazuje gnouc, shteż nie rozpoznaje \e. Użyj\033
rici
4

Zauważ, że w dowolnym momencie i prawie w każdej powłoce możesz dowiedzieć się, które „echo” będzie wywoływane przez wpisanie type echolub which echo. Zwykle jest to wbudowana powłoka. To zależy od tego, które „echo” jest zainstalowane i od jakiej powłoki używasz.

piojo
źródło
4
which echonie powinien być używany, prawdopodobnie nie powie ci, czy używasz wbudowanego, ponieważ whichzwykle jest to zewnętrzny plik binarny. typejest jednak dobre.
Chris Down
1
Dobrze zauważony, chociaż na mojej głównej powłoce (zsh), jest to wbudowany (jak ujawniono przez type whichlub which which). ;)
piojo