bash: “set -e” e verifique se um usuário existe faça o script sair

3

Estou escrevendo um script para instalar um programa com o Bash. Quero sair com erro, por isso adicionei set -e ao início do meu script.

Eu tenho que verificar se um usuário existe dentro do meu script. Para fazer isso, estou usando grep ^${USER}: /etc/passwd . Se o usuário existir, o script será executado normalmente. No entanto, se o usuário não existir, esse comando será encerrado. Eu não quero sair caso o último caso ocorra. Em vez disso, quero criar o usuário e continuar minha instalação.

Qual é a solução para continuar meu script? Tentei redirecionar a saída de grep para uma variável, mas ainda tenho o mesmo problema.

    
por Ahmed Laatabi 05.04.2012 / 18:34

4 respostas

7

Você sempre pode fazer algo como abaixo. Basicamente, desabilitando a verificação de saída ao redor do comando que você está executando.

#!/bin/bash
set -e # eanble exit checking
lorem ipsum 
dolor sit amet
# temp disable exit checking
set +e
grep "^${USER}:" /etc/passwd
set -e
consectetur adipiscing elit
    
por 05.04.2012 / 18:40
5

Além das sugestões já fornecidas, aqui estão mais duas opções. Primeiro, você pode fornecer um comando alternativo que garantirá o sucesso:

grep "^${USER}:" /etc/passwd || true

(Basicamente, se o comando grep falhar, isso será executado true e, como isso sempre é bem-sucedido, ele considerará o comando composto bem-sucedido e não sairá do script.)

Como seu interesse é saber se o grep é bem-sucedido (ou seja, se você precisa adicionar o usuário), use-o como a condição em uma instrução if :

if ! grep "^${USER}:" /etc/passwd; then
    # Create the user account
fi
# Continue installation...

(Observe que o comando ! before the grep nega o teste, portanto, ele executa o corpo da instrução if somente se grep falhar. Como grep faz parte de um comando composto, o script não não saia se falhar.)

    
por 05.04.2012 / 21:29
4

A solução é não usar set -e , o que pode ser bastante perigoso. Use instruções if se for apropriado.

grep "^${USER}:" /etc/passwd &>/dev/null
if [ $? -eq 1 ]
then
    #create user here ...
ft
    
por 05.04.2012 / 18:42
1

uma sugestão é executar essa verificação e instalar em uma subshell dentro de (). isso funcionaria para você?

    
por 05.04.2012 / 18:45