Видимость переменной bash в подоболочке подстановки команд

Вам необходимо перезапустить dbus. Вам придется выйти из системы и снова войти (я использовал SSH), но это установит cgroups правильно, и вы сможете запустить контейнер без перезагрузки всего сервера.

Если вы не хотите выходить и снова входить, вы можете попробовать создать cgroups вручную с помощью cgm, как описано здесь https://linuxcontainers.org/cgmanager/getting-started/ . Мне удалось запустить контейнер, но я не смог использовать его после выхода из системы и повторного входа, поскольку cgroups, которые я создал вручную, отличались от тех, которые были созданы автоматически при входе в систему.

7
04.10.2017, 23:58
2 ответа

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

Вы можете проверить это напрямую с помощью косвенного обращения к переменной :

$ x=hello
$ echo Result is $(y=x ; echo ${!y} ; echo world)
Result is hello world

Переменная x определенно доступна непосредственно в подоболочке (вместо того, чтобы ее значение было ранее расширено), потому что $ {! y} читает из переменной, чье имя хранится в y - которой не существовало на момент создания подоболочки.


Благотворительное прочтение отрывка из книги будет означать, что «переменная» недоступна, потому что вы не можете постоянно изменять ее значение. Любые назначения переменных, которые вы делаете в подоболочке, впоследствии недоступны для родительской оболочки, будь то создание новых переменных (например, y ) или присвоение значений замены существующим переменным. Если подоболочке присвоено значение x , новое значение будет действовать внутри подоболочки, но последующее чтение из него даст исходное значение:

$ x=world
$ echo $(x=hello ; echo $x)
hello
$ echo $x
world

Это не очень ясный способ выразить это, по крайней мере, в процитированный вами отрывок. Если такова вся книга, возможно, вы сможете найти лучшую (или вместо этого прочитать вопросы здесь).

10
27.01.2020, 20:14

Утверждение:

Из-за этого любые переменные, которые вы создаете в сценарии, недоступны для команды subshell.

неверно. Область действия переменной, определенной в родительской оболочке, - это весь сценарий (включая под-оболочки, созданные с помощью подстановки команд).

Выполнение:

#!/bin/bash
var=5.5555
ans1=$(echo $var)
ans2=$(var=6; echo $var)
echo $ans1
echo $ans2

даст результат:

5.5555
6

$var разрешается подоболочкой:

  • если не указана локальная переменная, используется значение трех глобальных переменных
  • если указана локальная переменная, используется ее значение

См. также пример 21-2.

11
27.01.2020, 20:14

Теги

Похожие вопросы