Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

112
Visualizações
bash set -e function with double pipes

Could someone explain this behaviour? It seems odd to me.

#!/bin/bash

set -e

_func() { 
  cat non-existant-file
  return 0
}

_func || echo "Not seen since _func returned zero"
_func
echo "Not seen since _func returned non-zero"

output (GNU bash, version 4.3.42(1)-release (x86_64-pc-linux-gnu) ):

$ bash func.sh 
cat: non-existant-file: No such file or directory
cat: non-existant-file: No such file or directory
$ 
over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

If you look at the manpage for bash, it specifically mentions this:

In particular The shell does not exit if the command that fails is part of [...] any command executed in a && or || list except the command following the final && or || [...]

This behaviour is exactly as documented/intended.

You can see this for yourself if you run something like this:

#!/bin/bash

set -ex
# set -x will tell you exactly where the shell exits.

_func() { 
  cat non-existant-file
  return 0
}

#_func || echo "Not seen since _func returned zero"
cat non-existant-file || _func
_func
echo "Not seen since _func returned non-zero"

From the manpage:

    set   -e      Exit immediately if a pipeline (which may consist  of  a
                  single  simple  command),  a list, or a compound command
                  (see SHELL GRAMMAR above),  exits with a  non-zero  sta‐
                  tus.   The shell does not exit if the command that fails
                  is part of the  command  list  immediately  following  a
                  while  or  until keyword, part of the test following the
                  if or elif reserved words, part of any command  executed
                  in  a  &&  or  ||  list except the command following the
                  final && or ||, any command in a pipeline but the  last,
                  or  if the command's return value is being inverted with
                  !.  If a compound command other than a subshell  returns
                  a  non-zero status because a command failed while -e was
                  being ignored, the shell does not exit.  A trap on  ERR,
                  if set, is executed before the shell exits.  This option
                  applies to the shell environment and each subshell envi‐
                  ronment  separately  (see  COMMAND EXECUTION ENVIRONMENT
                  above), and may cause subshells to exit before executing
                  all the commands in the subshell.

Which is exactly the case you have here.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda