首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在命令替换中包含'typeset -r‘的脚本的源操作中出现未知错误

在命令替换中包含'typeset -r‘的脚本的源操作中出现未知错误
EN

Stack Overflow用户
提问于 2010-06-11 22:32:05
回答 2查看 351关注 0票数 1

我希望编写一个脚本,打印该脚本定义的变量的值,然后在命令行上使用命令替换将该值赋给一个变量,该命令替换包装了源/打印命令。这在ksh88上有效,但在ksh93上无效,我想知道为什么。

代码语言:javascript
复制
$ 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机器)上运行时,输出如下:

代码语言:javascript
复制
$ A=$(. ./typeset_err.ksh; print $DIR)
$ echo $A
init

在ksh93 (本例中为Linux机器)上运行时,输出如下:

代码语言:javascript
复制
$ 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,而只是设置信号量而不使用typeset (例如_typeset_var=1),但代码原样的错误仍然是我的好奇,我想看看是否有人能解释为什么会发生这种情况。

顺便说一句,我放弃的另一个想法是将我需要的变量从其包含的脚本中grep出来,然后打印该变量以便将$A设置为;但是,该变量(在上面的示例中为$DIR)可能被设置为另一个变量的值(例如DIR=$dom/init),并且该变量可能在脚本中早先被定义;因此,我需要对整个脚本执行源代码,以确保所有变量都被定义,以便在执行源代码时正确地定义$DIR

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-06-11 23:27:07

它在ksh93 (版本JM 93t+ 2009-05-01)中工作得很好。但是,如果我这样做:

代码语言:javascript
复制
$ . ./typeset_err.ksh
$ A=$(. ./typeset_err.ksh; print $DIR)
-ksh: _typeset_var: is read only

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

票数 1
EN

Stack Overflow用户

发布于 2012-05-17 16:07:08

尝尝这个

代码语言:javascript
复制
A=$(ksh -c "./typeset_err.ksh && print \$DIR")

代码语言:javascript
复制
A=$(env -i ksh -c "./typeset_err.ksh && print \$DIR")
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3023627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档