Bash:跳转到 while 循环的下一次迭代,而不等待循环中的命令退出

问题描述 投票:0回答:2

我正在尝试编写一个执行以下操作的小脚本:

  1. 启动 PDF 幻灯片查看器 impress!ve,它可以在幻灯片中逐页显示文件夹内的所有 PDF 文件。
  2. 观察文件夹的更改(添加或删除文件)。
  3. 更改后,重新启动查看器以获取修改后的文件夹内容。
  4. 继续观察文件夹中的更改。

到目前为止,它看起来像这样:

#!/bin/bash

TESTPATH="/some/path/"

while true; do
    inotifywait -m -e create,delete,moved_from -r "$TESTPATH" && \
        echo "DEBUG: Event detected!" && pkill -f /usr/bin/impressive || true && impressive -a 10 -w "$TESTPATH*.pdf"
done

但是我遇到了以下问题:一旦

impressive
第一次启动,它就会永久执行,并且循环被困在第一次迭代中,并且
inotifywait
不会继续监视,直到令人印象深刻为止亲手杀死的。我想在
while
启动后直接跳转到
impressive
循环的下一个迭代,而不是等待它退出。

我尝试在

nohup
调用前面放一个
impressive
,但这导致我的 RAM 一秒钟就满了,我的机器冻结了......

如何解决这个问题?

bash while-loop inotify detach
2个回答
0
投票

问题在于,immembly 在前台运行,阻止循环继续。如果你想让循环在启动immembrane后直接继续,你已经在后台启动immembrane了。 您可以通过在命令后添加 & 来做到这一点:

#!/bin/bash

TESTPATH="/some/path/"

while true; do

inotifywait -m -e create,delete,moved_from -r "$TESTPATH" &&
echo "DEBUG: Event detected!" && pkill -f /usr/bin/impressive || true && impressive -a 10 -w "$TESTPATH*.pdf" &
done

0
投票

您可能想要

impressive
命令异步运行。您知道可以将命令分组在大括号中吗?

#!/bin/bash

TESTPATH="/some/path/"

while true
do
    inotifywait -m -e create,delete,moved_from -r "$TESTPATH" && {
        echo "DEBUG: Event detected!"
        kill %
        impressive -a 10 -w "$TESTPATH"*.pdf &
    }
done

备注: 我将

kill
限制为上一次迭代的
impressive
过程,并将 glob 移出双引号(以使其扩展)

© www.soinside.com 2019 - 2024. All rights reserved.