首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在获取脚本并在KornShell上执行脚本时行为的差异

在获取脚本并在KornShell上执行脚本时行为的差异
EN

Stack Overflow用户
提问于 2012-12-17 09:59:38
回答 2查看 928关注 0票数 0

我注意到,在源文件和执行脚本方面唯一的区别是,在后面的情况下,父环境仍然不受影响。

考虑下面的示例脚本:

代码语言:javascript
运行
复制
SETUP_DIR=`dirname $0`
echo $SETUP_DIR
echo $0
echo $1

上面的脚本只是获取正在运行的脚本的目录名。在尝试获取它时,上面的脚本失败了,出现了以下错误

代码语言:javascript
运行
复制
$ . test.sh foo
dirname: invalid option -- k
Try `dirname --help' for more information.

-ksh
foo

在我看来,原因是在获取脚本时,当脚本在父环境shell中运行时,shell名称作为第一个参数传递,在本例中是它的-ksh

dirname -ksh失败是因为-k,这是dirname的无效选项

奇怪的是,在sh或bash中运行时,这个问题并不存在。

代码语言:javascript
运行
复制
$ sh
sh-3.2$ . test.sh foo
.
sh
foo
sh-3.2$ bash
bash-3.2$ . test.sh foo
.
bash
foo
bash-3.2$
  • 所以我想知道,这是KornShell (ksh)中已知的有文档记录的行为吗?如何解决这一问题?
  • 我的第二个一般性问题是,为什么dirname 'sh'返回当前目录.
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-17 10:17:47

所以我想知道,这是玉米壳中已知的一种行为吗?如何解决这一问题?

/bin/login以登录shell的形式启动ksh时,它的$0将以-作为前缀,因此$0将是-ksh而不是ksh/bin/ksh登录是为了向shell表示它是作为登录shell启动的。,因为这通常会影响配置文件加载。

ksh手册记录了它遵守本公约的情况:

如果shell由exec(2)调用,且参数0 ($0)的第一个字符是-,则假定shell是登录shell,并从.

连字符前缀没有出现在bash中,我假设bash正在编辑命令行,以防止它在进程列表中可见。

因此,dirname $0dirname -ksh,dirname试图将其解析为传递ksh选项。

您可以通过使用dirname显式终止--解析选项来解决这一问题。

代码语言:javascript
运行
复制
dirname -- "$0"

我的第二个一般性问题是,为什么dirname 'sh‘返回当前目录。

dirname试图提供帮助并返回一个可用的路径,即使在您所提供的路径中没有目录部分时也是如此。因为您的"$0“只有一个部分,所以它假设它相对于当前的工作目录,即sh == ./sh,并返回.

这是根据dogbane的回答记录下来的

票数 1
EN

Stack Overflow用户

发布于 2012-12-17 10:11:31

回答你的第二个问题,来自man dirname

删除其尾部/component的打印名称;如果名称不包含/'s,输出‘。(意思是当前目录)。

这就是在运行.时获得dirname sh的原因。

我无法在ksh中复制您的错误。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13911886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档