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
Resposta
Na verdade, sua postagem contém 2 perguntas.
-
O sinalizador
-e
instrui o script a sair em caso de erro. Mais sinalizadoresSe houver um erro, ele será encerrado imediatamente.
-
O
$?
é o status de saída do último comando. No Linux, um status de saída de0
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 a0
. -
Se não “t descobrir que o status de saída será outra coisa (não
0
). Aqui, você desejará executar a parteecho "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 emset
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 “…
-e
na página de manual (realmente quero ver uma resposta para resolver isso).$?
contém o último código de saída (o doegrep
processo gerado acima).-e
está documentado emset
.if egrep -q "^username" /etc/passwd ; then echo "doesn't exist" ; fi
if
e[
. Este script não ' funcionou com-e
, porque segrep
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 eset -e
na linha 2?