【发布时间】:2010-10-12 10:28:25
【问题描述】:
【问题讨论】:
-
如果是重复的,请链接到原文。
标签: bash
【问题讨论】:
标签: bash
对于相对路径(即直接相当于 Windows 的%~dp0):
MY_PATH=$(dirname "$0")
echo "$MY_PATH"
对于绝对的规范化路径:
MY_PATH=$(dirname "$0") # relative
MY_PATH=$(cd "$MY_PATH" && pwd) # absolutized and normalized
if [[ -z "$MY_PATH" ]] ; then
# error; for some reason, the path is not accessible
# to the script (e.g. permissions re-evaled after suid)
exit 1 # fail
fi
echo "$MY_PATH"
【讨论】:
$BASH_SOURCE。来自this post。
$(dirname $(readlink $0)) 似乎有效
source script 或. script 运行脚本时,使用$0 不起作用;脚本名称不可用。
假设您输入 bash 脚本的完整路径,请使用 $0 和 dirname,例如:
#!/bin/bash
echo "$0"
dirname "$0"
示例输出:
$ /a/b/c/myScript.bash
/a/b/c/myScript.bash
/a/b/c
如有必要,将$PWD 变量的结果附加到相对路径。
编辑:添加引号来处理空格字符。
【讨论】:
$BASH_SOURCE。来自this post。
由 Stephane CHAZELAS 供稿于 c.u.s. 假设 POSIX shell:
prg=$0
if [ ! -e "$prg" ]; then
case $prg in
(*/*) exit 1;;
(*) prg=$(command -v -- "$prg") || exit;;
esac
fi
dir=$(
cd -P -- "$(dirname -- "$prg")" && pwd -P
) || exit
prg=$dir/$(basename -- "$prg") || exit
printf '%s\n' "$prg"
【讨论】:
$PATH 搜索处理脚本调用;但是,上面的 不是 POSIX。它只适用于bash。使用 which 而不是 command 和反引号而不是 $(...) 这必须在其他较旧的 shell 下运行。
ksh 等,不仅是 bash,都可以运行上述程序,但仍有相当多的人使用 Solaris 10(支持结束时间为 2018 年,还有很多年),有些甚至运行旧的 AIX 和 HP-UX。
Vlad 的代码被过度引用。应该是:
MY_PATH=`dirname "$0"`
MY_PATH=`( cd "$MY_PATH" && pwd )`
【讨论】:
echo Running from `dirname $0`
【讨论】:
$0 应该被转义 (dirname "$0")