Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何先执行部分语句_Bash - Fatal编程技术网

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

来自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

你真正需要的是

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。比手动轮询循环更好的方法。