[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Exit-on-error option does not work as expected
From: |
mod . bashbug . 2007-07-16 |
Subject: |
Exit-on-error option does not work as expected |
Date: |
Mon, 16 Jul 2007 01:56:17 -0700 (PDT) |
User-agent: |
SquirrelMail/1.4.6 |
Configuration Information [Automatically generated, do not change]:
Machine: i386
OS: linux-gnu
Compiler: i386-redhat-linux-gcc
Compilation CFLAGS: -DPROGRAM='bash' -DCONF_HOSTTYPE='i386'
-DCONF_OSTYPE='linux-gnu' -DCONF_MACHTYPE='i386-redhat-linux-gnu'
-DCONF_VENDOR='redhat' -DLOCALEDIR='/usr/share/locale' -DPACKAGE='bash'
-DSHELL -DHAVE_CONFIG_H -I. -I. -I./include -I./lib -D_FILE_OFFSET_BITS=64
-O2 -g -pipe -m32 -march=i386 -mtune=pentium4
uname output: Linux hummer.3amok 2.6.12-1.1381_FC3smp #1 SMP Fri Oct 21
04:03:26 EDT 2005 i686 i686 i386 GNU/Linux
Machine Type: i386-redhat-linux-gnu
Bash Version: 3.0
Patch Level: 14
Release Status: release
Description:
The attached script (below) sets the 'exit-on-error' option,
in order to prevent deletion of an item if the archiving command
fails.
However, Bash fails to stop the script when an error occurs,
and the item is deleted anyway, which is very unfortunate :(
The Bash Reference Manual vaguely refers to '&&' when defining
the '-e' option:
"Exit immediately if a simple command exits with a non-zero status,
unless the command that fails is part of an until or while loop,
part of an if statement, part of a && or || list..."
*Vaguely*, because it does not specify what is means to the "part
of a && list." The && list is defined as:
"command1 && command2: command2 is executed if, and only if,
command1 returns an exit status of zero."
Unfortunately, when "&& list" and "set -e" are used together as in
the attached script, they effectively cancel each other out, and
result in a non-robust script, which doesn't handle errors.
The claim:
My claim is that in the attached script, the 'false' command should
*not* be considered to be a part of the && list. It is a part of
function 'archive_item', which is a part of the script. The behavior
of 'archive_item' should not change depending on the context, in which
it is invoked from.
Script:
#! /bin/bash
set -e
archive_item()
{
set -e
false # this is the command that fails to archive the item
echo 'Archived.'
}
delete_item()
{
true # this is the command that deletes the item
echo 'Deleted!'
}
archive_item && delete_item
Expected output:
<empty>
Actual output:
Archived.
Deleted!
- Exit-on-error option does not work as expected,
mod . bashbug . 2007-07-16 <=