Вы можете использовать его в любое время, когда хотите «внедрить» переменные среды, переданные в сценарий оболочки (в качестве аргументов), как если бы они были установлены в среде через export
, но без необходимости постоянного их размещения в export
списке до запуска команд ,
ПРИМЕЧАНИЕ. Также имеется длинная форма -k
переключателя set -o keyword
.
пример
$ cat cmd1.bash
#!/bin/bash
echo $VARCMD
Теперь, если я set -k
:
$ set -k; ./cmd1.bash VARCMD="hi"; set +k
hi
Но если бы я просто запустил вышеуказанный скрипт:
$ ./cmd1.bash
$
Что делает экспорт?
$ help export
...
Marks each NAME for automatic export to the environment of subsequently
executed commands. If VALUE is supplied, assign VALUE before exporting.
...
Так что, если бы мы добавили export | grep VAR
в наш скрипт вот так:
$ cat cmd2.bash
#!/bin/bash
echo $VARCMD
export | grep VAR
И мы снова запустили наши тесты:
$ set -k; ./cmd2.bash VARCMD="hi"; set +k
hi
declare -x VARCMD="hi"
Но без set -k
:
$ ./cmd2.bash
$
Так set -k
что позволяет нам временно экспортировать переменные в массе.
Другой пример
$ cat cmd3.bash
#!/bin/bash
echo $VARCMD1
echo $VARCMD2
export | grep VAR
Когда мы устанавливаем несколько переменных, они все экспортируются:
$ set -k; ./cmd3.bash VARCMD1="hi" VARCMD2="bye"; set +k
hi
bye
declare -x VARCMD1="hi"
declare -x VARCMD2="bye"
Так тогда это просто внедрение всех переменных среды?
Нет, -k
здесь делается очень явная вещь. Это только экспорт переменных, которые были включены в командную строку при выполнении команды.
пример
Скажем, я установил эту переменную:
$ VARCMD1="hi"
Теперь, когда мы запускаем ту же команду, опуская VARCMD1="hi"
:
$ set -k; ./cmd3.bash VARCMD2="bye"; set +k
bye
declare -x VARCMD2="bye"
Но почему это существует?
Я нашел этот источник, который немного объясняет эту функцию, под названием: «Строки назначения параметра ключевого слова». ПРИМЕЧАНИЕ . Исходный URL-адрес использует IP-адрес, поэтому я не могу ссылаться на него непосредственно здесь, на SE.
http://140.120.7.21/OpenSystem2/SoftwareTools/node16.html
При программировании на любом языке переменная и передача ее значения имеют решающее значение для написания надежного кода. Кроме целочисленных переменных и типов массивов, все остальные переменные оболочки принимают строки в качестве своих значений. Говоря о языке программирования оболочки, чтобы быть последовательным, мы предпочитаем фразу «параметр ключевого слова». Вот несколько моментов, на которые следует обратить внимание при назначении значений параметрам ключевых слов:
Чтобы избежать неожиданного эффекта, всегда помещайте подстроку назначения параметра перед командной строкой.
В оболочке B назначенные значения параметров ключевых слов будут храниться в (локальных) переменных оболочки. В bash и ksh строки назначения параметров ключевого слова, предшествующие команде, не будут храниться в переменных оболочки. Они влияют только на непосредственный подпроцесс, разветвленный для выполнения текущей команды. Одна строка строк присваивания параметров ключевых слов сохраняется в (локальных) переменных оболочки. Строки присваивания параметров ключевого слова могут также отображаться в качестве аргументов для псевдонимов, объявлений, набора типов, экспорта, чтения и локальных встроенных команд. [Раздел 3.4 Справочного руководства Bash]
Строки присваивания параметров ключевого слова будут рассматриваться как аргументы для команды, которая будет выполнена, если они помещены после имени команды.
- Ключевыми параметрами можно управлять командой set.
-k
позволяет нам запускать 30-летние сценарии оболочки без необходимости их рефакторинга. Вместо этогоvar1=x var2=y command ...