Repeat terminal command until specified output
I would like to define an alias that performs a command every x seconds until an underlying process gives a designated output. Then, the command should stop being run.
Is this possible, and if so, how? Help is much appreciated.
I'm almost satisfied with
alias test1='while true; do <command>; sleep 1; done'
except I have to manually stop it, and can therefore not make it execute a new command once finished.
The reason for the question: Dropbox synchronizes poorly at work. Sometimes, I have to restart it. I would like to do that using a command which also tells when the sync is done, e.g. by
alias drop='dropbox stop && dropbox start && while true; do dropbox status; sleep 1; done'
I would like the repetition stopped when Dropbox outputs 'Up to date'.
Set a condition for the while loop
If you replace
while true
by:
while [ "$(dropbox status)" != "Up to date" ]
it works as you describe.
The command
To stop/start Dropbox
and finish after synchronizing is done becomes then:
dropbox stop && dropbox start && while [ "$(dropbox status)" != "Up to date" ]; do dropbox status; sleep 1; done
Or better (to prevent doubling dropbox status
):
dropbox stop && dropbox start && while [ "$(dropbox status)" != "Up to date" ]; do echo "Updating"; sleep 1 ; done && echo "Finished"
Explanation
while true
is waiting for a break condition inside the loop (which never comes), but while [ "$(dropbox status)" != "Up to date"
makes the loop break if dropbox status
returns Up to date
As Jacob says, use the condition on the loop. I suggest an until
loop:
dropbox stop && dropbox start &&
until dropbox status | grep -q "Up to date";
do
sleep 1;
done
until
runs until the command returns true, that's when dropbox status
output contains Up to date
.
Define it as a function in your $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
}
Now, I don't have dropbox
cmd app, so depending on the way it outputs status, you may or may not process it with AWK
or grep
.
But point being that you can either store output to value or redirect output to another command, and evaluate them. Once we get specific output string - break