可能重复:
在 bash 脚本中,我如何知道脚本文件名?
我经常需要 bash 脚本的文件系统来引用其他需要的资源。通常在 shebang 行之后使用以下代码。它设置了一个名为“scriptPos”的变量,其中包含脚本的当前路径
scriptPos=${0%/*}
它工作得很好,但是有没有更直观的东西来替换 shell 扩展?
可能重复:
在 bash 脚本中,我如何知道脚本文件名?
我经常需要 bash 脚本的文件系统来引用其他需要的资源。通常在 shebang 行之后使用以下代码。它设置了一个名为“scriptPos”的变量,其中包含脚本的当前路径
scriptPos=${0%/*}
它工作得很好,但是有没有更直观的东西来替换 shell 扩展?
有dirname
,但它需要一个fork
:
scriptPos=$(dirname "$0")
一种选择是
scriptPos=$(dirname $0)
这是以额外过程为代价的,但更具自我描述性。如果脚本直接在当前脚本中,则输出会有所不同(我认为更好):
#!/bin/bash
scriptPos=$(dirname $0)
echo '$0:' $0
echo 'dirname:' $scriptPos
echo 'expansion:' ${0%/*}
$ bash tmp.bash
$0: tmp.bash
dirname: .
expansion: tmp.bash
更新:试图解决 jm666 指出的缺点。
#!/bin/bash
scriptPos=$( v=$(readlink "$0") && echo $(dirname "$v") || echo $(dirname "$0") )