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