在脚本中使用inotifywait -m而不创建额外的进程?

时间:2016-07-09 01:36:01

标签: linux bash process inotify

我不确定这是可能的,但我经常想到这一点,并且一些解决方案让我感到惊讶。是否可以在不创建两个进程的情况下创建以下脚本的等效项(在这种情况下,很明显,因为存在管道而创建了两个进程):

#!/bin/bash

EVENTS="CREATE,CLOSE_WRITE,DELETE,MODIFY,MOVED_FROM,MOVED_TO"
inotifywait -e "$EVENTS" -m -r ~/Desktop/testing | \
  while true; do
    read TMP
    echo "${TMP}" >> ~/Desktop/eventlog
  done

请注意,在while循环中我确实想要访问该事件。

在我看来,管道是必要的,因为我们需要用一个进程写入并从另一个进程读取。但也许存在一个伎俩?

2 个答案:

答案 0 :(得分:2)

bash 4.2中,您可以设置lastpipe选项以允许while循环在当前shell中运行,而不是单独的进程。

shopt -s lastpipe
inotifywait -e "$EVENTS" -m -r ~/Desktop/testing |
  while true; do
    read TMP
    echo "${TMP}" >> ~/Desktop/eventlog
  done

(在|之后,您不需要明确的续行,因为bash知道某行不能以该字符结尾。)

答案 1 :(得分:1)

假设您希望避免使用辅助脚本以便在循环完成后在for循环中修改的变量不会丢失它们是否正确?

在这种情况下你可以交换,所以像

   uploadTask.addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
                double progress = 100.0 * (taskSnapshot.getBytesTransferred() / taskSnapshot.getTotalByteCount());
                System.out.println("Upload is " + progress + "% done");
            int currentprogress = (int) progress;
                progressBar.setProgress(currentprogress);
            }
        }).addOnPausedListener(new OnPausedListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onPaused(UploadTask.TaskSnapshot taskSnapshot) {
                System.out.println("Upload is paused");
            }
        });

但是如果您担心代码流的灵活性 您可以重定向到文件句柄,然后随时从该句柄中读取 如果你想让我掏出例子,请在下面发表评论

如果还有其他内容 - 请详细说明您实际要做的事情