Я хочу создать сценарий, вывести значение переменной, определяемой этим сценарием, а затем присвоить это значение переменной в командной строке с подстановкой команд, заключающей в себе команды source / print. Это работает на ksh88, но не на ksh93, и мне интересно, почему.
$ cat typeset_err.ksh
#!/bin/ksh
unset _typeset_var
typeset -i -r _typeset_var=1
DIR=init # this is the variable I want to print
При запуске на ksh88 (в данном случае AIX 6.1 box) вывод будет следующим:
$ A=$(. ./typeset_err.ksh; print $DIR)
$ echo $A
init
При запуске на ksh93 (в данном случае на компьютере с Linux) вывод будет следующим:
$ A=$(. ./typeset_err.ksh; print $DIR)
-ksh: _typeset_var: is read only
$ print $A
($ A не определено)
Выше приведен пример сценария. На самом деле я хочу создать скрипт, который устанавливает значения для многих переменных, чтобы я мог напечатать только одно из его значений, например, $DIR
, и $A
равно этому значению. Я не знаю заранее значение $DIR
, но мне нужно скопировать файлы в $DIR
во время выполнения другого пакетного сценария. Поэтому у меня была идея создать сценарий для определения его переменных, распечатать ту, которую я хотел, а затем назначить вывод этой печати другой переменной с помощью синтаксиса $(...)
. По общему признанию немного взломать, но я не хочу, чтобы весь подпрограмма была источником в среде пакетного сценария, потому что мне нужна только одна из его переменных.
Код typeset -r в начале является ошибкой. Сценарий, который я использую, содержит это для того, чтобы создать своего рода семафор - чтобы предотвратить создание сценария в среде более одного раза. (В реальном скрипте есть оператор if, который проверяет _typeset_var = 1
и завершает работу, если он уже установлен.) Так что я знаю, что могу извлечь это и получить $DIR
для печати в порядке, но ограничения проблемы включают сохраняя typeset -i -r
.
В примере сценария я сначала поставил unset
, чтобы убедиться, что _typeset_var
еще не определено. Кстати, я знаю, что невозможно сбросить переменную typeset -r
, согласно справочной странице ksh93 для ksh.
Есть способы обойти эту ошибку. Сейчас любимым является не использовать typeset, а просто установить семафор без typeset (например, _typeset_var=1
), но ошибка с кодом как есть остается для меня любопытством, и я хочу посмотреть, сможет ли кто-нибудь объяснить, почему это происходит.
Кстати, еще одна идея, от которой я отказался, - grep
нужная мне переменная из содержащегося в ней скрипта, затем вывести эту переменную для $A
, которую нужно установить; однако переменная ($DIR
в примере выше) может быть установлена на значение другой переменной (например, DIR=$dom/init
), и эта другая переменная может быть определена ранее в скрипте; поэтому мне нужно написать весь сценарий, чтобы убедиться, что все переменные определены так, чтобы $DIR
было правильно определено при поиске.