Bash 如何先执行部分语句
来自Powershell并试图找出如何在bash中执行类似的操作 有人能告诉我怎么做吗?我已经研究了一段时间,运气不好Bash 如何先执行部分语句,bash,Bash,来自Powershell并试图找出如何在bash中执行类似的操作 有人能告诉我怎么做吗?我已经研究了一段时间,运气不好 While **ls /etc/test | grep "test.conf" -q** -ne 0 ; do echo test sleep 2 done 我试图首先触发语句的粗体部分,以便计算得到的t/f。您真正需要的是 until [ -f "/etc/test/test.conf" ] ; do echo test sleep 2 done
While **ls /etc/test | grep "test.conf" -q** -ne 0 ; do
echo test
sleep 2
done
我试图首先触发语句的粗体部分,以便计算得到的t/f。您真正需要的是
until [ -f "/etc/test/test.conf" ] ; do
echo test
sleep 2
done
你真正需要的是
until [ -f "/etc/test/test.conf" ] ; do
echo test
sleep 2
done
您的问题的直接解决方案是
grep
的(否定的)退出状态是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为例。为此,您需要首先安装软件包 最简单的方法就是调用inotifywait:
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
您的问题的直接解决方案是
grep
的(否定的)退出状态是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为例。为此,您需要首先安装软件包 最简单的方法就是调用inotifywait:
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
你到底想在这里干什么?您正在列出/etc/test中的所有文件,并搜索
ls
命令的输出。这是一个典型的例子……您到底想在这里做什么?您将列出/etc/test中的所有文件,并搜索ls
命令的输出。这是…+1的典型示例。或者更好的方法是,使用inotify
(或操作系统提供的任何等效工具)进行阻止,直到通知创建了/etc/test/test.conf
。谢谢,您能解释一下这里发生了什么吗?特别是“-f”和括号?[-f”/etc/test/test.conf“]+1。或者更好的方法是,使用inotify
(或操作系统提供的任何等效工具)进行阻止,直到通知创建了/etc/test/test.conf
。谢谢,您能解释一下这里发生了什么吗?特别是“-f”和括号?[-f”/etc/test/test.conf“]感谢您的详细回复。很高兴了解inotify。inotifywait
建议+1。比手动轮询循环更好的方法。感谢您的详细回复。很高兴了解inotify。inotifywait
建议+1。比手动轮询循环更好的方法。