it-swarm.com.de

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

Ich habe gerade bemerkt, dass das Flag -e Für den Befehl echo in meiner Shell unter Linux anscheinend nicht vorhanden ist. Ist das nur eine durcheinandergebrachte Einstellung oder ist es "normal"?

Ein 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 stty Befehle sind furchtbar schief gelaufen und jetzt funktioniert es nicht mehr. Jemand schlug vor, dass mein sh eigentlich nur bash war.

21
BrainStone

Da Sie sh und nicht bash verwendet haben, hat der Befehl echo in sh keine Option -e. Von der Manpage sh:

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 es hat nicht \e, zu:

        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.
22
cuonglm

-e Ist kein POSIX (tatsächlich akzeptiert POSIX echo im Allgemeinen keine Optionen (obwohl -n Unterstützt werden darf), siehe hier ) und /bin/sh auf Ihrem System scheint eine POSIX-Shell zu sein. -e Ist eine Erweiterung, die in einigen Shells akzeptiert wird, aber Sie sollten sich nicht darauf verlassen, sie ist nicht portabel. Verwenden Sie im Idealfall printf oder wechseln Sie zu einer Shell mit echo -e.

Beachten Sie auch die Vorbehalte von \e In den Kommentaren unten, die durch \033 Ersetzt werden sollten.

printf '\033[3;12r\033[3H'
18
Chris Down

Beachten Sie, dass Sie jederzeit und in fast jeder Shell herausfinden können, welches "Echo" aufgerufen wird, indem Sie type echo Oder which echo Eingeben. Es ist normalerweise eine eingebaute Shell. Es hängt also davon ab, welches "Echo" installiert ist und welche Shell Sie verwenden.

4
piojo