我有一个脚本,一段时间后会运行它,但我真的不明白它是如何工作的。我现在的理解是,如果命令失败,它将在stderr中回显一些东西。但我尝试了“命令-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; }
答案 0 :(得分:1)
它在PATH上查找lftp
并抛弃它找到的位置和/或任何错误(它将它们发送到/dev/null
,这就像一个黑洞 - 数据进入它,没有任何错误永远离开它。)
然后,如果找不到它,它将显示错误消息并退出脚本,退出代码为1
。
答案 1 :(得分: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)
答案 2 :(得分:1)
command -v
是POSIX标准的方法,可以找出shell执行命令的操作。如果参数对应于可执行文件,它将打印出路径,并以成功状态退出。如果参数不是shell可以执行的,那么它将以失败退出。
由于用户对command -v
打印不感兴趣,stdout和stderr都被重定向到/dev/null
,这是通过首先将stdout重定向到/dev/null
,然后将stdout复制到>/dev/null 2>&1
来完成的。 stderr:command -v
之后,如果{}
完成的查找失败,则会执行一个列表(包含在||
中)。这是通过command -v
完成的,您可以将其视为左侧部分成功或执行右侧部分。
列表(如果>&2
失败则执行)会向stderr输出诊断消息,然后退出脚本失败:
exit 1
将stderr复制到stdout中,现在你写入stdout的所有内容都将转到stderr。
{{1}}以失败状态退出。 Shell使用0退出状态表示成功,而0表示失败。