wil*_*hil 2 server package-management command-line regex grep
我有几台 Ubuntu 服务器,有些行为让我很好奇。
在任何新安装的机器(Ubuntu Server 12.04.3 LTS)上,如果我运行:
echo "testbla123" | grep -P -o [0-9]*
Run Code Online (Sandbox Code Playgroud)
这将按123
预期返回。
在旧机器(Ubuntu Server 12.04.1 LTS)上,如果我运行相同的命令,我什么也得不到,我必须运行:
echo "testbla123" | grep -P -o "[0-9]*"
Run Code Online (Sandbox Code Playgroud)
执行之后apt-get upgrade
,它将在正则表达式周围不加引号的情况下执行。
Grep 在两台机器上的版本相同。我尝试比较更新前后的依赖关系一段时间,但运气不佳。
我想知道是否有人知道为什么会发生这种情况?
您可能有一个文件与[0-9]*
第二台机器上的 glob 模式匹配,而不是第一台机器上的。如果是这种情况,shell 会将 glob 扩展为文件名,然后将其作为参数传递给grep
.
如果当前目录上没有匹配的文件,shell 将保持 glob 模式不变并将其按原样传递给命令。
$ echo abc123 | grep -P -o [0-9]*
123
$ touch 234
$ echo abc123 | grep -P -o [0-9]* # shell runs grep -P -o 234
$ touch 123
$ echo abc123 | grep -P -o [0-9]* # shell runs grep -P -o 123 234
$ rm 234 123
$ touch 12
$ echo abc123 | grep -P -o [0-9]* # shell runs grep -P -o 12
12
$
Run Code Online (Sandbox Code Playgroud)
如果您不希望 shell 扩展包含 shell 通配符的参数,请始终引用它们。