
In meinem Terminal tritt ein merkwürdiges Verhalten auf.
Der folgende Befehl gibt nichts auf meinem Terminal aus:
comment=$(
cat /usr/share/applications/brasero.desktop |
grep '^Comment=' |
grep -Po '(?<=^Comment=)[ --0-9A-Za-z/.]*'
)
echo $comment
Genau derselbe Befehl und die gleiche Syntax funktionieren perfekt in einem Bash-Skript.
Normalerweise sehe ich Leute, die sich über das gegenteilige Verhalten beschweren.
Ich weiß, dass der obige Vorgang auf Hunderte Arten durchgeführt werden könnte, aber ich kann nicht verstehen, warum der obige Befehl in meinem Terminal nicht funktioniert.
Andererseits funktionieren diese Befehle sowohl im Terminal als auch im Skript einwandfrei:
comment=$(
cat /usr/share/applications/brasero.desktop |
grep -Po '(?<=^Comment=)[ --0-9A-Za-z/.]*'
)
echo $comment
grep -Po '(?<=Exec=)[ --0-9A-Za-z/:space:]*' > /usr/share/applications/brasero.desktop
Ich verwende GNU Bash, Version 4.4.0(1)-Release (x86_64-pc-linux-gnu), unter Debian 8 Sid, mit grep (GNU grep) 2.26. Ich habe es sowohl im Xfce- als auch im Mate-Terminal versucht, aber das Verhalten ist dasselbe.
Danke
Antwort1
Wenn Sie auf derartige Probleme stoßen, sollten Sie damit beginnen, Dinge aus Ihrem Test zu entfernen, bis Sie etwas erhalten, das funktioniert.
Wenn Ihr Ausgangspunkt beispielsweise ist:
comment=$(cat /usr/share/applications/brasero.desktop |grep '^Comment=' |grep -Po '(?<=^Comment=)[ --0-9A-Za-z/.]*');echo $comment
Entfernen Sie zunächst den variablen Kram:
cat /usr/share/applications/brasero.desktop |grep '^Comment=' |grep -Po '(?<=^Comment=)[ --0-9A-Za-z/.]*'
Dann streifen Sie die zweite ab grep
:
cat /usr/share/applications/brasero.desktop |grep '^Comment='
Dann das andere grep:
cat /usr/share/applications/brasero.desktop
Irgendwann wirst du einen Punkt finden, an dem es funktioniert. In deinem speziellen Fall funktioniert es wie folgt:
cat /usr/share/applications/brasero.desktop |grep '^Comment='
Das Problem liegt also in dieser Sekunde grep
. Fügen Sie den Rest wieder hinzu und prüfen Sie, ob es noch funktioniert:
comment=$(cat /usr/share/applications/brasero.desktop |grep '^Comment=');echo $comment
Das ist tatsächlich der Fall. Wo liegt also das Problem? Ist Ihnen aufgefallen, dass die Ausgabe bei diesem letzten in Farbe erfolgte? Die Ausgabe enthält ANSI-Farb-Escape-Codes. Dies verhindert, dass die zweite Ausgabe grep
übereinstimmt.
Die Lösung besteht darin, Ihren grep
Alias entweder in zu ändern --color=auto
oder zu tun unalias grep
oder --color=never
ihn den Befehlen manuell hinzuzufügen.
Es gibt auch einen anderen Ansatz, der hier verfolgt werden kann. Da Sie wissen, dass es innerhalb eines Skripts funktioniert, ist die einzige Erklärung, dass es umgebungsbedingt ist.
Sie können also mit einer sauberen Umgebung beginnen bash --noprofile --norc
und Ihr Profil Stück für Stück einbringen, bis es kaputt geht.
Diese Technik hat jedoch einen Haken. Selbst mit --noprofile --norc
gibt es einige Unterschiede zwischen CLI und Skript, wie z. B. Verlaufserweiterung und Jobsteuerung. Sie können diese jedoch auch deaktivieren: set +H
und set -m
.