Exit bash script on error in loop
Johnny Rosenberg
gurus.knugum at gmail.com
Thu Sep 12 21:40:39 UTC 2013
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>
> 2013/9/12 Tony Arnold <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
>> 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
>>
>> --
>> ubuntu-users mailing list
>> ubuntu-users at lists.ubuntu.com
>> Modify settings or unsubscribe at:
>> https://lists.ubuntu.com/mailman/listinfo/ubuntu-users
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.ubuntu.com/archives/ubuntu-users/attachments/20130912/198219a2/attachment.html>
More information about the ubuntu-users
mailing list