【发布时间】:2010-10-29 13:50:58
【问题描述】:
当我需要在脚本本身中获取脚本文件的路径时,我会使用这样的东西:
`dirname $0`
在我通过符号链接调用脚本之前,该文件有效。在这种情况下,上面的代码会打印链接的位置而不是原始文件。
有没有办法获取原始脚本文件的路径,而不是链接?
谢谢, 迈克
【问题讨论】:
-
好的。我在这里找到了答案:stackoverflow.com/questions/7665/…
当我需要在脚本本身中获取脚本文件的路径时,我会使用这样的东西:
`dirname $0`
在我通过符号链接调用脚本之前,该文件有效。在这种情况下,上面的代码会打印链接的位置而不是原始文件。
有没有办法获取原始脚本文件的路径,而不是链接?
谢谢, 迈克
【问题讨论】:
我推荐这个:
dirname $(realpath $0)
示例:
skaerst@test01-centos7:~/Documents> ../test/path.sh
dirname realpath: /home/skaerst/test
skaerst@test01-centos7:~/Documents> cat ../test/path.sh
#!/bin/bash
echo "dirname realpath: $(dirname $(realpath $0))"
也可以使用符号链接,因为 realpath 默认使用 -P:
skaerst@test01-centos7:~/Documents> ln -s ../test/path.sh p
skaerst@test01-centos7:~/Documents> ./p
dirname realpath: /home/skaerst/test
realpath 在 coreutils >8.5 中可用,我猜
skaerst@test01-centos7:~/Documents> rpm -qf $(which realpath) $(which dirname)
coreutils-8.22-15.el7_2.1.x86_64
coreutils-8.22-15.el7_2.1.x86_64
第
问候
斯蒂芬
【讨论】:
Dir=$(dirname $(readlink -f "$0"))
【讨论】:
您真的需要阅读以下 BashFAQ 文章:
事实上,$0 hack 并不可靠,只要应用程序以不是应用程序路径的第零个参数启动,它们就会失败。例如,login(1) 将在 $0 中的应用程序名称前面放置一个 -,从而导致损坏,并且每当您调用位于 PATH 中的应用程序时,$0 将不包含应用程序的路径,但只是文件名,这意味着您无法从中提取任何位置信息。失败的方式还有很多。
底线:不要依赖黑客,事实是你无法弄清楚你的脚本在哪里,所以使用配置选项来设置你的配置文件的目录或任何你需要的东西脚本的路径。
【讨论】:
if [ -L $0 ] ; then
DIR=$(dirname $(readlink -f $0)) ;
else
DIR=$(dirname $0) ;
fi ;
【讨论】:
$0 是符号链接时需要运行不同的命令? unix.stackexchange.com/questions/432475/…
$(dirname $(readlink -f $0))`` regardless of whether $0 是否包含符号链接?
为此使用readlink:
readlink -f "$0"
【讨论】: