重复终端命令直到指定输出

Ras*_*mus 12 command-line bash dropbox

我想定义一个别名,每 x 秒执行一个命令,直到底层进程给出指定的输出。然后,该命令应该停止运行。

这是可能的,如果是,如何?非常感谢帮助。

我几乎满意

alias test1='while true; do <command>; sleep 1; done'
Run Code Online (Sandbox Code Playgroud)

除了我必须手动停止它,因此一旦完成就不能让它执行新命令。

问题的原因: Dropbox 在工作中同步很差。有时,我必须重新启动它。我想使用一个命令来做到这一点,该命令也告诉同步何时完成,例如

alias drop='dropbox stop && dropbox start && while true; do dropbox status; sleep 1; done'
Run Code Online (Sandbox Code Playgroud)

我希望在 Dropbox 输出“最新”时停止重复。

Jac*_*ijm 14

为 while 循环设置条件

如果你更换

while true
Run Code Online (Sandbox Code Playgroud)

经过:

while [ "$(dropbox status)" != "Up to date" ]
Run Code Online (Sandbox Code Playgroud)

它像你描述的那样工作。

命令

Dropbox同步完成后停止/启动和完成变为:

dropbox stop && dropbox start && while  [ "$(dropbox status)" != "Up to date" ]; do dropbox status; sleep 1; done
Run Code Online (Sandbox Code Playgroud)

或者更好(以防止加倍dropbox status):

dropbox stop && dropbox start && while  [ "$(dropbox status)" != "Up to date" ]; do echo "Updating"; sleep 1 ; done && echo "Finished"
Run Code Online (Sandbox Code Playgroud)

解释

while true正在等待循环内的中断条件(永远不会出现),但如果返回while [ "$(dropbox status)" != "Up to date"使循环中断 dropbox statusUp to date

  • @Rasmus 如果它有效,总是很高兴:) (2认同)

mur*_*uru 6

正如雅各布所说,在循环中使用条件。我建议一个until循环:

dropbox stop && dropbox start && 
until dropbox status | grep -q "Up to date";
do 
  sleep 1; 
done
Run Code Online (Sandbox Code Playgroud)

until运行直到命令返回 true,即dropbox status输出包含Up to date.

  • @Rasmus 肯定。:) 请注意:您可以使用相同的测试 `[ "$(dropbox status)" != "Up to date" ]` 和 `until` - 只需将 `!=` 替换为 `=`。本质上,“直到”是“同时”与参与。 (2认同)