0

我最近切换到了 ksh93 shell。我通过在我的 .profile 文件中添加以下两行来做到这一点

export SHELL=/usr/local/bin/ksh93
exec $SHELL

自从我这样做后,一些简单的脚本开始以我不理解的方式出现异常。我将其范围缩小到以下名为 say 的简单脚本test.sh

#!/bin/ksh
echo $0 $1

如果我键入命令test.sh fred,我希望看到相同的输出test.sh fred。相反,我看到了test.sh noglob。如果我删除了 shebang 或者我将其更改为读取,#!/usr/local/bin/ksh93那么脚本将按预期工作。

谁能解释发生了什么,或者该怎么做?我难住了。

如果有什么不同,我正在使用 Solaris 5.9。

4

2 回答 2

2

我从评论中注意到你.kshrc有一个set noglob. 没有选项的set命令将设置命令行参数,这就是为什么$1是“noglob”,它应该是set -o noglob.

顺便说一句,设置noglob很奇怪,你确定要这样吗?

我怀疑(正如其他人所提到的)那/bin/ksh是 Korn shell
88。ksh88 和 ksh93 在.kshrc. 在 ksh88.kshrc上,每个 korn shell 进程都执行,甚至是非交互式进程(脚本)。在 ksh93.kshrc为 shell 脚本执行,只为交互式登录 shell。

当您这样做exec $SHELL不是登录 shell 时,最好将您的条目更改为/etc/passwd. 顺便说一句,使用变量SHELL是个坏主意,因为它是由登录 shell 设置的。

于 2012-09-05T16:20:05.427 回答
1

您的系统中的 ksh 上可能有一个别名,其中 noglob 设置为选项,或者在您的旧 shell 中默认情况下 noglob 作为默认参数传递。您还应该检查您真正调用的 ksh(检查 /bin/ksh 中是否有指向另一个 shell 的链接)。ksh --version 也应该提供一些见解。

最后一点,我建议不要直接调用 shell

 #!/usr/bin/env ksh
于 2012-09-05T13:12:52.330 回答