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

wwtsj6pe  于 2023-05-06  发布在  Linux
关注(0)|答案(8)|浏览(180)

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

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

问题是,当我尝试执行echo $LIBPATH时,它显示“../lib”,而不是将SRC_DIR扩展为完整路径。我真的希望脚本打印类似/home/x/lib的东西,而不是../lib。
UPDATE脚本应将SRC_DIR计算为脚本位置向上的一个目录,而不是调用脚本的当前目录

hgb9j2n6

hgb9j2n61#

在Subshell中更改目录

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

export SRC_DIR=$(cd ..; pwd)

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

要从脚本位置更改为相对路径,而不是当前工作目录,可以使用参数展开或 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)
yv5phkfx

yv5phkfx2#

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)
b09cbbtk

b09cbbtk3#

我通常用

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

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

monwx1rj

monwx1rj4#

挖掘这个旧线程添加我发现工作得很好:
export SRC_DIR = realpath ..
查看更多信息这里:
http://man7.org/linux/man-pages/man3/realpath.3.html

jljoyd4f

jljoyd4f5#

当我这样做时,我使用echo如下:

export SRC_DIR=`echo $HOME/bin/`
dojqjjoe

dojqjjoe6#

请改为执行以下操作:

export SRC_DIR=`pwd`;

更新:

由于您需要相对于脚本在文件系统上的位置的路径,请使用以下命令:

export SRC_DIR=`dirname $0`

更新2:

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

qcbq4gxm

qcbq4gxm7#

用于保存错误代码:

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

qv7cva1a8#

这里没有一个解决方案对我有效(对于zsh)。我想到了这个

#!/usr/bin/env bash

your_path="/Users/usr/Documents/Folder/Another/../../../Documents/SomeFile.dmg"

resolved=$(readlink -f "$your_path")
echo "$resolved"

给了我:

/Users/usr/Documents/SomeFile.dmg

请注意,$your_path中的路径必须存在。

相关问题