【问题标题】:Bash script to get its full path (use 'source' to invoke it)Bash 脚本以获取其完整路径(使用“源”来调用它)
【发布时间】:2016-03-01 09:24:44
【问题描述】:

在 bash 脚本中,是否有任何方法可以获取自身的完整路径?

$ source ~/dev/setup.sh

我试过$_、$-、$0...,但都无关紧要。

提前致谢。

【问题讨论】:

标签: bash


【解决方案1】:

$_ 变量用于定位源脚本。

如果您要获取脚本,则可以使用 $_ 访问脚本名称(因为 $0 将是 bash 解释器)

bash解决方案。

relname="$_";

# if script is in current directory, add ./
if [[ ! "$relname" =~ "/" ]]; then 
   relname="./$relname"; fi

relpath=`dirname $relname`;
name="${relname##*/}"

# convert to absolute path by cd-ing and using pwd.
cd "$relpath" >/dev/null;
path=`pwd`;
cd - >/dev/null;

# construct full path from absolute path and filename
fullpath="$path/$name";

请注意,此脚本的副作用是将 $OLDPWD(cd - 使用)替换为脚本目录。如果您需要避免这种情况,只需在 cd - 之前保存 $OLDPWD 并在最后恢复它。

使用realpath

假设您安装了realpath 命令,您可以用以下代码替换此代码:

fullpath=`realpath "$_"`

【讨论】:

    【解决方案2】:

    您可以使用BASH_SOURCE 变量,然后使用readlink 获取完整路径:

    echo $BASH_SOURCE
    
    # to get full path
    fullpath=$(readlink --canonicalize --no-newline $BASH_SOURCE)
    echo "$fullpath"
    

    这将打印所获取文件的调用路径,因此在您的情况下:

    ~/dev/setup.sh
    ~/dev/setup.sh
    

    Reference

    BASH_SOURCE

    一个数组变量,其成员是源文件名,其中定义了FUNCNAME 数组变量中的相应shell 函数名称。 shell函数${FUNCNAME[$i]}在文件${BASH_SOURCE[$i]}中定义,从${BASH_SOURCE[$i+1]}调用

    【讨论】:

    • 这不提供完整路径。它提供了您运行脚本的任何相对路径。
    • 这就是我在回答中提到的 这将打印所获取文件的调用路径
    • 是的,这就是答案。非常感谢。
    • 我还添加了一个调用readlink 的建议,以防此文件是通过相对路径获取的。
    • 您可能知道,如果出现一条评论然后它显示在编辑历史记录中,则 5 分钟限制不适用
    【解决方案3】:

    使用realpath

    $ realpath ~/dev/setup.sh
    

    在脚本中:

    rp=$(realpath "$0")
    echo $rp
    

    【讨论】:

    • 请注意,您可能希望给realpath 一些选项,这取决于人们希望它如何处理符号链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-17
    • 2011-06-14
    • 2016-01-27
    • 2010-11-25
    • 2020-01-30
    • 2011-11-01
    相关资源
    最近更新 更多