Практическое использование опции `set -k` в bash


16

Когда мы используем set -kопцию в bash?

Справочное руководство Bash гласит:

Все аргументы в форме операторов присваивания помещаются в среду для команды, а не только те, которые предшествуют имени команды.

Я понимаю, что делает этот вариант, но не мог представить, когда он нам понадобится.


Правильное восприятие. Это -kпозволяет нам запускать 30-летние сценарии оболочки без необходимости их рефакторинга. Вместо этого var1=x var2=y command ...
передайте

Ответы:


14

Вы можете использовать его в любое время, когда хотите «внедрить» переменные среды, переданные в сценарий оболочки (в качестве аргументов), как если бы они были установлены в среде через 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.

В этой ссылке ss64.com/bash/set.html , поскольку set -kони дали, -o keywordкроме -kопции. Это что-то значит?
Рамеш

@Ramesh - set -o keywordэто длинная форма set -k. См help set | grep -- '-k'.
SLM

Ах хорошо. Я долго чесал голову, пытаясь понять, почему есть 2 варианта. Как обычно, идеальный ответ :)
Рамеш

4
./cmd.bash VARCMD=hiНужно set -kзаставить его работать точно так VARCMD=hi ./cmd.bashже, как и без set -k. Угадайте, что конкретный вопрос ОП заключается в необходимости bash для поддержки ./cmd.bash VARCMD=hiформы
iruvar

@ 1_CR - хорошая мысль. Я верю, что это больше связано со стилем, но я посмотрю, смогу ли я найти реальный источник.
SLM

8

Любое практическое использование, set -kскорее всего, просто личный стиль. Некоторые - возможно, те, кто любит языки программирования, которые предлагают возможность использования аргументов ключевых слов в вызовах функций, или те немногие, кому нравится ddсинтаксис команды - могут предпочесть

установить -k
...
команда var 1 = val 1 var 2 = val 2

в

var 1 = val 1 var 2 = команда
 val 2

Фактическая причина, по которой опция существует в некоторых оболочках, объясняется в обосновании команды set в стандарте POSIX :

The following set flags were omitted intentionally with the following rationale:

The -k flag was originally added by the author of the Bourne shell to make it easier
for users of pre-release versions of the shell. In early versions of the Bourne shell
the construct
    set name=value
had to be used to assign values to shell variables.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.