Bash中有一个变量POSIXLY_CORRECT
我被告知一些POSIXLY_CORRECT
If this variable is in the environment when Bash starts, the shell enters POSIX mode (see Bash POSIX Mode) before reading the startup files, as if the --posix invocation option had been supplied. If it is set while the shell is running, Bash enables POSIX mode, as if the command
set -o posix
had been executed.
grep
的选项不是POSIX标准,所以我在 The Open Group Base Specifications Issue 6 for grep
中进行了确认。因此,我查看了 GNU grep手册并发现:
grep带有丰富的选项:其中一些来自POSIX,另一些则是GNU扩展。长选项名称始终是GNU扩展,即使是来自POSIX规范的选项也是如此。由POSIX指定的选项,在其短名称下明确标记为这样,以便促进POSIX可移植编程。一些选项名称是为与旧版或更奇特的实现兼容而提供的。
它还提到:
grep 的行为受以下环境变量的影响。
POSIXLY_CORRECT
如果设置了此变量,grep 将按照 POSIX 要求运行;否则,grep 将更像其他 GNU 程序。POSIX 要求后面跟随文件名的选项必须被视为文件名;默认情况下,这些选项会被置于操作数列表的前面并被视为选项。此外,POSIXLY_CORRECT 禁用对无效括号表达式的特殊处理。请参见 invalid-bracket-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
无法识别长选项名称吗?
如果使用非 POSIX 的选项(例如 -C
),情况也是一样的:
$ POSIXLY_CORRECT=1 grep -C 2 '2' <<< "1
2
3"
1
2
3
在运行之前,同样需要执行set -o posix
。
grep
是一个外部程序,它并不属于 shell 的一部分。 - Barmargrep
是所有 Unix 用户都使用的软件工具,不仅限于程序员。程序员也使用ls
命令来列出包含源文件的目录,但这并不使其成为这里讨论的话题。 - Barmar