!< 是什么意思?

Pet*_*nko 3 bash

!<在这个 bash 脚本中是什么意思,为什么它指向不存在的文件?

bash -c 'while !</dev/tcp/db/5432; do sleep 1; done; npm start'
Run Code Online (Sandbox Code Playgroud)

在此先感谢您的时间!

Ini*_*ian 5

您应该将其与<. 该语法< file打开文件内容以进行输入重定向,以便任何应用程序读取标准输入。

在您的特定语法</dev/tcp/db/5432(远程主机上的 tcp 端口)中,定义该构造只是为了验证文件是否可以打开以供读取。该命令将返回成功的退出代码0,如果文件可访问并!否定返回的退出代码。

所以基本上你的例子中的 while 循环, sees while 1,如果文件可访问,这在shell上下文中意味着非零退出代码返回,这根本不会让睡眠发生。不完全清楚您的意图是在文件可​​以打开之前休眠还是以其他方式。

  • 我还要提到`/dev/tcp/db/5432`不是一个普通文件,而是一个名为`db`的远程主机上的tcp端口。 (5认同)

Val*_*nov 5

!是一个否定运算符。例子:

while ! false; do
    echo "inside while loop"
    sleep 1
done
Run Code Online (Sandbox Code Playgroud)

将永远在循环内,因为! false它始终为真。

<是另一个运营商。它告诉 bash 读取指定的文件。如果文件存在且可读,它将成功(返回零退出代码)。没有左操作数,读取结果将被丢弃。示例:检查是否/tmp/sample_file存在:

if < /tmp/sample_file; then echo 'file exists'; fi
Run Code Online (Sandbox Code Playgroud)

因此,您的代码将sleep 1在循环中运行而/dev/tcp/db/5432无法读取。

现在考虑到这/dev/tcp/是一条特殊路径,访问/dev/tcp/db/5432意味着尝试db通过 TCP 端口 5432连接到主机。

因此,while 循环背后的逻辑是“休眠,直到主机 db 上的 postgresql 准备就绪”(5432 是 PostgreSQL 的默认端口)。