在命令替换中包含'typeset -r'的脚本的未知错误

时间:2010-06-11 14:32:05

标签: ksh readonly typeset

我希望获取一个脚本,打印此脚本定义的变量的值,然后将该值分配给命令行上的变量,并使用命令替换包装源/打印命令。这适用于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框),输出如下:

$ 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。因此,我的想法是获取脚本以定义其变量,打印我想要的那个,然后通过$(...)语法将该打印输出分配给另一个变量。不可否认,我不想在批处理脚本的环境中获取整个子脚本,因为我只需要其中一个变量。

开头的排版-r代码是错误。我正在寻找的脚本包含这个,以提供各种信号量 - 防止脚本在环境中被多次采购。 (真实脚本中有一个if语句检查_typeset_var = 1,如果已经设置则退出。)所以我知道我可以把它拿出来让$DIR打印好,但是约束问题包括保留typeset -i -r

在示例脚本中,我首先放置了unset,以确保尚未定义_typeset_var。顺便说一下,根据ksh93的ksh手册,我知道不可能取消设置typeset -r变量。

有很多方法可以解决此错误。现在最喜欢的是不使用排版,但只设置没有排版的信号量(例如_typeset_var=1),但是代码的错误仍然是我的好奇心,我想知道是否有人可以解释为什么会这样。

顺便说一句,我放弃的另一个想法是grep我需要的变量来自其包含的脚本,然后打印一个要设置为$A的变量;但是,变量(上例中的$DIR)可能被设置为另一个变量的值(例如DIR=$dom/init),而其他变量可能在脚本的前面定义;因此,我需要获取整个脚本,以确保定义所有变量,以便在采购时正确定义$DIR

2 个答案:

答案 0 :(得分:1)

在ksh93(版本JM 93t + 2009-05-01)中,它适用于我。如果我这样做,但是:

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

因此,您可能会以某种方式在当前环境中获取变量typeset -r

答案 1 :(得分:1)

试试这个

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

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