【问题标题】:How to get script file path inside script itself when called through sym link通过符号链接调用时如何获取脚本本身内部的脚本文件路径
【发布时间】:2010-10-29 13:50:58
【问题描述】:

当我需要在脚本本身中获取脚本文件的路径时,我会使用这样的东西:

`dirname $0`

在我通过符号链接调用脚本之前,该文件有效。在这种情况下,上面的代码会打印链接的位置而不是原始文件。

有没有办法获取原始脚本文件的路径,而不是链接?

谢谢, 迈克

【问题讨论】:

标签: linux bash scripting


【解决方案1】:

我推荐这个:

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

问候

斯蒂芬

【讨论】:

    【解决方案2】:
    Dir=$(dirname $(readlink -f "$0"))
    

    【讨论】:

      【解决方案3】:

      真的需要阅读以下 BashFAQ 文章:

      事实上,$0 hack 并不可靠,只要应用程序以不是应用程序路径的第零个参数启动,它们就会失败。例如,login(1) 将在 $0 中的应用程序名称前面放置一个 -,从而导致损坏,并且每当您调用位于 PATH 中的应用程序时,$0 将不包含应用程序的路径,但只是文件名,这意味着您无法从中提取任何位置信息。失败的方式还有很多。

      底线:不要依赖黑客,事实是你无法弄清楚你的脚本在哪里,所以使用配置选项来设置你的配置文件的目录或任何你需要的东西脚本的路径。

      【讨论】:

      • 感谢您的详细回答。我会查看常见问题解答。
      【解决方案4】:
      if [ -L $0 ] ; then
          DIR=$(dirname $(readlink -f $0)) ;
      else
          DIR=$(dirname $0) ;
      fi ;
      

      【讨论】:

      【解决方案5】:

      为此使用readlink

      readlink -f "$0"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-10
        • 2015-10-07
        • 1970-01-01
        • 2011-02-05
        • 1970-01-01
        • 2016-02-06
        相关资源
        最近更新 更多