![](/img/trans.png)
[英]What does “< /dev/null >& /dev/null” at the end of a command do?
[英]What is the meaning of “command -v lftp >/dev/null 2>&1”?
我有一个脚本,将在一段时间后运行它,但是我不太了解它是如何工作的。 我现在的理解是,如果command
失败,它将在stderr中回显某些内容,但是我尝试了
command -v lftp >/dev/null 2>&1
即使安装了lftp
,它也不会输出任何内容。 有人可以解释一下这行到底是什么吗?
# check lftp is installed
command -v lftp >/dev/null 2>&1 || {
echo >&2 "lftp is required. Please install it. Aborting."
exit 1
}
它在PATH上查找lftp
并丢弃找到的位置和/或任何错误(它将它们发送到/dev/null
,这就像一个黑洞-数据进入了它,什么也没留下)。
然后,如果找不到它,它将显示错误消息并以退出代码1
退出脚本。
> / dev / null将命令的标准输出(文件描述符1)发送到空设备(这会将所有输出丢弃),然后2>&1将文件描述符2(标准错误)附加到与文件描述符相同的位置1(这是空设备)。
这只是丢弃所有输出的标准方法。 以下将具有相同的效果:
... 2> /dev/null 1>&2
请注意,顺序很重要,因此:
2>&1 > /dev/null
不会有相同的效果; 您将丢弃标准输出,但将标准错误附加到标准输出的文件描述符中。
需要了解的所有事情是,在Unix中,默认情况下,程序启动时会打开三个文件描述符:0 =标准输入(stdin或C ++,cin)1 =标准输出(stdout或C ++) ,cout)2 =标准错误(stderr或C ++中的cerr)
command -v
是POSIX标准的方法,用于找出Shell将执行命令的方式。 如果参数对应于可执行文件,它将打印出路径,并以成功状态退出。 如果自变量不是shell可以执行的参数,它将失败退出。
由于用户对command -v
打印的command -v
不感兴趣,因此将stdout和stderr都重定向到/dev/null
,方法是先将stdout重定向到/dev/null
,然后将stdout复制到stderr中: >/dev/null 2>&1
此后,如果由command -v
完成的查找失败,将执行一个列表(用{}
括起来)。 这是用||
完成的 ,您可以在左边部分成功或执行右边部分时阅读 。
该列表(如果command -v
失败,将执行该列表)将向stderr输出诊断消息,然后以失败退出脚本:
>&2
将stderr复制到stdout,现在您写到stdout的所有内容都将返回到原来只是stderr的位置。 exit 1
以失败状态退出。 Shell使用0退出状态表示成功,而不使用0表示失败。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.