我不确定这是可能的,但我经常想到这一点,并且一些解决方案让我感到惊讶。是否可以在不创建两个进程的情况下创建以下脚本的等效项(在这种情况下,很明显,因为存在管道而创建了两个进程):
#!/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循环中我确实想要访问该事件。
在我看来,管道是必要的,因为我们需要用一个进程写入并从另一个进程读取。但也许存在一个伎俩?
答案 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");
}
});
但是如果您担心代码流的灵活性 您可以重定向到文件句柄,然后随时从该句柄中读取 如果你想让我掏出例子,请在下面发表评论
如果还有其他内容 - 请详细说明您实际要做的事情