为什么我们在某些shell命令中执行'</ dev/null'

Aus*_*sar 7 bash shell

shell构造最近困惑了我,之间的区别是什么

while ! nc -z $HOST $PORT >/dev/null 2>&1 < /dev/null; do 
Run Code Online (Sandbox Code Playgroud)

while ! nc -z $HOST $PORT >/dev/null 2>&1 ; do
Run Code Online (Sandbox Code Playgroud)

Ini*_*ian 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
Run Code Online (Sandbox Code Playgroud)

你可以认为这是非常直接的,没有任何预期会出错.但确实如此!

ssh将从标准输入读取.您已经read在文件上添加了一个带有输入重定向的命令,因此它也可以从标准输入读取.逻辑将被搞砸,因为在第一个read命令之后,ssh将最终吞下标准输入的其余部分,这在您的情况下是不希望的.

那么我们该怎么办?我们ssh通过这样做</dev/null来关闭标准输入

ssh "$server" "uname -a" < /dev/null
Run Code Online (Sandbox Code Playgroud)