Объем Linux переменных среды - PullRequest
0 голосов
/ 02 мая 2020

Может ли кто-нибудь объяснить разницу в объеме переменных среды в следующих 4 примерах?

❯❯❯ b=1 echo $b

❯❯❯ b=1; echo $b
1
❯❯❯ 
❯❯❯ cat gen.sh
#!/bin/bash
echo $a
❯❯❯ 
❯❯❯ a=1 ./gen.sh
1
❯❯❯ a=1; ./gen.sh

1 Ответ

1 голос
/ 02 мая 2020
  1. Расширение $ параметров выполняется перед выполнением команды с использованием текущей среды.

  2. Назначение параметра не выполняется автоматически export это для дочерних процессов (команд), но только при последующих вызовах команд (в их командной строке, согласно правилу # 1).

  3. Но команда в форме «команда a = b» имеет назначение, которое экспортируется в команду, но только временно - только для этого вызова одной команды.

Учитывая три приведенных выше правила:

❯❯❯ b = 1 эхо $ b

сначала переводится в: b = 1 эхо ""
... и ничего не печатается.

b = 1; echo $ b

работает, потому что есть две разные команды, как если бы они были помещены в две разные строки. Первый раскрывается и устанавливает переменную; затем второй раскрывается.

#!/bin/bash
echo $a

(этот скрипт печатает $ a, найденный в среде).

❯❯❯ a = 1 ./gen.sh

Это работает, потому что экспортируется a = 1, поэтому gen. sh находит его в среде.

❯❯❯ a = 1; ./gen.sh

Это не работает, потому что = 1 установлено, но не экспортировано в дочерние процессы; поэтому gen. sh запускается, но не находит $ a в окружении. Вместо этого будет работать следующее:

❯❯❯ export a = 1; ./gen.sh

...