我正在编写一个脚本来使用 bash 在 linux 2.6 上设置环境变量。所以脚本包含如下命令:
export SRC_DIR=..
export LIBPATH=${SRC_DIR}/lib
问题是,当我尝试执行 echo $LIBPATH 时,它显示“../lib”,而不是将 SRC_DIR 扩展到完整路径。我真的希望脚本打印 /home/x/lib 之类的东西,而不是 ../lib。
更新脚本应该将 SRC_DIR 评估为从脚本位置向上的一个目录,而不是调用脚本的当前目录
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)
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)
该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)
我通常使用
SCRIPT_DIR=$(readlink -f ${0%/*})
它应该返回脚本的完整路径,甚至可以解析所有的链接。
挖掘这个旧线程以添加我发现效果很好的内容:
导出 SRC_DIR = `realpath ..`
在此处查看更多信息:
当我这样做时,我像这样使用 echo:
export SRC_DIR=`echo $HOME/bin/`
改为这样做:
export SRC_DIR=`pwd`;
更新:
由于您想要相对于文件系统上脚本位置的路径,请改用:
export SRC_DIR=`dirname $0`
更新2:
您的脚本必须直接调用,而不是作为bash /path/to/script.sh
or source foo.sh
。添加shebang 行,添加执行权限并直接调用脚本。
为了保留错误代码:
function getPwd() {
$(cd $1; [[ $? -ne 0 ]] && exit 1 || echo echo $PWD;)
return $?
}