当shebang引用不同的shell时,奇怪的脚本行为

时间:2012-09-05 13:04:22

标签: shell unix solaris ksh shebang

我最近切换到了ksh93 shell。我通过将以下两行添加到我的.profile文件

来完成此操作
export SHELL=/usr/local/bin/ksh93
exec $SHELL

自从我这样做以来,一些简单的脚本开始以一种我不理解的方式行为不端。我将其缩小到以下简称的脚本test.sh

#!/bin/ksh
echo $0 $1

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

任何人都可以解释发生了什么,或者该怎么办?我很难过。

如果它有任何不同,我正在使用Solaris 5.9。

2 个答案:

答案 0 :(得分:2)

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

顺便说一下,设置noglob很奇怪,你确定要的吗?

我怀疑(正如其他人提到的那样)/bin/ksh是Korn shell 88 关于.kshrc,ksh88和ksh93之间存在重要差异。在ksh88上.kshrc执行每个korn shell进程,甚至是非交互式进程(脚本)。在ksh93中.kshrc为shell脚本执行 not ,仅用于交互式登录shell。

当您执行不是登录shell的exec $SHELL时,最好在/etc/passwd中更改您的条目。顺便说一下,使用变量SHELL是一个坏主意,因为它是由登录shell设置的。

答案 1 :(得分:1)

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

最后一点,我不建议直接调用shell,而是建议使用

 #!/usr/bin/env ksh