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

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

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

这可能吗?如果可以,怎么做?非常感谢您的帮助。

我几乎满意

alias test1='while true; do <command>; sleep 1; done'

除非我必须手动停止它,因此无法让它在完成后执行新命令。

提问的原因: Dropbox 在工作时同步效果不佳。有时,我必须重新启动它。我想使用一个命令来做到这一点,该命令还会告诉同步何时完成,例如

alias drop='dropbox stop && dropbox start && while true; do dropbox status; sleep 1; done'

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

答案1

设置 while 循环的条件

如果你更换

while true

经过:

while [ "$(dropbox status)" != "Up to date" ]

它按照您描述的方式工作。

命令

同步完成后停止/启动Dropbox和结束如下:

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

或更好(为了防止重复dropbox status):

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

解释

while true在循环内等待中断条件(永远不会发生),但while [ "$(dropbox status)" != "Up to date"导致循环中断如果 dropbox status返回Up to date

答案2

正如 Jacob 所说,在循环中使用条件。我建议使用until循环:

dropbox stop && dropbox start && 
until dropbox status | grep -q "Up to date";
do 
  sleep 1; 
done

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

答案3

将其定义为您的$HOME/.bashrc

syncDropBox()
{
dropbox stop && \
dropbox start && 
while true; 
do 
  STAT="$(dropbox status)"
  if [ "$STAT" = "Up to date"  ] ; then
  break # or add more commands to finilize the process
  fi
  sleep 1; 
done
}

现在,我没有dropboxcmd 应用程序,因此根据它输出状态的方式,您可能会或可能不会使用AWK或处理它grep

但重点是,你可以将输出存储为值,也可以将输出重定向到另一个命令,然后对其进行评估。一旦我们获得特定的输出字符串 - break

相关内容