为什么我们这样做'<的/ dev / null的'在某些shell命令中

时间:2018-05-10 07:37:35

标签: bash shell

shell构造最近困惑了我,

之间的区别是什么
while ! nc -z $HOST $PORT >/dev/null 2>&1 < /dev/null; do 

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

1 个答案:

答案 0 :(得分:7)

< /dev/null的目的是在尝试从标准输入读取时立即将EOF发送到程序。它还意味着从接收来自任何其他来源的输入切断标准输入,例如终端

/dev/null是Unix中的一种特殊设备,它会消耗写入的所有内容,但只要命令尝试读取而没有实际提供任何实际信息,就会发出EOF信号要读取的数据。

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

回答另一个OP的问题

那么如果我不向Ec发送EOF会怎样?我试过了,脚本也有用

预期什么都不会发生。通过</dev/null我们只是发信号通知nc不希望从标准输入中读取任何内容。

另一个为什么需要这个的经典示例是在使用ssh时如果错误地使用了while循环。考虑一个示例,如果您有一个包含服务器名称列表的文件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