/dev 错误中没有 null

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在其他人的系统上尝试了上述命令,它运行良好,没有产生我得到的错误。

hee*_*ayl 6

首先,重定向可以发生在命令行的任何地方,不一定在结尾或开头。

例如:

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内置或外置的可执行文件,bashkshdash没有内置和使用外部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)