В оболочке Bourne есть редко используемая опция '-k
', которая автоматически помещает в среду любые значения, указанные как name=value
в командной строке. Конечно, семейство оболочек Bourne / Korn / POSIX (включая bash) также делает это для name=value
элементов перед именем команды:
name1=value1 name2=value2 command name3=value3 -x name4=value4 abc
При нормальном поведении POSIX-оболочки command
вызывается с name1
и name2
в среде и с четырьмя аргументами. Под опцией оболочки -k
Bourne (и Korn and bash, но не POSIX) она вызывается с name1
, name2
, name3
и name4
в среде и всего двумя аргументами. Страница справочника bash
(как в man bash
) не содержит эквивалента -k
, но работает как оболочки Борна и Корна.
Я не думаю, что когда-либо использовал это (опция -k
) всерьез.
Из скрипта (command
) невозможно сказать, что переменные среды были указаны исключительно для этой команды; они просто переменные окружения в среде этого скрипта.
Это самый близкий мне подход к тому, о чем вы просите. Я не думаю, что для семейства оболочек C существует что-то эквивалентное. Я не знаю другого анализатора аргументов, который устанавливает переменные из name=value
пар в командной строке.
С некоторыми довольно серьезными предостережениями (это довольно легко сделать для простых значений, но трудно справиться со значениями, содержащими метасимволы оболочки), вы можете сделать:
case $1 in
(*=*) eval $1;;
esac
Это не семейство C shell. eval
эффективно выполняет назначение оболочки.
arg=name1=value1
echo $name1
eval $arg
echo $name1