Это работает, это не то, что я бы использовал, но это «работает». Создадим скрипт teredo
для установки переменной окружения TEREDO_WORMS
:
#!/bin/ksh
export TEREDO_WORMS=ukelele
exec $SHELL -i
Он будет интерпретирован оболочкой Korn, экспортирует переменную среды, а затем заменит себя новой интерактивной оболочкой.
Перед запуском этого сценария мы установили SHELL
в среде оболочки C, а переменная среды TEREDO_WORMS
не установлена:
% env | grep SHELL
SHELL=/bin/csh
% env | grep TEREDO
%
Когда скрипт запускается, вы находитесь в новой оболочке, другой интерактивной оболочке C, но установлена переменная среды:
% teredo
% env | grep TEREDO
TEREDO_WORMS=ukelele
%
Когда вы выходите из этой оболочки, исходная оболочка берет на себя:
% exit
% env | grep TEREDO
%
Переменная среды не установлена в исходной среде оболочки. Если вы используете exec teredo
для запуска команды, то исходная интерактивная оболочка заменяется оболочкой Korn, которая задает среду, а затем она, в свою очередь, заменяется новой интерактивной оболочкой C:
% exec teredo
% env | grep TEREDO
TEREDO_WORMS=ukelele
%
Если вы наберете exit
(или Control-D), ваша оболочка завершится, вероятно, выйдете из этого окна или вернетесь на предыдущий уровень оболочки, с которого начались эксперименты.
Тот же механизм работает для оболочки Bash или Korn. Вы можете обнаружить, что приглашение после команд выхода появляется в забавных местах.
Обратите внимание на обсуждение в комментариях. Я бы не рекомендовал это решение, но оно позволяет достичь заявленной цели с помощью одного скрипта для установки среды, которая работает со всеми оболочками (которые принимают параметр -i
для создания интерактивной оболочки). Вы также можете добавить "$@"
после параметра для передачи любых других аргументов, которые затем могут сделать оболочку пригодной для использования в качестве общего инструмента «установить среду и выполнить команду». Вы можете опустить -i
, если есть другие аргументы, ведущие к:
#!/bin/ksh
export TEREDO_WORMS=ukelele
exec $SHELL "${@-'-i'}"
Бит "${@-'-i'}"
означает, что «если список аргументов содержит хотя бы один аргумент, использовать исходный список аргументов; в противном случае замените несуществующие аргументы -i
'.
person
Jonathan Leffler
schedule
30.01.2009