Simultaneamente, verifique se há saída vazia e status de saída bem-sucedido

4

Eu gostaria de escrever o seguinte teste em um script de instalação 1 :

if [ -n "'/etc/grub.d/30_os-prober'" ]; then
    install_dual_boot
else
    install_linux_only
fi

No entanto, também é possível que 30_os-prober não produza saída porque, de alguma forma, não foi possível concluir. Se 30_os-prober falhar com um status de saída diferente de zero, seria mais seguro assumir a situação de inicialização dupla.

Como posso verificar se 30_os-prober não produziu saída com sucesso ?

Basicamente, gostaria de obter um efeito semelhante ao…

if [ -n "'/etc/grub.d/30_os-prober'" ]; then
    # Do stuff for a dual-boot machine
    install_dual_boot
elif ! /etc/grub.d/30_os-prober >/dev/null; then
    # OS probe failed; assume dual boot out of abundance of caution
    install_dual_boot
else
    install_linux_only
fi

… mas sem executar o mesmo comando duas vezes.

1 Informações básicas: 30_os-prober vem com GRUB2 , e o script que eu Estou escrevendo faz parte da minha configuração personalizada para FAI .

    
por 200_success 08.06.2015 / 22:47

2 respostas

8

Antes de tudo, enquanto eles são funcionalmente equivalentes, $(…) é amplamente considerado mais claro que '…' - consulte este , isto e isto . Em segundo lugar, você não precisa usar $? para verificar se um comando foi bem-sucedido ou não. Minha atenção foi recentemente atraída para Seção 2.9.1, Comandos simples de As especificações básicas do Open Group para Shell & Utilitários (Problema 7) :

A "simple command" is a sequence of optional variable assignments and redirections, in any sequence, optionally followed by words and redirections, terminated by a control operator.

When a given simple command is required to be executed …
                          ⋮                                                                                (blah, blah, blah …)

If there is a command name, execution shall continue as described in Command Search and Execution.  If there is no command name, but the command contained a command substitution, the command shall complete with the exit status of the last command substitution performed.  …

Por exemplo,

  • o status de saída do comando

    ls -ld "module_$(uname).c"
    

    é o status de saída do ls , mas

  • o status de saída do comando

    myfile="module_$(uname).c"
    

    é o status de saída do uname .

Então a resposta da ferada pode ser simplificada:

if output=$(/etc/grub.d/30_os-prober)  &&  [ -z "$output" ]
    # i.e., if 30_os-prober successfully produced no output
then
    install_linux_only
else
    install_dual_boot
fi

Observe que é uma boa prática usar nomes com todas as letras maiúsculas somente para variáveis de ambiente (ou variáveis a serem visíveis em todo o script). Variáveis de escopo limitado geralmente são nomeadas em letras minúsculas (ou, se preferir, camelCase).

    
por 09.06.2015 / 09:02
6

Você pode atribuir o valor a uma variável e, em seguida, verificar o status de saída também:

PROBE_VALUE='/etc/grub.d/30_os-prober'

if [ "$?" -eq 0 ] && [ -z "$PROBE_VALUE" ]; then
    install_linux_only
else
    install_dual_boot
fi
    
por 08.06.2015 / 23:33