如何首先执行部分语句

时间:2014-05-13 15:34:25

标签: bash

来自Powershell并试图弄清楚如何在bash中进行同等类型的操作。

有人可以告诉我该怎么做吗?我一直在研究,但没有运气

While **ls /etc/test | grep "test.conf" -q** -ne 0 ; do  
echo test  
sleep 2  
done

我试图先使用语句的粗体部分触发,以便可以评估生成的t / f。

2 个答案:

答案 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的原始答案)。


但是,更好的方法是要求操作系统告诉我们何时创建文件,而不必问两秒钟。你如何做到这一点必然是特定于操作系统的;我将以Linux为例。为此,您需要先安装inotify-tools包。

最简单的方法就是使用对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