这个bash脚本中的
!<
是什么意思?为什么它指向一个不存在的文件?bash -c 'while !</dev/tcp/db/5432; do sleep 1; done; npm start'
感谢您抽出时间阅读!
!<
是什么意思?为什么它指向一个不存在的文件?bash -c 'while !</dev/tcp/db/5432; do sleep 1; done; npm start'
感谢您抽出时间阅读!
你应该一起阅读紧随其后的文件 <
。 语法 < file
打开文件的内容,以便让任何应用程序通过标准输入读取。
在你特定的语法 </dev/tcp/db/5432
(远程主机上的tcp端口),这个结构仅仅是为了验证文件是否可用于打开以供读取。 如果文件可访问,则命令将返回成功的退出代码 0
,如果文件不可访问,则 !
否定所返回的退出代码。
因此,在你的示例中的while循环中,看到 while 1
,如果文件可访问,则在shell上下文中意味着一个非零的退出代码返回,这根本不会让 sleep 发生。这并没有完全清楚你的意图是要睡觉直到文件可以打开还是相反。
/dev/tcp/db/5432
不是普通文件,而是远程主机db
上的TCP端口。” - Dima Chubarov!
是一个否定运算符。
例如:
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
。
pg_isready
命令,应该使用它来代替这种hack(不仅检查套接字是否可用,还检查数据库是否实际可用)。 - Charles Duffy