2016-03-18 2 views
3

В Bash, переменные, объявленные внутри суб-оболочек отличаются от переменных с тем же именем, объявленной в родительских оболочками, если последний не явно export изд:Можно ли повторно использовать переменные readonly в sub-shell bash?

a=12 
(a=13; echo $a) 
echo $a 

# Output: 
# 13 
# 12 Outer variable wasn't changed 

Однако, если внешняя переменная объявлена ​​как readonly, суб-оболочка не может переопределить его, препятствуя повторному использованию и то же имя, даже если он не будет делать никакого вреда:

readonly a=12 
(a=13; echo $a) 
echo $a 

# Output: 
# test.sh: line 2: a: readonly variable 
# 12 Only the outer echo is executed 

Если я объявить readonly также переменную внутри суб-оболочки, я до сих пор получить ту же ошибку, но на этот раз echo внутри вспомогательного корпуса выполнен так:

readonly a=12 
(readonly a=13; echo $a) 
echo $a 

# Output: 
# test.sh: line 2: a: readonly variable 
# 12 global value is used in sub-shell 
# 12 

Теперь, насколько моя цель связана, которая избегает переменных, определенных в дочерних функциях (функции, вызываемые другими функциями) конфликтовать с переменными определен в родительском функции с тем же именем, я мог бы довольствоваться использованием переменных readonly внутри родительских оболочек. Однако, действительно полезно объявлять переменные как readonly, если они не предназначены для изменения, поскольку это помогает предотвратить несколько видов ошибок, поэтому я бы хотел отказаться от них.

Итак, вы знаете, есть ли способ повторно использовать имена переменных, объявленные как readonly в родительских оболочках, изнутри подоболочек?

+0

Вы можете использовать их до тех пор, пока вы не измените их. Но вы хотите использовать их и изменить значение внутри суб-оболочек? –

+0

@ J.Chomel Да, я хочу использовать одно и то же имя, но с разными значениями. Дело в том, что теперь, каждый раз, когда я пишу новую функцию и определяю переменные внутри нее, я всегда рискую столкнуться с именами, которые уже определены выше в стеке вызовов. Новая функция, которую я пишу, не обязана знать, было ли какое-то имя уже определено как «readonly» каким-либо родительским вызывающим, и когда я вызываю функцию, я не должен проверять все имена, определенные им, и все подфункции, прежде чем решить, могу ли я объявить имя как 'readonly'. Я надеялся, что суб-снаряды позволили мне это сделать. – swahnee

ответ

0

От этого сообщения Use of read-only variables in shell scripts, похоже, что статус readonly не будет наследоваться дочерними процессами.

Таким образом, вы можете начать дочерний процесс, а не суб-оболочки, как так:

readonly a=12 
bash -c ' a=13; echo $a '