如果文件存在,如何继续脚本?

时间:2013-09-19 11:23:17

标签: bash

如果文件存在,如何在脚本中继续?

#!/bin/bash
echo "Start"
# waiting to be exist file
echo "file already exists, continuing"

3 个答案:

答案 0 :(得分:4)

如果是while,请执行sleep X,以便每隔X秒检查一次该文件是否存在。

当文件存在时,while将完成,您将继续使用echo "file already exists, continuining"

#!/bin/bash
echo "Start"
### waiting to be exist file
while [ ! -f "/your/file" ]; # true if /your/file does not exist
do
  sleep 1
done
echo "file already exists, continuing"

  

而不是检查文件是否存在检查脚本   已经完成了背景?

根据您发布的代码,我做了一些更改以使其完全有效:

#!/bin/bash
(
sleep 5
) &

PID=$!
echo "the pid is $PID"

while [ ! -z "$(ps -ef | awk -v p=$PID '$2==p')" ]
do
  echo "still running"
  sleep 1
done

echo "done"

答案 1 :(得分:1)

有特定于操作系统的方法可以对文件系统执行阻塞等待。 Linux使用inotify(我忘了BSD等价物)。安装inotify-tools后,您可以编写类似于

的代码
#!/bin/bash
echo "Start"
inotifywait -e create $FILE & wait_pid=$!
if [[ -f $FILE ]]; then
    kill $wait_pid
else
    wait $wait_pid
fi
echo "file exists, continuing"

inotifywait的呼叫在收到操作系统已创建$FILE的通知后才会退出。


不简单地调用inotifywait并让它阻止的原因是存在竞争条件:当您测试它时该文件可能不存在,但可以在您开始观察创建之前创建它事件。为了解决这个问题,我们启动了一个等待创建文件的后台进程,然后检查它是否存在。如果是,我们可以杀死inotifywait并继续。如果没有,inotifywait已经在关注它,所以我们保证会看到它被创建,所以我们只需要wait来完成该过程。

答案 2 :(得分:0)

对于fedorqui:这样好吗?有问题吗?

#!/bin/bash
(
..
my code
..
) &

PID=$BASHPID or PID=$$

while [ ! ps -ef | grep $PID ]
do
  sleep 0
done

谢谢