此命令的含义:command -v lftp> / dev / null 2>& 1

时间:2013-11-26 22:35:14

标签: linux bash

我有一个脚本,一段时间后会运行它,但我真的不明白它是如何工作的。我现在的理解是,如果命令失败,它将在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; }

3 个答案:

答案 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表示失败。