Como configurar a variável para a saída de um comando em um script bash, sem a saída do comando mostrando no terminal?

0

Tentando executar o seguinte script:

echo "Is autofs Enabled?"
cmd='systemctl is-enabled autofs'
echo $cmd
if [[ $cmd = "enabled" ]]; then
echo "Yes autofs is enabled"
elif [[ $cmd = "disabled" ]]; then
echo "No autofs is disabled"
else echo "Autofs not found"
fi

Se o autofs não estiver instalado, o script resultará em:

Failed to issue method call: No such file or directory
Autofs not found

Saída esperada do script se o autofs não estiver instalado:

Autofs not found

Como altero o script para não imprimir "Falha ao emitir chamada de método: Nenhum arquivo ou diretório"?

Editar: Obrigado a todos. As respostas eram exatamente o que eu estava procurando.

    
por REDBEAN 31.10.2017 / 04:13

2 respostas

0

Você pode examinar a mensagem (stdout) produzida por systemctl , bem como seu status de saída (o último por meio da variável $? shell). A mensagem de erro que você procura evitar é entregue ao stderr, então você precisa redirecionar esse fluxo se quiser suprimi-lo. Status de saída diferente de zero pode indicar que o dispositivo não foi encontrado ou que foi desativado (consulte o manual para mais informações).

#!/bin/bash -l    
service=$1
echo "Is $service enabled?"
msg=$(systemctl is-enabled "$service" 2>/dev/null) # capture message
res=$? # capture exit code

if [ -z "$msg" ]; then  # message is empty if service not found
  echo "$service not found"
else  # service could be enabled, disabled, static, etc.
  if [ "$res" -eq 0 ]; then # enabled
    echo "Yes $service is enabled: $msg"
  else
    echo "No, $service is disabled"
  fi
fi

Salvando esse script como tmp.sh, você pode testar com várias entradas:

$ ./tmp.sh autofs
    Is autofs enabled?
    Autofs not found
$ ./tmp.sh anacron.timer
    Is anacron.timer enabled?
    Yes anacron.timer is enabled: enabled
$ ./tmp.sh runlevel6.target
    Is runlevel6.target enabled?
    No, runlevel6.target is disabled

Devido à variedade de outros casos, talvez seja melhor usar uma instrução case para um tratamento mais detalhado do status, por exemplo,

case "$msg" in
    enabled*)  echo "Yes $service is enabled" ;;
    disabled) echo "No, $service is disabled" ;;
    linked*) # etc..
    ;;
    static*) # etc..
    ;;
esac
    
por 31.10.2017 / 04:39
0

Que tal redirecionar stderr para /dev/null ?

[ $(systemctl is-enabled autos 2>/dev/null) = “enabled” ] && echo true || echo false

Em uma nota lateral usando backticks enquanto atribuindo a saída a uma variável é o menor denominador comum para portabilidade de shell, os shells modernos recomendam a migração para a atribuição de variáveis de comandos para $()

    
por 31.10.2017 / 05:13