39

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

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

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

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

4

7 回答 7

63

Change Directory in Subshell

There's a little trick you can use to get the absolute path from a relative path without changing the present working directory. The trick is to move to the relative path in a subshell, and then expand the working directory. For example:

export SRC_DIR=$(cd ..; pwd)

Relative Paths from Script Instead of Invocation Directory

To change to a relative path from a script's location, rather than the current working directory, you can use a parameter expansion or the dirname utility. I prefer dirname, since it's a little more explicit. Here are both examples.

# 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)
于 2012-07-23T23:01:34.263 回答
16

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)
于 2014-02-10T21:10:07.597 回答
9

我通常使用

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

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

于 2012-07-23T23:17:00.953 回答
3

挖掘这个旧线程以添加我发现效果很好的内容:

导出 SRC_DIR = `realpath ..`

在此处查看更多信息:

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

于 2019-05-23T10:38:28.127 回答
1

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

export SRC_DIR=`echo $HOME/bin/`
于 2012-08-09T06:49:39.043 回答
0

改为这样做:

export SRC_DIR=`pwd`;

更新:

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

export SRC_DIR=`dirname $0`

更新2:

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

于 2012-07-23T22:51:49.200 回答
0

为了保留错误代码:

function getPwd() {
    $(cd $1; [[ $? -ne 0 ]] && exit 1 || echo echo $PWD;)
    return $?
}
于 2018-07-17T14:00:47.797 回答