O que o -e faz em uma bash shebang?

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 correr sem o -e. O que -e faz por este script? Além disso, o que $? faz neste contexto?

Comentários

  • Odd. Não -e na página de manual (realmente quero ver uma resposta para resolver isso). $? contém o último código de saída (o do egrep processo gerado acima).
  • @pst: -e está documentado em set.
  • Você pode simplificar seu script fazendo isto: if egrep -q "^username" /etc/passwd ; then echo "doesn't exist" ; fi
  • Você ' está faltando um espaço entre if e [. Este script não ' funcionou com -e, porque se grep não ' não encontra nada, então em -e o script será encerrado ali mesmo. Sem -e, você ' recebeu a mensagem ao contrário: a status ($?) de 0 significa que grep encontrou o usuário. Observe que deve ser `grep ' ^ nome de usuário: ', a propósito (e se houver ' é outro usuário com um nome mais longo?).
  • #/bin/bash -e terá o mesmo efeito que #/bin/bash na linha 1 e set -e na linha 2?

Resposta

Na verdade, sua postagem contém 2 perguntas.

  1. O sinalizador -e instrui o script a sair em caso de erro. Mais sinalizadores

    Se houver um erro, ele será encerrado imediatamente.

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

Para aplicar essas respostas ao seu script:

egrep "^username" /etc/passwd >/dev/null 

procuraria o username no /etc/passwd arquivo.

  • Se o encontrar então o status de saída $? será igual a 0.

  • Se não “t descobrir que o status de saída será outra coisa (não 0). Aqui, você desejará executar a parte echo "doesn"t exist" do código.

Infelizmente há um erro em seu script, e você executaria esse código se o usuário existir – altere a linha para

if [ $? -ne 0 ] 

para obter a lógica certa.

No entanto, se o usuário não “t existir, egrep retornará um erro c ode, e devido à opção -e, o shell sairá imediatamente após essa linha, de modo que você nunca alcançaria essa parte do código.

Comentários

  • 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.
  • Por que não é set necessário? : – /
  • @pst: Porque -e é fornecido para bash como um argumento de linha de comando. Todas as opções listadas em set também são aceitas pelo bash em sua linha de comando – observe a primeira frase na seção Opções do manual página.

Resposta

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

 -e Exit immediately if a pipeline (which may consist of a single simple command), a subshell command enclosed in parentheses, or one of the commands executed as part of a command list enclosed by braces (see SHELL GRAMMAR above) exits with a non-zero status. 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 !. 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. 

Comentários

  • Ahh. Procurei no homem, mas após encontrar -e nos testes de arquivo e não -e sob os principais argumentos desisti. Bom trecho. Porém, por que não é necessário set? : – /

Resposta

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 

status de saída 0 – significa – tudo está OK, no caso de grep significa” OK, encontrei a string “. status de saída! = 0 significa que algo está errado, no caso de grep 1 significa “não encontrado”, 2 significa “não pode” abrir a entrada “…

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *