包含脚本的目录位于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吗?
答案 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 )"
它总是获取脚本的目录,并使用相对和绝对路径。