linux - ksh -x 带目录名

标签 linux shell ksh

包含脚本的目录在 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/

相关文章:

linux - 每天定时将文件从服务器A移动到服务器B的Shell脚本

linux - 在特定时间运行作业

bash - 从shell脚本中的文件名中删除一级文件扩展名

linux - 使用 shell 脚本为 oracle db 杀死长时间运行的多个 session

c++ - SciLinux : libgfortran. so.3:找不到版本 'GFORTRAN_1.4'

c - Intel 指令的 LOCK 前缀。重点是什么?

regex - 带正则表达式的 grep 作用域

创建写入文件的线程

linux - 使用 tee 和 grep 将输出传输到文件中,但看到完整的输出

linux - awk 或 perl one liner + 使用 awk one liner 命令验证数组值