Выполнение следующего из экрана командной строки:
bash -c "v=value; echo $v"
ничего не отображает. Все нормально? Как я могу присвоить значение переменной внутри этого вида выполнения?
Выполнение следующего из экрана командной строки:
bash -c "v=value; echo $v"
ничего не отображает. Все нормально? Как я могу присвоить значение переменной внутри этого вида выполнения?
Ответы:
Здесь задействованы две оболочки:
Вызывающая оболочка, интерактивная оболочка, из которой вы запускаете эту
Неинтерактивная, неинтерактивная оболочка, созданная bash -c
Теперь проблема в том, что в двойных кавычках переменные раскрываются до соответствующих значений, это верно для любой оболочки.
Таким образом, поскольку вы использовали двойные кавычки, раскрытие переменной $v
фактически происходит в вызывающей оболочке, а не в вызываемой оболочке. Но объявление v=value
, происходит в вызываемой неинтерактивной оболочке.
Итак, в итоге у вас есть переменная, определенная в вызываемой оболочке и расширенная (заранее) в вызывающей оболочке. Поскольку переменная значения не установлена в вызывающей оболочке, следовательно, вы ничего не получите в выводе.
Теперь, чтобы определение переменной и ее раскрытие происходили в порожденной оболочке, используйте одинарные кавычки или escape $
:
$ bash -c "v=value; echo $v"
$ bash -c 'v=value; echo $v'
value
$ bash -c "v=value; echo \$v"
value
С двойными кавычками $v
подставляется интерактивная оболочка. Используйте одинарные кавычки:
$ bash -c 'v=value;echo $v'
value