Там в BashКак использовать POSIXLY_CORRECT в grep?
переменная POSIXLY_CORRECTPOSIXLY_CORRECT
Если эта переменная в среде при запуске Bash, оболочка переходит в режим POSIX (см Баш режим POSIX) перед чтением стартап файлов, как если бы была опция -posix invocation. Если это набора в то время как оболочка работает, Bash включает режим POSIX, как если бы команды
set -o posix
была казнена.
мне сказали, что некоторые варианты grep
не POSIX и поэтому я подтвердил в The Open Group Base Specifications Issue 6 for grep
. Так что я проверил GNU grep manual и нашел:
Grep поставляется с богатым набором опций: некоторые из POSIX и некоторые из них являются расширениями GNU. Длинные имена опций всегда являются расширением GNU, даже для опций, относящихся к спецификациям POSIX. Параметры, которые являются , указанные POSIX под их короткими именами, явно помечены как , что облегчает POSIX-переносное программирование. Несколько имен опций - , предназначенные для совместимости со старыми или более экзотическими реализациями.
И это также упоминает:
Поведение Grep зависит от следующих переменных среды.
POSIXLY_CORRECT
Если установлено, Grep ведет себя как требует POSIX; В противном случае grep ведет себя как другие программы GNU. POSIX требует, чтобы параметры, следующие за именами файлов, считались именами файлов; по умолчанию такие параметры переставляются в начало списка операндов и рассматриваются как параметры. Кроме того, POSIXLY_CORRECT отключает специальную обработку недопустимого выражения скобки. См. Недопустимый-скотч-expr.
Используя часть длинные имена опций всегда расширение GNU, даже для вариантов, которые от спецификаций POSIX я сказал: давайте попробуем переменную POSIXLY_CORRECT против этого.
Так что я действительно пытался что-то, что не является POSIX:
$ echo "HELLO" | grep --ignore-case 'hello'
HELLO
Но к моему удивлению, он также работает установив его:
$ echo "HELLO" | POSIXLY_CORRECT=1 grep --ignore-case 'hello'
HELLO
Что я делаю неправильно? Должен ли набор POSIXLY_CORRECT сделать grep
не распознать длинное имя параметра?
То же самое происходит при использовании опции (например -C
), не POSIX:
$ POSIXLY_CORRECT=1 grep -C 2 '2' <<< "1
2
3"
1
2
3
Как делать все-таки работает set -o posix
раньше.
'grep' - внешняя программа, это не часть оболочки. – Barmar
Попробуйте 'export POSIXLY_CORRECT' – cdarke
@cdarke Когда вы поместите назначение переменной в начале команды, оно автоматически экспортирует его. – Barmar