grep funktioniert im Bash-Skript, aber nicht im Terminal

grep funktioniert im Bash-Skript, aber nicht im Terminal

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 grepAlias ​​entweder in zu ändern --color=autooder zu tun unalias grepoder --color=neverihn 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 --norcund Ihr Profil Stück für Stück einbringen, bis es kaputt geht.

Diese Technik hat jedoch einen Haken. Selbst mit --noprofile --norcgibt es einige Unterschiede zwischen CLI und Skript, wie z. B. Verlaufserweiterung und Jobsteuerung. Sie können diese jedoch auch deaktivieren: set +Hund set -m.

verwandte Informationen