我遇到了一个问题,KornShell (ksh)脚本在ksh88和ksh93上以不同的方式运行,其中调用函数的函数以不同的方式处理使用typeset和export声明的变量。以下是一个突出显示差异的示例脚本:
#!/bin/ksh
# example.ksh: highlights differences between typeset and export on ksh93
function inner
{
echo " Inside inner, before assignment, TEST_VALUE=[$TEST_VALUE]"
TEST_VALUE=abc
echo " Inside inner, after assignment, TEST_VALUE=[$TEST_VALUE]"
}
function outer_typeset
{
typeset TEST_VALUE
echo "Inside outer_typeset, before call of inner, TEST_VALUE=[$TEST_VALUE]"
inner
echo "Inside outer_typeset, after call of inner, TEST_VALUE=[$TEST_VALUE]"
}
function outer_typeset_x
{
typeset -x TEST_VALUE
echo "Inside outer_typeset_x, before call of inner, TEST_VALUE=[$TEST_VALUE]"
inner
echo "Inside outer_typeset_x, after call of inner, TEST_VALUE=[$TEST_VALUE]"
}
function outer_export
{
export TEST_VALUE
echo "Inside outer_export, before call of inner, TEST_VALUE=[$TEST_VALUE]"
inner
echo "Inside outer_export, after call of inner, TEST_VALUE=[$TEST_VALUE]"
}
outer_typeset
unset TEST_VALUE
echo
outer_typeset_x
unset TEST_VALUE
echo
outer_export当在运行ksh93的Linux机器上运行时,结果如下:
$ echo ${.sh.version}
Version M 1993-12-28 r
$ ./example.ksh
Inside outer_typeset, before call of inner, TEST_VALUE=[]
Inside inner, before assignment, TEST_VALUE=[]
Inside inner, after assignment, TEST_VALUE=[abc]
Inside outer_typeset, after call of inner, TEST_VALUE=[]
Inside outer_typeset_x, before call of inner, TEST_VALUE=[]
Inside inner, before assignment, TEST_VALUE=[]
Inside inner, after assignment, TEST_VALUE=[abc]
Inside outer_typeset_x, after call of inner, TEST_VALUE=[]
Inside outer_export, before call of inner, TEST_VALUE=[]
Inside inner, before assignment, TEST_VALUE=[]
Inside inner, after assignment, TEST_VALUE=[abc]
Inside outer_export, after call of inner, TEST_VALUE=[abc]正如您所看到的,当TEST_VALUE被排版时,在内部设置的TEST_VALUE的值在控制返回到外部函数时丢失。如果通过导出声明了TEST_VALUE,则当控制返回到外部时,将保留在内部设置的值。
因为在外部函数调用内部函数时没有调用新的进程,所以我不明白为什么要使用export来使变量在sub函数中保持作用域。此外,我已经注意到,typeset -x的行为与typeset相同,而我原本期望typeset -x等同于导出。
当我在运行ksh88 (AIX、Solaris、HP-UX)或pdksh (Linux)或MKS ksh的机器上运行此程序时,typeset、typeset -x和export在本例中的行为相同。
现在,我已经将排版改为导出,以便为使用在ksh88上开发和测试的类似代码的程序提供ksh93上的兼容性。
也许这是ksh93的一个缺陷?
发布于 2010-06-05 03:48:55
您的脚本调用了inner和inner_function,但没有定义后者。这只是问题中的一个打字错误,还是你的实际脚本也有这个错误?
您在输出中显示的行为是正确的。
尝试将outer_typeset_x的定义从function outer_typeset_x {更改为outer_typeset_x () {,您将看到它的输出与outer_export的输出相同。
发布于 2010-06-05 02:53:46
关于typeset,ksh93手册中有这样的说明
在使用函数名语法定义的函数中调用时,将创建变量vname的新实例,并在函数完成时恢复变量的值和类型。
这是关于export的
给定的名称被标记为自动导出到后续执行的命令的环境。
特别是,当您在函数中使用export时,不会恢复任何内容。
似乎typeset的目的是提供由其他语言中的“过程局部变量”提供的功能。我不认为这是一个设计缺陷。
https://stackoverflow.com/questions/2976207
复制相似问题