Abh*_*ran 5 command-line shell
我执行了以下行:
which lsb_release 2&>1 /dev/null
Run Code Online (Sandbox Code Playgroud)
输出:
error: no null in /dev
Run Code Online (Sandbox Code Playgroud)
当我使用ls /dev/null命令验证错误时,null出现在/dev. 为什么会发生此错误?我无法破译这个问题。
更新
我只是which在其他人的系统上尝试了上述命令,它运行良好,没有产生我得到的错误。
首先,重定向可以发生在命令行的任何地方,不一定在结尾或开头。
例如:
echo foo >spamegg bar
Run Code Online (Sandbox Code Playgroud)
将保存foo bar在文件中spamegg。
此外,有两个版本which,一个是 shell 内置的,另一个是外部可执行文件(debianutils在 Debian 中附带)。
在您的命令中:
which lsb_release 2>&1 /dev/null
Run Code Online (Sandbox Code Playgroud)
by 2&>1,您将 STDERR (FD 2) 重定向到 STDOUT (FD 1) 指向的位置,而不是重定向到/dev/null,这是首先完成的。
所以剩下的命令是:
which lsb_release /dev/null
Run Code Online (Sandbox Code Playgroud)
由于没有类似的命令/dev/null,因此出现错误。
需要注意的是,这种行为取决于是否which是一个shell内置或外置的可执行文件,bash,ksh,dash没有内置和使用外部which,并且简单地忽略错误,不显示任何错误消息。
另一方面,zsh使用内置函数which并显示:
/dev/null not found
Run Code Online (Sandbox Code Playgroud)
因此,which您正在使用的 shell的内置程序可能会显示该特定错误。
此外,您似乎只想将 STDERR 重定向到/dev/null如果ielsb_release中不存在则显示错误。如果是这样,只需将 STDERR 重定向到:PATHwhich/dev/null
which lsb_release 2> /dev/null
Run Code Online (Sandbox Code Playgroud)