Der Echobefehl mit der Farboption in Skript und Befehl funktioniert anders

15

Wenn ich echo -e "\e[1;31mThis is red text\e[0m"in der Kommandozeile laufe, druckt es roten Text aus.

Wenn ich es jedoch benutze, schreibe ich es in eine Skriptdatei test.sh

#! /bin/bash
echo -e "\e[1;31mThis is red text\e[0m"

Lauf $ sh test.sh

Es wird ausgedruckt -e \e[1;31mThis is red text\e[0m

Warum handeln sie anders?

Qingfeng
quelle

Antworten:

29

echoist eine in Bash und dash ( /bin/sh) eingebaute Shell . Wenn Sie echoüber die Befehlszeile ausgeführt werden, verwenden Sie die integrierte Bash-Funktion. Wenn Sie Ihr Shell-Skript mit dieser Funktion ausführen, verwenden Sie shdie integrierte Dash-Funktion.

Die Dash-Version von echokennt die -eOption nicht, gibt jedoch alles wörtlich aus, ohne dass eine spezielle Behandlung für \Sequenzen erforderlich ist .

Verwenden Sie entweder Bash, um Ihr Shell-Skript auszuführen, oder verwenden Sie /bin/echoanstelle von echo:

/bin/echo -e "\e[1;31mThis is red text\e[0m"

Um die Probleme mit verschiedenen Versionen zu vermeiden, echomöchten Sie möglicherweise printfstattdessen verwenden. Im Gegensatz zu Sequenzen, die echo printfimmer interpretiert \werden, wird am Ende jedoch nicht automatisch ein Zeilenvorschub eingefügt, sodass Sie am Ende einen Zeilenvorschub anfügen müssen, \nwenn Sie einen möchten.

Da einige Versionen von printfnicht verstehen \e, sollten Sie \033stattdessen Folgendes verwenden :

printf "\033[1;31mThis is red text\033[0m\n"
Florian Diesch
quelle
Es klappt. /bin/echomit dash ( /bin/sh) und bash; echomit bash oder ./tes.shbeides funktioniert einwandfrei. Der folgende Code funktioniert bashnur mit. if [$ UID -ne 0]; dann echo "Nicht root" else echo "Root - Benutzer" fi
Qingfeng
1

Führen Sie sh test.shes nicht mit aus , es druckt den Text in weißer Farbe, wie Sie sagten. Nachdem Sie das Skript erstellt haben, machen Sie es ausführbar, indem Sie Folgendes ausführen:

sudo chmod +x /path/test.sh

Bildbeschreibung hier eingeben

Führen Sie das Skript mit sudo, like sudo ./test.shoder ./test.shboth aus.

Oder

Führen Sie das Skript mit bash,

bash /path/test.sh
Avinash Raj
quelle
Ich laufe chmod a+x test.sh, es druckt den Text in gelesenen Farben. Was ist der Unterschied. ./test.shsollte gleich sh test.shWas ist unter Linux passiert?
Qingfeng
Sie nicht zu verwenden sh haben , während das Skript ausgeführt wird , das Skript mit bash - Interpreter erstellt hat , #! /bin/bashso dass Sie verwenden müssenbash test.sh
Avinash Raj
Und .bedeutet auch aktuelles Verzeichnis.
Avinash Raj
Sehen Sie sich den Screenshot an, meine Datei test.sh befindet sich auf dem Desktop. Also bin ich in diesen Desktop-Ordner gezogen und ./test.shstarte dann , endlich funktioniert es. Denken Sie daran, dass Sie das Skript .nur ausführen, wenn es im aktuellen Verzeichnis vorhanden ist.
Avinash Raj
1

Dazu muss der richtige Befehl im richtigen Format vorliegen.

Richtige Echo-Aussage: echo "Hello World!"

Richtiges Echo Statement mit Farbe: echo "\e[1;31mHello World!\e[0m"

Das Hinzufügen von Farbe zu einem Bash-Skript ist eine dieser sehr einfachen, aber leicht verwirrenden Aufgaben. =)

Diese Seite könnte Ihnen dabei helfen, alles klar zu erklären. Ich benutze es oft als Referenz, denn wer kann sich schon an alle richtigen Farbcodes erinnern, oder? LOL

hwac121
quelle