WHICH="'which which'"
é exatamente equivalente a WHICH='which which'
ou WHICH=$(which which)
ou WHICH="$(which which)"
. Todos eles executam o comando which which
e capturam sua saída (como uma string) na variável WHICH
, removendo qualquer nova linha final da saída. Da mesma forma, AWK="'${WHICH} gawk'"
pode ser escrito AWK='$WHICH gawk'
.
Normalmente, as substituições de comandos ( 'command'
ou $(command)
) devem ser colocadas entre aspas duplas, caso o resultado contenha curingas de espaços em branco ou de concha ( *?[\
). Isso ocorre porque o resultado de substituições de comandos, como substituições de variáveis ( $foo
ou ${foo}
), sofre divisão de palavras e geração de nome de arquivo (também conhecido como globbing). No entanto, isso não se aplica a atribuições de variáveis simples: como o contexto requer uma única palavra, o resultado da substituição é considerado como está. Portanto, as atribuições são uma exceção à regra geral de que você deve duplicar as substituições de comando e variável. (Observe que essa exceção não se estende a export var="$value"
, que exige as aspas duplas.) Mas é uma prática razoável de programação shell sempre as aspas duplas - omitir elas somente se você sabe que deve, em vez de usá-las apenas se sei que você deve.
No (improvável) caso which which
retorna um caminho com espaços ou curingas, ${WHICH}
deve ser colocado entre aspas nas linhas abaixo, ou seja, um dos
AWK="'"${WHICH}" gawk'"
AWK='"${WHICH}" gawk'
AWK="$("${WHICH}" gawk)"
AWK=$("${WHICH}" gawk)
(Usar $(…)
é recomendado acima de '…'
, devido à dificuldade de obter as citações aninhadas dentro de '…'
. No entanto, shells muito antigas não reconhecem $(…)
, então '…'
é necessário para scripts que deve ser executado em sistemas mais antigos.)
Veja também $ VAR vs $ { VAR} e para citar ou não citar