Я понял - вероятно, на Usenet в середине 1990-х (!) - что конструкция
export var=value
является Bashism, и что переносимое выражение
var=value
export var
Я защищал это годами, но недавно кто-то бросил мне вызов, и я действительно не могу найти никаких документов, подтверждающих то, что раньше было моим твердым убеждением.
"export: command not found"
Похоже, поиск в Google не приводит ни к каким случаям, когда кто-то действительно имел эту проблему, поэтому, даже если она подлинная, я думаю, что это не очень распространено.
(Удары , которые я получаю , кажется, новички , которые копировать / вставить знаки препинания, и в конечном итоге с 'export: command not found
или несколько таких, или пытаются использовать export
с sudo
, и новичком csh
. Пользователей пытаются использовать синтаксис Bourne оболочки)
Я, конечно, могу сказать, что он работает на OS X и на разных дистрибутивах Linux, включая те, где sh
есть dash
.
sh$ export var=value
sh$ echo "$var"
value
sh$ sh -c 'echo "$var"' # see that it really is exported
value
Можно ли сказать, что в современном мире export var=value
безопасно использовать?
Я хотел бы понять, каковы последствия. Если он не портативен для v7 "Bourne classic", это вряд ли что-то большее, чем мелочи. Если существуют производственные системы, в которых оболочка действительно не справляется с этим синтаксисом, это было бы полезно знать.
источник
busybox
своей собственной минимальной оболочки? (Я не в состоянии попробовать ни того, ни другого прямо сейчас.)Ответы:
не был поддержан оболочкой Bourne (старая оболочка 70-х годов, из которой происходят современные
sh
реализации, такие как ash / bash / ksh / yash / zsh). Это было введеноksh
.В оболочке Bourne вы бы сделали:
или:
или с
set -k
:Теперь о поведении:
варьируется от оболочки к оболочке.
Проблема в том, что присваивания и простые командные аргументы анализируются и интерпретируются по-разному.
foo=bar
Выше интерпретируются некоторыми оболочки в качестве аргумента команды и других как назначение (иногда).Например,
интерпретируется как:
с некоторыми оболочками (
ash
более старые версииzsh
(в эмуляции sh),yash
) и:в других (
bash
,ksh
).В то время как
или
будет интерпретироваться одинаково во всех оболочках (как
'export' 'd=b' 'c'
), потому что обратный слеш или знак доллара останавливает те оболочки, которые его поддерживают, чтобы рассматривать эти аргументы как присваивания.Если
export
сам по себе указан или является результатом некоторого расширения (даже частично), в зависимости от оболочки, он также перестанет получать специальную обработку.См. « Нужны ли кавычки для присваивания локальной переменной? » Для более подробной информации об этом.
Хотя синтаксис Борна:
интерпретируется одинаково всеми оболочками без двусмысленности (
d=$a export d
также работает в оболочке Bourne и POSIX-совместимых оболочках, но не в последних версиях,zsh
если только не вsh
эмуляции).Это может стать намного хуже, чем это. Посмотрите, например, это недавнее обсуждение того,
bash
когда задействованы массивы.(ИМО, было ошибкой вводить эту функцию ).
источник
foo=bar export foo
, как я всегда видел там. Я знаю, что экспорт является встроенным, но почему онfoo=bar; foo=baz export foo; echo $foo
ведет себя иначе, чемfoo=bar; foo=baz /bin/cat /dev/null; echo $foo
?export
есть.declare
, ноexport
я рекомендую всем, кто заботится о безопасности, прочитать обсуждение по ссылке, которую StéphaneChazelas предоставил bash.bugs .d=$a export d
интерпретировалось одинаково всеми оболочками без двусмысленности ;-)d=$a export d
больше не работаетzsh
, поэтому я обновил ответ. Смотрите редактировать.Это не bashism, а POSIX-совместимый синтаксис. На самом деле он начинался как kshism довольно давно, а позже был принят практически всеми оболочками, основанными на синтаксисе Борна. Единственное общеизвестное исключение -
/bin/sh
Solaris 10 и старше, который придерживается устаревшего синтаксиса оболочки Bourne. Надеемся, что Solaris 11 использует POSIX-совместимую оболочку как/bin/sh
.Кстати, это
export
была уже встроенная команда в устаревшей оболочке Bourne, поэтому поиск в Googleexport: command not found
вводил в заблуждение.Вот унаследованное поведение оболочки Bourne в
export
сочетании с влиянием:Для ностальгии исходный код этой
оригинальнойоболочки Bourne доступен и может быть скомпилирован для большинства дистрибутивов Unix и Linux.источник