我正在编写一个脚本,使用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
您可以使用一个小技巧从相对路径获取绝对路径而不更改当前工作目录.诀窍是移动到子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)
挖掘这个旧线程以添加我发现效果很好的内容:
导出 SRC_DIR = `真实路径 ..`
在这里查看更多信息:
http://man7.org/linux/man-pages/man3/realpath.3.html
我经常使用
SCRIPT_DIR=$(readlink -f ${0%/*})
Run Code Online (Sandbox Code Playgroud)
它应该返回脚本的完整路径,甚至可以解决沿途的所有链接.
改为这样做:
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.sh或source foo.sh调用。添加shebang行,添加执行权限,直接调用脚本。
| 归档时间: |
|
| 查看次数: |
40942 次 |
| 最近记录: |