[ipxe-devel] question about double amp
Michael Brown
mbrown at fensystems.co.uk
Sat Dec 11 14:10:41 UTC 2010
On Friday 10 Dec 2010 19:31:03 Duane Voth wrote:
> What should the double ampersand operator do in the following case?
>
> imgfetch ${uuid}/foo.bar && goto :have_foo_bar
> imgfetch foo.bar
>
> :have_foo_bar
>
> The goto only executes if the ${uuid}/foo.bar fetch succeeds, but the
> script aborts when this fetch fails. Is this the expected behavior?
Yes. As Thomas and Alessandro have said, either
imgfetch ${uuid}/foo.bar && goto have_foo_bar ||
imgfetch foo.bar
:have_foo_bar
or just
imgfetch ${uuid}/foo.bar || imgfetch foo.bar
would work.
The general principle is as follows:
In order to maintain backwards compatibility, any script line which produces
an overall failure result will cause the script to terminate.
The && and || operators are left-associative, as is the case in most (all?)
other languages that use them.
The empty command "" is deemed to be "do nothing, successfully", similar to
/bin/true.
Therefore, in the command
imgfetch ${uuid}/foo.bar && goto have_foo_bar
if the imgfetch fails, this will evaluate to
( failure && <not-executed> )
== failure
and so the script will terminate, whereas
imgfetch ${uuid}/foo.bar && goto have_foo_bar ||
would evaluate to
( ( failure && <not-executed> ) || success )
== ( failure || success )
== success
and so the script will continue executing.
Michael
More information about the ipxe-devel
mailing list