我想定义一个别名,每 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
}
现在,我没有dropbox
cmd 应用程序,因此根据它输出状态的方式,您可能会或可能不会使用AWK
或处理它grep
。
但重点是,你可以将输出存储为值,也可以将输出重定向到另一个命令,然后对其进行评估。一旦我们获得特定的输出字符串 - break