Практичне використання опції `set -k` в bash


16

Коли ми використовуємо set -kваріант у 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 Довідкового посібника Баша]

  • Рядки призначення параметрів ключового слова будуть розглядатися як аргументи для команди, яка виконується, якщо вони розміщені після імені команди.

  • Параметри ключового слова можуть управляти командою 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. Здогадайтесь, специфічне питання ОП полягає у необхідності ./cmd.bash VARCMD=hi
башма

@ 1_CR - хороший момент. Я вважаю, що це стосується стилю більше за все, я побачу, чи зможу я знайти справжнє джерело.
slm

8

Будь-яке практичне використання set -k, ймовірно, є лише особистим стилем. Деякі - можливо, ті, хто любить мови програмування, які пропонують можливість використовувати аргументи ключових слів у викликах функцій, або ті, хто любить ddсинтаксис команди - можуть віддавати перевагу

встановити -к
...
команда 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.