Exceto pelo status geral de saída, ele age como:
if
! {
[ 1 -eq $1 ] && nocmd "yes"
}
then
echo no
fi
Em:
A || B
B
é executado se if A
falhar. Isso é um operador OR.
No seu caso A
é [ 1 -eq $1 ] && nocmd "yes"
onde nocmd
é executado se if [
for bem-sucedido (um operador AND). Nesse caso, o status de saída de A
será igual a nocmd
. Em outras palavras, echo no
será executado se [
ou nocmd "yes"
falhar (tendo em mente que nocmd
só será executado se [
for bem-sucedido).
Esses x && y || z
são hacks sujos. Eles são melhor evitados por essa mesma razão. Use uma construção if
/ then
/ else
se você quiser uma lógica if / then / else. Use x && y || z
somente se você quiser que z
seja a menos que ambos, x
e y
, tenham êxito.
Mesmo em:
cmd && echo OK || echo >&2 KO
O echo OK
pode falhar sob algumas condições patológicas (como o stdout indo para um arquivo em um sistema de arquivos completo), e echo >&2 KO
pode acabar sendo executado também.
$ bash -c 'true && echo OK || echo KO >&2' > /dev/full
bash: line 0: echo: write error: No space left on device
KO