Citações são necessários em export foo="$var"
ou local foo="$var"
(ou readonly
, typeset
, declare
e outras variáveis que declara comandos ) em:
dash
- o
sh
do NetBSD (também baseado no shell Almquist).
- O
sh
do FreeBSD 9.2 ou anterior (veja a alteração na 9.3 )
yash
zsh
com versões anteriores à 5.1 em ksh
ou sh
emulação (ou para export var="$(cmd)"
onde zsh
executaria a divisão de palavras de outra forma (sem 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 para qualquer outro comando.
E não são necessários em:
bash
ksh
(todas as implementações)
- o
sh
do FreeBSD 9.3 ou posterior
- à base de cinzas do busybox
sh
(desde 2005)
zsh
Em zsh
, split + glob nunca é feito na expansão de parâmetros, a menos que seja dentro sh
ou ksh
emulado, mas split (não glob) é feito na substituição de comandos. Desde a versão 5.1, export
/ local
e outros comandos de declaração se tornaram comandos de palavra-chave dupla / embutidos, como nos outros shells acima, o que significa que a citação não é necessária, mesmo em sh
/ ksh
emulation e até mesmo para substituição de comando.
Existem casos especiais em que é necessário citar mesmo nessas conchas, como:
a="b=some value"
export "$a"
Ou, de maneira mais geral, se algo restante 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 escrito sem o export
.
Se o export
/ local
nome próprio comando é citado (mesmo em parte, como "export" a="$b"
, 'ex'port a="$b"
, \export a="$b"
, ou mesmo ""export a="$b"
), as aspas em torno $b
são necessários excepto AT & T ksh
e mksh
.
Se export
/ local
ou parte dela é resultado de alguma expansão (como em cmd=export; "$cmd" a="$b"
ou mesmo export$(:) a="$b"
) ou em coisas como dryrun=; $dryrun export a="$b"
), então as aspas são necessárias em cada shell.
No caso de > /dev/null export a="$b"
, as cotações são necessárias em pdksh
e alguns de seus derivados.
Pois command export a="$b"
, as aspas são necessárias em todos os shell, mas mksh
e ksh93
(com as mesmas ressalvas sobre command
e export
não sendo o resultado de alguma expansão).
Eles não são necessários em nenhum shell quando gravados:
foo=$var export foo
(essa sintaxe também é compatível com o shell Bourne, mas nas versões recentes do zsh
, funcionando apenas quando em sh
/ ksh
emulação).
(observe que var=value local var
não deve ser usado, pois o comportamento varia entre as conchas).
Observe também que o uso export
com uma atribuição também significa que o status de saída de cmd
in export var="$(cmd)"
é perdido. Fazê-lo como export var; var=$(cmd)
não tem esse problema.
Também tenha 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.