"!<" 是什么意思?

3
这个bash脚本中的!<是什么意思?为什么它指向一个不存在的文件?
bash -c 'while !</dev/tcp/db/5432; do sleep 1; done; npm start'

感谢您抽出时间阅读!


1
请注意,PostgreSQL附带了一个pg_isready命令,应该使用它来代替这种hack(不仅检查套接字是否可用,还检查数据库是否实际可用)。 - Charles Duffy
2个回答

5

你应该一起阅读紧随其后的文件 <。 语法 < file 打开文件的内容,以便让任何应用程序通过标准输入读取。

在你特定的语法 </dev/tcp/db/5432(远程主机上的tcp端口),这个结构仅仅是为了验证文件是否可用于打开以供读取。 如果文件可访问,则命令将返回成功的退出代码 0,如果文件不可访问,则 ! 否定所返回的退出代码。

因此,在你的示例中的while循环中,看到 while 1,如果文件可访问,则在shell上下文中意味着一个非零的退出代码返回,这根本不会让 sleep 发生。这并没有完全清楚你的意图是要睡觉直到文件可以打开还是相反。


5
我需要翻译的内容是:“我还要提一下,/dev/tcp/db/5432不是普通文件,而是远程主机db上的TCP端口。” - Dima Chubarov
我认为在!和<之间需要加一个空格,对吗? - Raman Sailopal

5

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

while ! false; do
    echo "inside while loop"
    sleep 1
done

由于!false始终为真,因此循环将永远进行。

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

if < /tmp/sample_file; then echo 'file exists'; fi

因此,您的代码将在循环中运行sleep 1,同时无法读取/dev/tcp/db/5432
现在考虑到/dev/tcp/是一个特殊的路径,访问/dev/tcp/db/5432意味着尝试通过TCP端口5432连接到主机db
因此,while循环背后的逻辑是“休眠直到主机db上的postgresql准备就绪”(5432是PostgreSQL的默认端口)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接