为什么sudo在while循环中使用时会将阻塞命令更改为非阻塞命令?

时间:2012-12-28 11:56:41

标签: bash while-loop rsync sudo inotify

或者:如何防止sudo'ed rsync在while循环中无限激发? 因为这就是(感觉)正在发生的事情,而我却没有得到它。

我正在尝试设置一个用于同步修改过的文件的手表,它运行正常。但是,一旦我向sudo命令引入了必需的rsync,单个inotify事件会导致rsync命令无限期地触发。

#!/usr/bin/env bash
inotifywait -m -r --format '%w%f' -e modify -e move -e create -e delete /var/test | while read line; do
    sudo rsync -ah --del --progress --stats --update "$line" "/home/test/" 
done

编辑文件时,rsync进入快速点火模式。但是丢失sudo(并使用你有权限的文件夹),脚本按预期工作。

  1. 这是为什么?
  2. 如何使用sudo命令使其正常工作?

1 个答案:

答案 0 :(得分:1)

我有答案,通过实验找到它。但我不知道为什么会这样。请有人告诉我为什么此循环中的sudo会破坏预期的阻止行为。

由于sudo打破了脚本,我们可以使用包装器与sudo保持距离:
这是正确的:

inotifywait -m -r --format '%w%f' -e modify /var/test | while read line; do
    sh -c 'sudo rsync -ah "$line" "/home/test/"'
done

奇怪的是:将sudo从包装中拉出来,我们又有了旧的错误行为。很奇怪。
这是错误的:

inotifywait -m -r --format '%w%f' -e modify /var/test | while read line; do
    sudo sh -c 'rsync -ah "$line" "/home/test/"'
done