gpt4 book ai didi

bash - 为什么我们在某些 shell 命令中执行 '
转载 作者:行者123 更新时间:2023-11-29 08:57:22 24 4
gpt4 key购买 nike

最近一个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 信号,而实际上并没有提供任何实际数据来读取。

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

回答另一个OP的问题

那么如果我不发送 EOF 到 nc 会发生什么?我试过了,脚本也有效

没有什么是预期发生的。通过做 </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

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

24 4 0

Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com