Jest zmienna POSIXLY_CORRECT w BashJak korzystać z POSIXLY_CORRECT w grep?
POSIXLY_CORRECT
Jeśli zmienna ta jest w środowisku podczas uruchamiania bash, powłoka przechodzi w tryb POSIX (patrz Bash Tryb POSIX) przed przeczytaniem starcie plików tak jakby podano opcję wywołania -posix. Jeśli jest zestaw podczas gdy powłoka jest uruchomiony, bash włącza tryb POSIX, jakby polecenie
set -o posix
został stracony.
Powiedziano mi, że niektóre opcje grep
nie są POSIX-ami i dlatego potwierdziłem w The Open Group Base Specifications Issue 6 for grep
. Więc sprawdziłem GNU grep manual Znalezione
grep jest wyposażony w bogaty zestaw opcji: niektóre z POSIX i niektóre będące rozszerzeniami GNU. Długie nazwy opcji są zawsze rozszerzeniem GNU, , nawet dla opcji, które pochodzą ze specyfikacji POSIX. Opcje oznaczone jako POSIX pod ich krótkimi nazwami są wyraźnie oznaczone jako w celu ułatwienia programowania przenośnego POSIX. Kilka nazw opcji to: pod warunkiem zgodności ze starszymi lub bardziej egzotycznymi implementacjami.
I to również jest mowa o:
Zachowanie grep mają wpływ następujące zmienne środowiskowe.
POSIXLY_CORRECT
Jeśli jest ustawiona, to grep zachowuje się jak wymaga POSIX; w przeciwnym razie grep zachowuje się bardziej jak inne programy GNU. POSIX wymaga, aby opcje występujące po nazwach plików były traktowane jak nazwy plików; domyślnie takie opcje są permutowane z przodu listy argumentów operacji i są traktowane jako opcje. Ponadto POSIXLY_CORRECT wyłącza specjalne traktowanie nieprawidłowego wyrażenia nawiasów. Zobacz invalid-bracket-expr.
Korzystanie z częścią długie nazwy opcji są zawsze rozszerzenie GNU, nawet dla opcji, które są ze specyfikacją POSIX I powiedział: Spróbujmy zmienna POSIXLY_CORRECT przeciwko temu.
więc nie spróbować z czymś, co nie jest POSIX:
$ echo "HELLO" | grep --ignore-case 'hello'
HELLO
Ale ku mojemu zaskoczeniu działa również ustawienie go:
$ echo "HELLO" | POSIXLY_CORRECT=1 grep --ignore-case 'hello'
HELLO
Co robię źle? Czy nie należy ustawić, aby w pliku POSIXLY_CORRECT grep
rozpoznawano długą nazwę opcji?
To samo dzieje się w przypadku korzystania z opcji (np -C
), które nie jest POSIX:
$ POSIXLY_CORRECT=1 grep -C 2 '2' <<< "1
2
3"
1
2
3
Jak również robi wszystko samo bieganie set -o posix
wcześniej.
'grep' to program zewnętrzny, nie jest częścią powłoki. – Barmar
Wypróbuj 'export POSIXLY_CORRECT' – cdarke
@cdarke Kiedy umieścisz przypisanie zmiennej na początku polecenia, wyeksportuje je automatycznie. – Barmar