Es ist eine Variable POSIXLY_CORRECT in BashWie verwendet man POSIXLY_CORRECT in Grep?
POSIXLY_CORRECT
Wenn diese Variable in der Umgebung ist, wenn Bash beginnt, die Shell POSIX-Modus (siehe Bash POSIX-Modus) vor dem Lesen Sie den Start Dateien eingibt, als wäre die Aufrufoption --posix geliefert worden. Wenn es Satz, während die Shell ausgeführt wird, ermöglicht Bash POSIX-Modus, als ob der Befehl
set -o posix
hatte ausgeführt worden ist.
Ich wurde gesagt, dass einige Optionen von grep
sind nicht POSIX und so habe ich in The Open Group Base Specifications Issue 6 for grep
bestätigt. So überprüfte ich die GNU grep manual und gefunden:
grep mit einem umfangreichen Satz von Optionen kommt: einige von POSIX und einigen Erweiterungen ist GNU. Lange Optionsnamen sind immer eine GNU-Erweiterung, auch für Optionen, die aus POSIX-Spezifikationen stammen. Optionen, die sind, die von POSIX unter ihren kurzen Namen angegeben werden, werden explizit als gekennzeichnet, um POSIX-portable Programmierung zu erleichtern. Einige Optionsnamen sind , die für Kompatibilität mit älteren oder exotischeren Implementierungen bereitgestellt werden.
Und es erwähnt auch:
Das Verhalten von grep durch die folgenden Umgebungsvariablen beeinflusst wird.
POSIXLY_CORRECT
Wenn gesetzt, verhält sich grep wie POSIX erfordert; Ansonsten verhält sich Grep mehr wie andere GNU-Programme. POSIX erfordert, dass Optionen, die auf Dateinamen folgen, als Dateinamen behandelt werden müssen. Standardmäßig werden solche Optionen an die Vorderseite der Operandenliste permutiert und als Optionen behandelt. Außerdem deaktiviert POSIXLY_CORRECT die spezielle Behandlung eines ungültigen Klammerausdrucks. Siehe invalid-bracket-expr.
Mit den Teil Langoptionsnamen sind immer eine GNU-Erweiterung, auch für Optionen, die von POSIX-Spezifikationen sind Ich sagte: Lassen Sie uns die Variable POSIXLY_CORRECT dagegen versuchen.
Also habe ich mit etwas versuchen, das nicht POSIX ist:
$ echo "HELLO" | grep --ignore-case 'hello'
HELLO
Aber zu meiner Überraschung Einstellung funktioniert es auch:
$ echo "HELLO" | POSIXLY_CORRECT=1 grep --ignore-case 'hello'
HELLO
Was mache ich falsch? Sollte ein Set POSIXLY_CORRECT grep
keinen langen Optionsnamen erkennen lassen?
Das gleiche geschieht, wenn eine Option (zum Beispiel -C
), die nicht POSIX ist:
$ POSIXLY_CORRECT=1 grep -C 2 '2' <<< "1
2
3"
1
2
3
Neben tun alle die gleiche Lauf set -o posix
vor.
'grep' ist ein externes Programm, es ist nicht Teil der Shell. – Barmar
Versuchen Sie 'export POSIXLY_CORRECT' – cdarke
@cdarke Wenn Sie eine Variablenzuweisung am Anfang des Befehls setzen, wird sie automatisch exportiert. – Barmar