O que o -e faz em uma festa de despedida?

32

Eu tenho um script bash com o seguinte:

#!/bin/bash -e

egrep "^username" /etc/passwd >/dev/null 
if[ $? -eq 0 ] 
then 
  echo "doesn't exist" 
fi

Este script não será executado sem o -e. O que -efaz para esse script? Além disso, o que faz $?neste contexto?

Chris Henry
fonte
1
Ímpar. Não -ena página do manual (eu realmente quero ver uma resposta abordando isso). $?contém o último código de saída (o do egrepprocesso gerado acima).
2
@pst: -eestá documentado em set.
Greg Hewgill
Você pode simplificar o seu roteiro, fazendo isso:if egrep -q "^username" /etc/passwd ; then echo "doesn't exist" ; fi
bollovan
2
Você está perdendo um espaço entre ife [. Este script não irá funcionar com -e , porque se grepnão encontrar nada, então sob -eo script será encerrado ali. Sem -e, você tem a mensagem ao contrário: um status ( $?) de 0 significa que o grep encontrou o usuário. Note que este deve ser `grep '^ username:', a propósito (e se houver outro usuário com um nome mais longo?).
Gilles 'SO- stop be evil'
3
Terá #/bin/bash -eo mesmo efeito que #/bin/bashna linha 1 e set -ena linha 2?
blong 30/05

Respostas:

34

Erro ao sair. Mais bandeiras

Se houver um erro, ele sairá imediatamente.

O $? é o status de saída do comando passado. No Linux, um status de saída 0 significa que o comando foi bem-sucedido. Qualquer outro status significaria um erro.

egrep "^ nome de usuário" / etc / passwd> / dev / null Procuraria o nome de usuário no arquivo / etc / passwd. Se encontrar, o status de saída $? será igual a 0. Se não o encontrar, o status de saída será outra coisa (não 0), portanto, "o eco não existe".


fonte
Além disso, você pode fazer o script funcionar corretamente sem o -e substituindo as duas primeiras linhas por if egrep "^username" /etc/passwd >/dev/null.
1
Por que não é setnecessário? : - /
1
@ pst: Porque o -eé dado ao bash como um argumento de linha de comando. Todas as opções listadas em settambém são aceitas pelo bash em sua linha de comando - observe a primeira frase na seção Opções da página de manual.
grawity
14

Todas as opções de linha de comando do bash estão documentadas man bash.

      -e Saia imediatamente se um pipeline (que pode consistir em um
              único comando simples), um comando subshell incluído em
              parênteses ou um dos comandos executados como parte do
              uma lista de comandos entre chaves (consulte SHELL GRAMMAR
              acima) sai com um status diferente de zero. O shell não
              sair se o comando que falhar fizer parte do comando
              lista imediatamente após um tempo ou até a palavra-chave,
              parte do teste após a reserva if ou elif
              palavras, parte de qualquer comando executado em um && ou || Lista
              exceto o comando após o final && ou ||, qualquer
              comando em um pipeline, mas o último, ou se o comando
              O valor de retorno está sendo invertido com! Uma armadilha no ERR,
              se definido, é executado antes da saída do shell. Esta opção
              aplica-se ao ambiente shell e a cada ambiente subshell
              ambiente separadamente (consulte AMBIENTE DE EXECUÇÃO DE COMANDO
              acima) e pode causar a subcamada antes de executar
              todos os comandos no subshell.
Greg Hewgill
fonte
2
Ahh Procurei no homem, mas depois de encontrar -e nos testes de arquivo e não -e nos principais argumentos que desisti. Belo trecho. Por que não é setnecessário? : - /
1

Seu script está incorreto, porque

egrep "^username" /etc/passwd >/dev/null 
if[ $? -eq 0 ] 
then 
  #echo "doesn't exist" # WRONG
  echo "the USER EXISTS"
fi

exit status 0 - mean - tudo está OK, no caso do grep significa "OK, encontrou a string". status de saída! = 0 significa que algo está errado, no caso do grep 1 significa "não encontrado", 2 significa "não é possível abrir a entrada" ...

jm666
fonte