Escape-Sequenzen mit "echo -e" in verschiedenen Shells

20

Mir ist gerade aufgefallen, dass es den Anschein hat, dass das Flag -efür den echoBefehl in meiner Shell unter Linux nicht vorhanden ist . Ist das nur eine vermasselte Einstellung oder ist es "normal"?

Code als Beispiel:

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

Drucke:

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

Das hat schon mal geklappt! Ich denke, einige sttyBefehle sind furchtbar schief gelaufen und jetzt funktioniert es nicht mehr. Jemand schlug vor, dass meine shtatsächlich gerecht war bash.

BrainStone
quelle
Es gibt keine "Linux-Shell" . Es gibt zum Beispiel die echoeingebaute /bin/shShell, wie sie dashim Debian-Paket enthalten ist (ein Betriebssystem, das Linux oder FreeBSD als Kernel haben kann).
Stéphane Chazelas
Und aus diesem Grund füge ich einfach Fluchtzeichen in mein Skript ein, wenn ich sie benötige.

Antworten:

20

Da Sie shnicht verwendet haben bash, hat der echoBefehl in shkeine Option -e. Aus der shManpage:

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.

Und das hat es auch nicht \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
quelle
5
shUnterstützung für mehrere Implementierungen echo -e, bei der Kompilierung bashkann angegeben werden, dass diese nicht unterstützt werden sollen echo -e. Es ist nur so, dass diese bestimmte sh (wahrscheinlich dash) nicht unterstützt, -ewährend diese bestimmtebash tut.
Stéphane Chazelas
17

-eist nicht POSIX (tatsächlich akzeptiert POSIX-Echo im Allgemeinen keine Optionen (wird jedoch unterstützt -n), siehe hier ), und /bin/shauf Ihrem System scheint es sich um eine POSIX-Shell zu handeln. -eist eine Erweiterung, die in einigen Shells akzeptiert wird, aber Sie sollten sich nicht darauf verlassen, sie ist nicht portabel. Verwenden Sie im Idealfall printfoder wechseln Sie zu einer Shell, die hat echo -e.

Beachten Sie auch die Einschränkungen \ein den Kommentaren unten, die durch ersetzt werden sollten \033.

printf '\033[3;12r\033[3H'
Chris Down
quelle
3
wie gnouc betont, sherkennt er es auch nicht \e. Verwendung\033
rici
4

Beachten Sie, dass Sie jederzeit und in fast jeder Shell herausfinden können, welches "Echo" aufgerufen wird, indem Sie type echooder eingeben which echo. Es ist normalerweise eine eingebaute Shell. Es kommt also darauf an, welches "Echo" installiert ist und welche Shell Sie verwenden.

piojo
quelle
4
which echoSollte dies nicht verwendet werden, wird es Ihnen wahrscheinlich nicht sagen, ob Sie ein eingebautes Programm verwenden, da whiches sich normalerweise um ein externes Binärprogramm handelt. typeist aber gut.
Chris Down
1
Gut gesehen, obwohl es sich bei meiner Haupt-Shell (zsh) um eine eingebaute Shell handelt (wie von type whichoder enthüllt which which). ;)
Piojo