ksh -x与dirname

时间:2014-08-11 09:27:00

标签: linux shell ksh

包含脚本的目录位于PATH变量中。

脚本只有以下几行:

#!/bin/ksh
echo "Dirname: $(dirname $0)"
echo "Basename: $(basename $0)"

正常运行它然后在调试模式下运行:

[user@localhost ~]$ test.sh
Dirname: /home/user/scripts
Basename: test.sh
[user@localhost ~]$ ksh -x test.sh
+ dirname test.sh
+ echo 'Dirname: .'
Dirname: .
+ basename test.sh
+ echo 'Basename: test.sh'
Basename: test.sh

目前的目录是:

[user@localhost ~]$ pwd
/home/user
[user@localhost ~]$

我的问题是,如果我使用ksh -x在调试模式下运行脚本,为什么dirname会更改?

如果我将脚本中的第一行设置为#!/bin/ksh -x,那么它就能完美运行。

ksh -x有什么关系,linux会问一个新的shell吗?

3 个答案:

答案 0 :(得分:1)

它没有更改目录。在没有前导路径的情况下运行test.sh会使shell在PATH目录中搜索它。在这种情况下,在test.sh中找到了/home/user/scripts,其完整路径为/home/user/scripts/test.sh。在其上运行dirname,您将获得/home/user/scripts。但是对于ksh -x test.sh,不会在PATH中搜索脚本,只能在当前目录中运行该脚本,使$0的值为test.sh。在其上运行dirname,您只能获得.

您可能在第一个实例上运行/home/user/scripts/test.sh。另一个相同的脚本/home/user/test.sh或者是第二个实例上运行的/home/user/scripts/test.sh的链接。

如果您希望命令定位到同一文件,请明确指定其路径:

ksh /home/user/scripts/test.sh
ksh -x /home/user/scripts/test.sh

或者

ksh ./test.sh
ksh -x ./test.sh

这也可能类似:

ksh test.sh
ksh -x "$(which test.sh)"

答案 1 :(得分:0)

第一个命令是使用默认shell(Bash?)运行的,而第二个命令是使用ksh运行的。这可以解释不同的

答案 2 :(得分:0)

好吧,我知道发生了什么。

来自dirname手册:

Print NAME with its trailing /component removed; if NAME contains no /’s, output ‘.’ (meaning the current directory).

所以我用这条线解决了它:

DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

它总是获取脚本的目录,并使用相对和绝对路径。