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
shdo NetBSD (também baseado no shell Almquist). - O
shdo FreeBSD 9.2 ou anterior (consulte a alteração em 9.3 ) -
yash -
zshcom versões anteriores à 5.1 embashoushemulação (ou paraexport var="$(cmd)"em quezshexecutaria 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.