Cytaty są potrzebne export foo="$var"
lub local foo="$var"
(i readonly
, typeset
, declare
a pozostałe zmienne deklarowania poleceń ) z:
dash
sh
NetBSD (również w oparciu o Almquist Shell).
- Wersja
sh
FreeBSD 9.2 lub starsza (patrz zmiana w 9.3 )
yash
zsh
z wersjami wcześniejszymi niż 5.1 ksh
lub sh
emulującymi (lub dla export var="$(cmd)"
których w zsh
innym przypadku wykonywałby dzielenie słów (bez globowania)).
W przeciwnym razie interpretacja zmiennych podlegałaby podziałowi słów i / lub generowaniu nazw plików, jak w każdym argumencie do dowolnego innego polecenia.
I nie są potrzebne w:
bash
ksh
(wszystkie wdrożenia)
sh
FreeBSD 9.3 lub nowszej
- busybox na bazie popiołu
sh
(od 2005)
zsh
W zsh
, split + glob nigdy nie jest wykonywane po rozszerzeniu parametru, chyba że w sh
lub ksh
emulacji, ale split (nie glob) jest wykonywany po zastąpieniu polecenia. Od wersji 5.1, export
/ local
i inne polecenia deklaracji stały podwójny kluczowe / wbudowane komendy jak w innych skorup powyżej, co oznacza, cytując nie jest konieczne, nawet w sh
/ ksh
emulacji, a nawet do zastąpienia poleceń.
Istnieją specjalne przypadki, w których cytowanie jest potrzebne nawet w tych powłokach, jak na przykład:
a="b=some value"
export "$a"
Lub bardziej ogólnie, jeśli cokolwiek zostało z =
(w tym =
) jest cytowane lub jest wynikiem jakiegoś rozszerzenia (jak export 'foo'="$var"
, export foo\="$var"
lub export foo$((n+=1))="$var"
(które $((...))
powinno być faktycznie cytowane) ...). Innymi słowy, gdy argument argumentu export
nie byłby prawidłowym przypisaniem zmiennej, gdyby został napisany bez export
.
Jeśli export
/ local
sama nazwa polecenia jest cytowany (nawet w części, takich jak "export" a="$b"
, 'ex'port a="$b"
, \export a="$b"
, lub nawet ""export a="$b"
), cytaty wokół $b
potrzebne są wyjątkiem AT & T ksh
i mksh
.
Jeśli export
/ local
lub jakaś jego część jest wynikiem jakiegoś rozszerzenia (jak w cmd=export; "$cmd" a="$b"
lub nawet export$(:) a="$b"
) lub w rzeczach takich jak dryrun=; $dryrun export a="$b"
), wówczas cudzysłowy są potrzebne w każdej powłoce.
W przypadku > /dev/null export a="$b"
, potrzebne są notowania pdksh
i niektóre z jego pochodnych.
Ponieważ command export a="$b"
cytaty są potrzebne w każdej powłoce, ale mksh
i ksh93
(z tymi samymi zastrzeżeniami command
i export
nie będącymi wynikiem niektórych rozszerzeń).
Po napisaniu nie są potrzebne w żadnej powłoce:
foo=$var export foo
(ta składnia jest również kompatybilna z powłoką Bourne'a, ale w najnowszych wersjach zsh
działa tylko w trybie sh
/ ksh
emulacji).
(należy pamiętać, że var=value local var
nie należy tego używać, ponieważ zachowanie różni się w zależności od powłoki).
Należy również pamiętać, że używanie export
z przypisaniem oznacza również utratę statusu wyjścia dla cmd
in export var="$(cmd)"
. Robienie tego, ponieważ export var; var=$(cmd)
nie ma tego problemu.
Uważaj również na ten specjalny przypadek z bash
:
$ bash -c 'IFS=; export a="$*"; echo "$a"' bash a b
ab
$ bash -c 'IFS=; export a=$*; echo "$a"' bash a b
a b
Radzę zawsze cytować.