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

Jim*_*imm 35 linux bash

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

export SRC_DIR=..
export LIBPATH=${SRC_DIR}/lib
Run Code Online (Sandbox Code Playgroud)

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

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

Tod*_*obs 58

在Subshel​​l中更改目录

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

export SRC_DIR=$(cd ..; pwd)
Run Code Online (Sandbox Code Playgroud)

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

要从脚本的位置(而不是当前工作目录)更改为相对路径,可以使用参数扩展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)
Run Code Online (Sandbox Code Playgroud)


mbe*_*lls 14

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)
Run Code Online (Sandbox Code Playgroud)


Ler*_*ing 9

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

导出 SRC_DIR = `真实路径 ..`

在这里查看更多信息:

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

  • 对于大多数系统来说这是一个更好的解决方案 (3认同)
  • 然而,当“realpath”可用时,它绝对是最简单且最好的解决方案。 (2认同)

cho*_*oba 8

我经常使用

SCRIPT_DIR=$(readlink -f ${0%/*})
Run Code Online (Sandbox Code Playgroud)

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


jma*_*man 0

改为这样做:

export SRC_DIR=`pwd`;
Run Code Online (Sandbox Code Playgroud)

更新:

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

export SRC_DIR=`dirname $0`
Run Code Online (Sandbox Code Playgroud)

更新2:

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