gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 09:48:13 24 4
gpt4 key购买 nike

我知道,获取脚本和执行脚本的唯一区别是在后一种情况下,父环境不受影响。

考虑这个示例脚本:

SETUP_DIR=`dirname $0`
echo $SETUP_DIR
echo $0
echo $1

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

$ . test.sh foo
dirname: invalid option -- k
Try `dirname --help' for more information.

-ksh
foo

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

dirname -ksh 由于 -k 而失败,这是 dirname

的无效选项

奇怪的是,在sh或bash中运行时没有这个问题

$ 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' 返回当前目录

最佳答案

So I was wondering, is it a known documented behavior in corn shell? How to resolve this issue?

当ksh 被/bin/login 作为登录shell 启动时,它的$0 将以- 为前缀,所以 $0 将是 -ksh 而不仅仅是 ksh/bin/kshLogin does this to indicate to the shell that it is being started as a login shell ,因为这通常会影响配置文件加载。

ksh 手册记录了它对这个约定的遵守情况:

If the shell is invoked by exec(2), and the first character of argument zero ($0) is -, then the shell is assumed to be a login shell and commands are read from [...]

连字符前缀在 bash 中不显示,我假设 bash 正在编辑命令行以阻止它在进程列表中可见。

因此,dirname $0dirname -ksh,并且 dirname 尝试将其解析为传递 ks h 选项

您可以通过使用 -- 显式终止 dirname 的选项解析来解决这个问题,即

dirname -- "$0"

My second generic question is, why does dirname 'sh' returns the current directory .

dirname 试图提供帮助并返回可用路径,即使您提供的路径中没有目录部分。由于您的“$0”只有一部分,它假定它是相对于当前工作目录的,即 sh == ./sh,并返回

这是根据 dogbane 的回答记录的

关于linux - 获取脚本并在 KornShell 上执行脚本时的行为差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13911886/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com