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).