As cotações são necessárias em export foo="$var"
ou local foo="$var"
(ou readonly
, typeset
, declare
e outras variáveis declarando comandos ) em:
-
dash
- o
sh
do NetBSD (também baseado no shell Almquist). - O
sh
do FreeBSD 9.2 ou anterior (consulte a alteração em 9.3 ) -
yash
-
zsh
com versões anteriores à 5.1 embash
oush
emulação (ou paraexport var="$(cmd)"
em quezsh
executaria a divisão de palavras de outra forma (não globbing)).
Caso contrário, a expansão da variável estaria sujeita à divisão de palavras e / ou geração de nome de arquivo, como em qualquer argumento, a qualquer outro comando.
E não são necessários em bash
ou ksh
ou sh
do FreeBSD 9.3 ou mais recente (onde o comando é analisado de alguma forma como algum tipo de atribuição) nem zsh
(onde a divisão de palavras e geração de nome de arquivo é não feito implicitamente na expansão da variável).
Eles são necessários em todos os shell (exceto zsh
), embora em coisas como:
a="b=some value"
export "$a"
De forma mais geral, se algo sobrando do =
(incluindo o =
) for citado ou o resultado de alguma expansão (como export 'foo'="$var"
, export foo\="$var"
ou export foo$((n+=1))="$var"
(que $((...))
também deve ser citado na verdade) ...). Ou, em outras palavras, quando o argumento para export
não seria uma atribuição de variável válida se fosse escrito sem o export
.
Se o nome do comando export
/ local
for citado (mesmo em parte como "export" a="$b"
, 'ex'port a="$b"
, \export a="$b"
ou mesmo ""export a="$b"
), as cotações em torno de $b
serão necessárias os casos acima e também em bash
, bem como zsh
(todas as versões) quando em sh
emulação.
Se export
/ local
ou alguma parte dele for o resultado de alguma expansão (como em cmd=export; "$cmd" a="$b"
ou mesmo export$(:) a="$b"
) ou se export
/ local
não for a primeira palavra na linha de comando (como em dryrun=; $dryrun export a="$b"
), então as aspas são necessárias em cada shell. No caso de > /dev/null export a="$b"
, no entanto, as citações não são necessárias em bash
/ AT & T ksh
e zsh
(elas estão em pdksh
e derivadas).
Eles não são necessários em nenhum shell quando escritos:
foo=$var export foo
(essa sintaxe sendo também compatível com o shell Bourne, mas no caso de bash e zsh trabalhando somente quando em emulação sh).
(observe que var=value local var
não deve ser usado porque o comportamento varia entre os shells).
Tenha também cuidado com este caso especial com bash
:
$ bash -c 'IFS=; export a="$*"; echo "$a"' bash a b
ab
$ bash -c 'IFS=; export a=$*; echo "$a"' bash a b
a b
Meu conselho seria sempre citar.