Exit bash script on error in loop
Tony Arnold
tony.arnold at manchester.ac.uk
Thu Sep 12 23:03:47 UTC 2013
Johnny,
Do you just echo a percentage of progress number to the progress
process, i.e., a number between 0 and 100? Why not just echo 100 just
before the exit statement. Won't that kill the progress bar too? You
will need the --auto-close option, which you have anyway!
Just a thought.
Regards,
Tony.
On 12/09/13 22:40, Johnny Rosenberg wrote:
> Okay, now that I found that the pipe was causing the problem, I also
> found the answer: PIPESTATUS. See below…
>
>
> 2013/9/12 Johnny Rosenberg <gurus.knugum at gmail.com
> <mailto:gurus.knugum at gmail.com>>
>
> 2013/9/12 Tony Arnold <tony.arnold at manchester.ac.uk
> <mailto:tony.arnold at manchester.ac.uk>>
>
> Johnny,
>
> On 12/09/13 19:19, Johnny Rosenberg wrote:
> >
> > I can't make exit work as I thought it would work…
> >
> > #!/bin/bash
> >
> > Title="Error"
> > ERROR="Something bad happened."
> >
> > while [ something ]; do
> > if [[ something_bad ]]; then
> > yad --title "${Title}" \
> > --image=error \
> > --text "${ERROR}" \
> > --no-buttons \
> > --timeout 5 &
> > exit 1
> > fi
> > done
> > more_statements
> >
> > # End of code
> >
> > The problem is that even if something_bad happens,
> more_statements are
> > executed. The yad error messages is displayed as expected, though.
> >
> > (yad is a dialogue, similar to zenity, or even a zenity fork,
> I think –
> > yad=Yet Another Dialogue)
> >
> > So it seems like only the loop is exited when exit 1 is
> executed, not
> > the whole script. So how can I exit the whole script if
> something bad
> > happens inside a loop? I'd prefer a solution that doesn't make it
> > necessary to rewrite the script from scratch…
>
> Odd. The following works for me. I'm on 13.04. Cannot find yad
> in the
> repositories. Where did you get it from?
>
>
> I don't remember, but I think I compiled it from source.
>
>
> And are you definitely using
> bash for your script?
>
>
> I'm on Ubuntu 12.04 and I didn't change anything like that.
>
>
>
> #!/bin/bash
>
> i=4
> while [ "$i" -gt "0" ]; do
> echo "$i - Hello"
> if [ "$i" -eq "2" ]; then
> zenity --error --text "Oh no! i=3"
> exit 1
> fi
> let i=i-1
> done
> echo "Oops!"
>
>
>
> This one works for me too. I also replaced zenity with yad, and it
> still works.
>
> I did some more experiments and I found that it's my pipe to a yad
> progress bar that cause the problem. Unfortunately I didn't include
> it in my example, but here's another example, which I included in a
> reply to another reply:
>
> #!/bin/bash
>
> WaitTime=10
> TargetPath="This/path/does/not/exist"
>
> if [ ! -e "${TargetPath}" ]; then
> Time=0
> StartTime=$(date +%s%N)
>
> while [ ! -e "${TargetPath}" ]; do
> sleep .1
> Time=$(($(date +%s%N)-StartTime))
> if [[ Time -ge WaitTime*10**9 ]]; then
> yad --title "Folder missing" \
> --image=error \
> --text "Your device is not connected." \
> --no-buttons \
> --timeout 5
> exit 1
> fi
> echo "$((Time/10**7/WaitTime))"
> Seconds=$((WaitTime-Time/10**9))
> MM=$((Seconds/60))
> SS=$((Seconds-MM*60))
> echo \#$(printf "%s %d:%02d." "Time to connect your device:"
> "$MM" "$SS")
> done | \
> yad --progress \
> --title="Folder missing" \
> --image=time \
> --percentage=0 \
> --auto-close
> fi
>
>
> Now, it seems like I need to check for the pipe status, for instance:
> [[ PIPESTATUS[0] -ne 0 ]] && exit ${PIPESTATUS[0]}
>
> or
>
> [ ${PIPESTATUS[0]} -ne 0 ] && exit ${PIPESTATUS[0]}
>
> or
>
> [[ PIPESTATUS[0] != 0 ]] && exit ${PIPESTATUS[0]}
>
> or
>
> [[ PIPESTATUS[0] ]] && exit ${PIPESTATUS[0]}
>
> and so on…
>
> Thanks for replying and making me think in the right direction!
>
>
> Johnny Rosenberg
>
>
>
> yad --image="info" \
> --title="Another dialogue" \
> --text="You shouldn't see this dialogue"
>
> # End of code
>
> Remove the yad progress thing and it works. The problem is that I
> WANT the progress thing…
> So I guess the pipe is the problem here somehow, but how and what to
> do about it?
>
>
> Johnny Rosenberg
>
>
>
>
> Regards,
> Tony.
> --
> Tony Arnold, Tel: +44 (0) 161 275 6093
> <tel:%2B44%20%280%29%20161%20275%206093>
> Head of IT Security, Fax: +44 (0) 705 344 3082
> <tel:%2B44%20%280%29%20705%20344%203082>
> University of Manchester, Mob: +44 (0) 773 330 0039
> <tel:%2B44%20%280%29%20773%20330%200039>
> Manchester M13 9PL. Email:
> tony.arnold at manchester.ac.uk <mailto:tony.arnold at manchester.ac.uk>
>
> --
> ubuntu-users mailing list
> ubuntu-users at lists.ubuntu.com <mailto:ubuntu-users at lists.ubuntu.com>
> Modify settings or unsubscribe at:
> https://lists.ubuntu.com/mailman/listinfo/ubuntu-users
>
>
>
>
>
--
Tony Arnold, Tel: +44 (0) 161 275 6093
Head of IT Security, Fax: +44 (0) 705 344 3082
University of Manchester, Mob: +44 (0) 773 330 0039
Manchester M13 9PL. Email: tony.arnold at manchester.ac.uk
More information about the ubuntu-users
mailing list