包含脚本的目录在 PATH 变量中。
脚本只有以下几行:
#!/bin/ksh
echo "Dirname: $(dirname $0)"
echo "Basename: $(basename $0)"
正常运行它然后进入 Debug模式:
[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
在 Debug模式下运行脚本,为什么目录名会改变?
如果我将脚本中的第一行设置为 #!/bin/ksh -x
那么它就可以完美运行。
是否与 ksh -x
有某种关系,linux 派生了一个新的 shell?
最佳答案
它不会改变目录。在没有前导路径的情况下运行 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)"
关于linux - ksh -x 带目录名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25239966/