Неизвестная ошибка при поиске сценария, содержащего 'typeset -r', заключенного в подстановку команд - PullRequest
1 голос
/ 11 июня 2010

Я хочу создать сценарий, вывести значение переменной, определяемой этим сценарием, а затем присвоить это значение переменной в командной строке с подстановкой команд, заключающей в себе команды 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 было правильно определено при поиске.

Ответы [ 2 ]

1 голос
/ 17 мая 2012

Попробуйте это

A=$(ksh -c "./typeset_err.ksh && print \$DIR")

или

A=$(env -i ksh -c "./typeset_err.ksh && print \$DIR")
1 голос
/ 11 июня 2010

У меня в ksh93 работает нормально (версия JM 93t + 2009-05-01). Если я сделаю это, хотя:

$ . ./typeset_err.ksh
$ A=$(. ./typeset_err.ksh; print $DIR)
-ksh: _typeset_var: is read only

Так что, возможно, вы получаете эту переменную typeset -r в текущей среде.

...