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

shebang引用不同shell时的奇怪脚本行为,shell,unix,solaris,ksh,shebang,Shell,Unix,Solaris,Ksh,Shebang,我最近换了ksh93外壳。为此,我在.profile文件中添加了以下两行 export SHELL=/usr/local/bin/ksh93 exec $SHELL 自从我这么做之后,一些简单的脚本开始以我不理解的方式出现错误。我把它缩小到以下简单的脚本,称为saytest.sh #!/bin/ksh echo $0 $1 如果我键入命令test.sh fred我希望看到相同的输出test.sh fred。相反,我看到的是test.sh noglob。如果我删除shebang或将其改为#/u

我最近换了ksh93外壳。为此,我在.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。

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

最后一点,我建议使用

 #!/usr/bin/env ksh

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

最后一点,我建议使用

 #!/usr/bin/env ksh

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

顺便问一下,设置
noglob
很奇怪,你确定要这样做吗

我怀疑(正如其他人所提到的)Korn shell 88就是
/bin/ksh

ksh88和ksh93在
.kshrc
方面存在重要差异。在ksh88
上,对每个korn shell进程执行.kshrc
,即使是非交互式进程(脚本)。在ksh93
中,不会对shell脚本执行.kshrc
,仅对交互式登录shell执行


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

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

顺便问一下,设置
noglob
很奇怪,你确定要这样做吗

我怀疑(正如其他人所提到的)Korn shell 88就是
/bin/ksh

ksh88和ksh93在
.kshrc
方面存在重要差异。在ksh88
上,对每个korn shell进程执行.kshrc
,即使是非交互式进程(脚本)。在ksh93
中,不会对shell脚本执行.kshrc
,仅对交互式登录shell执行


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

/bin/ksh
中有什么?大概是一个shell脚本,它以某种方式替换了
$1
的值,可能是出于疏忽。@tripleee/bin/ksh是korn shell(我在切换到ksh93之前使用的一个)嗯,这些命令负载可能值得进一步研究。在Solaris上,
/bin/ksh
是(默认情况下)
ksh
的实际可执行文件。不支持
--version
只是表明它是一个真正的(可能是旧的)Korn shell。听起来好像
ksh
启动文件中有什么东西正在破坏传递给脚本的选项,可能是使用
set--noglob
但更可能是使用了一种更微妙的机制(但是
set
可能是数字)。仔细看看
echo
之前的所有命令。
/bin/ksh
中有什么?可能是一个shell脚本,它以某种方式替换了
$1
的值,可能是出于疏忽。@tripleee/bin/ksh是korn shell(我在切换到ksh93之前使用的那个)嗯,这些命令的加载可能值得进一步研究。在Solaris上,
/bin/ksh
ksh
的实际可执行文件(默认情况下)。不支持
--version
只表明它是真实的(可能是旧的)Korn shell。听起来好像
ksh
启动文件中的某些内容正在破坏传递给脚本的选项,可能是使用
set--noglob
但更可能是使用更微妙的机制(但
set
可能是数字)。请仔细查看
echo
之前的所有命令。我没有ksh的别名,/bin/ksh也不是指向任何内容的链接。
ksh-version
只给出了一个错误
-version:bad选项
。我不理解默认参数。使用
#!/usr/bin/env ksh
没有什么区别。很抱歉,它是ksh--version。#!/usr/bin/env程序是您应该遵循的一般规则,因为它使您的脚本(稍微)独立于系统。如果尝试ksh-o,您将看到所有ksh shell选项(glob/noglob就是其中之一)。版本号应该可以让您更深入地了解这种奇怪的行为。
ksh--version
不产生输出,
ksh-o
表示noglob off。
ksh--version
不受Solaris使用的ksh88支持,
--version
是ksh93的一项功能。一种解决方法是
strings/bin/ksh