繁体   English   中英

“命令-v lftp> / dev / null 2>&1”的含义是什么?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM