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
by:
it works as you describe.
The command
To stop/start
Dropbox
and finish after synchronizing is done becomes then:Or better (to prevent doubling
dropbox status
):Explanation
while true
is waiting for a break condition inside the loop (which never comes), butwhile [ "$(dropbox status)" != "Up to date"
makes the loop break ifdropbox status
returnsUp to date
As Jacob says, use the condition on the loop. I suggest an
until
loop:until
runs until the command returns true, that's whendropbox status
output containsUp to date
.Define it as a function in your
$HOME/.bashrc
Now, I don't have
dropbox
cmd app, so depending on the way it outputs status, you may or may not process it withAWK
orgrep
.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