shell构造最近困惑了我,
之间的区别是什么while ! nc -z $HOST $PORT >/dev/null 2>&1 < /dev/null; do
和
while ! nc -z $HOST $PORT >/dev/null 2>&1 ; do
答案 0 :(得分:7)
< /dev/null
的目的是在尝试从标准输入读取时立即将EOF发送到程序。它还意味着从接收来自任何其他来源的输入切断标准输入,例如终端
/dev/null
是Unix中的一种特殊设备,它会消耗写入的所有内容,但只要命令尝试从读取而没有实际提供任何实际信息,就会发出EOF信号要读取的数据。
重定向>/dev/null 2>&1
意味着将命令生成的所有标准输出重定向到它使用的空设备,并将所有错误流输出(2)重定向到控制台。
回答另一个OP的问题
预期什么都不会发生。通过</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