来自Powershell并试图弄清楚如何在bash中进行同等类型的操作。
有人可以告诉我该怎么做吗?我一直在研究,但没有运气
While **ls /etc/test | grep "test.conf" -q** -ne 0 ; do
echo test
sleep 2
done
我试图先使用语句的粗体部分触发,以便可以评估生成的t / f。
答案 0 :(得分:3)
你真正需要的是
until [ -f "/etc/test/test.conf" ] ; do
echo test
sleep 2
done
答案 1 :(得分:2)
您问题的直接解决方案是grep
的{{1}}退出状态是while
唯一需要的退出状态:
while ! ls /etc/test | grep -q "test.conf"; do
还有until
循环来处理你的否定:
until ls /etc/test | grep -q "test.conf"; do
但是,这是一个脆弱的(在文件名包含换行符的情况下ls
中断)并且价格昂贵(创建多个额外进程)。相反,让shell直接检查是否存在所需文件:
until [[ -f "/etc/test/test.conf" ]]; do
(我们到达@ anishane的原始答案)。
最简单的方法就是使用对inotifywait的调用:
inotifywait -c create /etc/test/test.conf
但是如果文件已经存在,你将永远等待它的创建。您可能会想,“我会检查它是否存在,然后在必要时等待”,
[[ -f /etc/test/test.conf ]] || inotifywait -c create /etc/test/test.conf
但是现在我们有一个竞争条件:文件可能是在你找到之后创建的,但是在你开始等待之前。因此,完整的解决方案是首先等待它在后台创建,然后如果文件存在则终止后台作业,然后等待后台完成(如果它仍在运行)。这听起来有点复杂,但效率很高,而且很有效。
inotifywait -c create /etc/test/test.conf & WAIT_PID=$!
[[ -f /etc/test/test.conf ]] && kill $WAIT_PID
wait $WAIT_PID