我最近切换到了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。
答案 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