如何在shell脚本中扩展相对路径

时间:2012-07-23 22:48:37

标签: linux bash

我正在编写一个脚本,使用bash在linux 2.6上设置环境变量。 因此脚本包含如下命令:

export SRC_DIR=..
export LIBPATH=${SRC_DIR}/lib

问题是,当我尝试做echo $ LIBPATH时,它显示“../lib”而不是将SRC_DIR扩展为完整路径。我真的希望脚本打印像/ home / x / lib这样的东西而不是../lib。

UPDATE 脚本应该将SRC_DIR评估为脚本位置向上的一个目录,而不是调用脚本的当前目录

7 个答案:

答案 0 :(得分:53)

在Subshel​​l中更改目录

您可以使用一个小技巧从相对路径获取绝对路径而不更改当前工作目录。诀窍是移动到子shell中的相对路径,然后展开工作目录。例如:

export SRC_DIR=$(cd ..; pwd)

脚本而不是调用目录的相对路径

要更改为脚本位置的相对路径,而不是当前工作目录,可以使用parameter expansion dirname 实用程序。我更喜欢 dirname ,因为它更明确一些。以下是两个例子。

# Using /usr/bin/dirname.
export SRC_DIR=$(cd "$(dirname "$0")/.."; pwd)

# Using the "remove matching suffix pattern" parameter expansion.
export SRC_DIR=$(cd "${0%/*}/.."; pwd)

答案 1 :(得分:12)

readlink命令不仅可以解析符号链接,还可以规范相对路径。请注意,因为您可能不希望在所有脚本中解析符号链接的行为。如果您不想解析符号链接,pwd将是最好的;请注意使用子shell,因此cd命令不会影响主shell中的工作目录。

# The path you want to get information on... (for readability)
your_path=..

# Using /bin/readlink (resolves symlinks)
export SRC_DIR=$(readlink --canonicalize $your_path)

# Using /usr/bin/dirname (keeps symlinks)
export SRC_DIR=$(cd $your_path ; pwd)

答案 2 :(得分:8)

我通常使用

SCRIPT_DIR=$(readlink -f ${0%/*})

它应该返回脚本的完整路径,甚至可以解决沿途的所有链接。

答案 3 :(得分:1)

挖出这个旧线程以添加我发现可以正常工作的内容:

export SRC_DIR =`realpath ..

在此处查看更多信息:

http://man7.org/linux/man-pages/man3/realpath.3.html

答案 4 :(得分:0)

请改为:

export SRC_DIR=`pwd`;

<强>更新

由于您需要相对于文件系统上脚本位置的路径,请改为使用:

export SRC_DIR=`dirname $0`

<强> UPDATE2:

您的脚本必须直接调用,而不是bash /path/to/script.shsource foo.sh。添加shebang line,添加执行权限并直接调用脚本。

答案 5 :(得分:0)

当我这样做时,我会像这样使用echo:

export SRC_DIR=`echo $HOME/bin/`

答案 6 :(得分:0)

用于保留错误代码:

function getPwd() {
    $(cd $1; [[ $? -ne 0 ]] && exit 1 || echo echo $PWD;)
    return $?
}