最近有一个shell构造使我感到困惑,两者之间有什么区别

while ! nc -z $HOST $PORT >/dev/null 2>&1 < /dev/null; do


while ! nc -z $HOST $PORT >/dev/null 2>&1 ; do

最佳答案

< /dev/null的目的是在尝试从标准输入中读取时立即将EOF发送到程序。这也意味着标准输入被从接收到的任何其他来源的输入中切断,例如:终端。
/dev/null是Unix中的一种特殊设备,它消耗写入其中的所有内容,但只要命令试图从中读取EOF而没有实际提供要读取的实际数据,就会发出EOF信号。

重定向>/dev/null 2>&1意味着将命令产生的所有标准输出重定向到它使用的空设备,并将所有错误流output(2)重定向到控制台。

回答另一个OP的问题

那么,如果我不将EOF发送给nc,会发生什么情况?我尝试过,脚本也有效

预计什么都不会发生。通过执行</dev/null,我们只发出nc信号就不会期望从标准输入中读取任何内容。

另一个为什么需要这样做的经典示例是在不正确地与while循环一起使用ssh时。考虑一个示例,如果您有一个包含服务器名称列表的servers.txt文件,并且想对所有主机通过ssh进行操作。你会做类似的事情

while read -r server; do
    ssh "$server" "uname -a"
done < servers.txt

您可能会认为这很简单,不会出现任何错误。但是可以!
ssh将从标准输入中读取。您已经添加了read命令,并在文件上进行了输入重定向,因此它也从标准输入中读取。逻辑会搞砸,因为在执行第一个read命令后,ssh最终会吞下标准输入的其余部分,这在您的情况下是不希望的。

那么我们该怎么办?我们通过执行ssh来关闭</dev/null的标准输入
ssh "$server" "uname -a" < /dev/null

关于bash - 为什么我们在某些shell命令中执行 '</dev/null',我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50267921/

10-16 21:43