27.06.2012 17:20, "Артём Н." пишет -куть
o.O Что непонятного? Если про переменные говорить? 1. Есть функция, которая вызывает другую функцию. В обеих используется одна и та же переменная (не для связи между ними). Если внутренняя функция её переопределяет, внешняя должна сохранять.С архитектурой совсем плохо. Зачем переопределять глобальную переменную, если ее же переопределять нельзя, потому что если переопределили - надо восстановить? В bash есть и локальные переменные ;)Facepalm. Я не использую глобальные _переменные_ там, где не нужно. В данном случае, я их не использую вообще. Это не мой случай. Это ответ на вопрос. Есть функция, которая вызывает другую функцию. В обеих используется одна и та же переменная (не для связи между ними). Если внутренняя функция её переопределяет, внешняя должна сохранять.
Это не о глобальной переменной?
В общем случае (к башу неприменимо) ещё с многопоточностью проблемы будут. Вообще-то, это везде написано... Надо объяснять? Для констант неприменимо. 2. Глобальная переменная может быть случайно переопределена где угодно. Кстати, даже непреднамеренно (ну eval какой-нибудь неправильно использовал или что ещё). Поиск ошибки затянется. В случае с readonly - проблема отпадает.Задавайте значения глобальных переменных таким образом , чем не аналог read-only переменных? #!/bin/bash SET() { var=$1 val=$2 echo "set $var to $val" eval $var="$val" } SET ZZ_aa "abc" echo $ZZ_aa Попытки сдуру переопределить переменную ловятся grep'ом1. Для начала надо понять, что ошибка связана с переопределением.
Вот он - способ отловить переопределения
2. Я не конкретно про bash писал. 3. А кто сказал, что в общем случае имя переменной не может динамически формироваться?
А зачем придумывать способы написания стрёмного кода?Если динамически формировать имя переменной нежелательно по каким-то причинам - этого ведь можно избежать?
Это шеллозависимое хотение ;) Ассоциативные массивы есть не везде. А для управления backup'ом достаточно и соглашения об именовании.3. Ещё раз про интерфейс. Касается и констант. Он разбит на две части. Это значит, что одна переменная может влиять на несколько функций сразу, что может привести к побочным эффектам и трудноуловимым ошибкам (в общем случае). Когда, с параметром функции всё понятно (если функция "чистая", т.е. без побочных эффектов): изменил, сдохла, - проблема в ней или вызываемых с этими параметрами. Здесь: изменил, сдохла, проблема может быть в нескольких функциях, использующих переменную, или в их взаимодействии. Это первое. Второе из первого. Не сразу очевидно какая функция, какую переменную использует. Без глобальных констант, если есть иерархия вызовов, понятно какая функция, что использует ещё на верхнем уровне. В случае использования глобальных констант - непонятно. Значит, нужно использовать поиск (например, разбирая скрипт), чтобы найти какая переменная в какой функции используется. Понимание усложняется. Но в bash нет именованных параметров у функций. При их наличии, такого вопроса, скорее всего, не возникло бы.Если задача решается средствами шелла плохо и сложно - надо либо менять постановку задачи, либо инструмент.Задача, как раз, для шелла. Просто именованные параметры, как мне кажется, были бы не лишними. :-)