我执行了以下行:
which lsb_release 2&>1 /dev/null
输出:
error: no null in /dev
当我使用命令验证错误时ls /dev/null
,null
存在于/dev
.为什么会出现这个错误?我无法破译这个问题。
更新
我刚刚which
在别人的系统上尝试了上面的命令,它运行得很好,没有产生我得到的错误。
答案1
首先,重定向可以发生在命令行中的任何位置,不一定是在末尾或开头。
例如:
echo foo >spamegg bar
将保存foo bar
在文件中spamegg
。
另外,有两个版本which
,一个是内置的 shell,另一个是外部可执行文件(debianutils
Debian 中附带)。
在你的命令下:
which lsb_release 2>&1 /dev/null
通过2&>1
,您将 STDERR (FD 2) 重定向到 STDOUT (FD 1) 指向的位置,而不是重定向到,/dev/null
这是首先完成的。
所以剩下的命令是:
which lsb_release /dev/null
由于没有类似的命令/dev/null
,因此出现错误。
请注意,此行为取决于which
shell 是内置的还是外部可执行文件,bash
没有内置的并使用外部的ksh
,并且只是忽略错误,不显示任何错误消息。dash
which
另一方面,zsh
使用内置which
并显示:
/dev/null not found
which
因此,据推测,该特定错误是由您正在使用的 shell 的内置命令显示的。
另外,您似乎只想将 STDERR 重定向到/dev/null
如果ielsb_release
中不存在则显示错误。如果是这样,只需将 STDERR 重定向到:PATH
which
/dev/null
which lsb_release 2> /dev/null
答案2
命令的语法which lsb_release 2&>1 /dev/null
错误。
您可能打算which lsb_release 2> /dev/null
假设您正在运行“sh”类型的 shell 来运行。
如果您正在运行csh
shell 类型,那么您在 stderr 重定向方面会遇到更多问题。