Exit bash script on error in loop

Kevin O'Gorman kogorman at gmail.com
Fri Sep 13 18:05:31 UTC 2013


One way to handle errors in a pipeline is to use a global feature.  I
usually use a file for this.
The idea: get a temporary file name.  It can be in /tmp, or preferably
in a more local directory if one is obvious.  Maybe ~/tmp.
Make sure it does _not_ exist.
Have the bad thing in the pipe create the file.  In your case it's
pretty simple...
   yad yadda yadda
   touch $killfile
test for killfile when the pipe is done, and die if it exists (after
deleting it).


On Fri, Sep 13, 2013 at 10:04 AM, Johnny Rosenberg
<gurus.knugum at gmail.com> wrote:
> 2013/9/13 Tony Arnold <tony.arnold at manchester.ac.uk>
>>
>> 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.
>
>
> I probably don't understand what you mean, but I want the progress bar to be
> just that, a bar that show the progress smoothly. In this case, I give the
> user ${WaitTime} seconds to connect his device (or at least I do in the real
> code). The progress bar is supposed to illustrate how much time there is for
> the user to do that.
>
> I probably misunderstood the question completely, maybe because English is
> not my native language.
>
> Anyway, it seems like the problem is solved now anyway. Only details left
> now to make my script bug free… I'll look into it later this weekend.
>
>>
>> Won't that kill the progress bar too? You
>> will need the --auto-close option, which you have anyway!
>
>
> The progress bar was killed properly. The problem was that ”exit 1” didn't
> stop the script, so whatever I had after the loop was still executed.
>
>
> Johnny Rosenberg
>
>
>>
>>
>> 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
>>
>> --
>> ubuntu-users mailing list
>> ubuntu-users at lists.ubuntu.com
>> Modify settings or unsubscribe at:
>> https://lists.ubuntu.com/mailman/listinfo/ubuntu-users
>
>
>
> --
> ubuntu-users mailing list
> ubuntu-users at lists.ubuntu.com
> Modify settings or unsubscribe at:
> https://lists.ubuntu.com/mailman/listinfo/ubuntu-users
>



-- 
Kevin O'Gorman

programmer, n. an organism that transmutes caffeine into software.
Please consider the environment before printing this email.




More information about the ubuntu-users mailing list