这是一个shell脚本(.sh文件)。我需要根据当前目录创建一个绝对路径。我知道pwd
,但如何将其与另一个字符串连接?这是我想要做的一个例子:
"$pwd/some/path"
答案 0 :(得分:30)
听起来像你想要的那样:
path="$(pwd)/some/path"
$(
打开一个子shell(并且)
关闭它),其中内容作为脚本执行,因此任何输出都放在字符串中的该位置。
更有用的是获取正在运行的脚本的目录:
dot="$(cd "$(dirname "$0")"; pwd)"
path="$dot/some/path"
这更有用,因为无论您在何处运行脚本,它都会解析为相同的路径:
> pwd
~
> ./my_project/my_script.sh
~/my_project/some/path
而不是:
> pwd
~
> ./my_project/my_script.sh
~/some/path
> cd my_project
> pwd
~/my_project
> ./my_script.sh
~/my_project/some/path
更复杂但是如果你需要当前脚本的目录运行,如果它已经通过符号链接执行(例如,当通过自制程序安装脚本时常见),那么你需要解析并遵循符号链接:
if [[ "$OSTYPE" == *darwin* ]]; then
READLINK_CMD='greadlink'
else
READLINK_CMD='readlink'
fi
dot="$(cd "$(dirname "$([ -L "$0" ] && $READLINK_CMD -f "$0" || echo "$0")")"; pwd)"
更复杂,更多要求它工作(例如安装了gnu兼容的readlink)所以我倾向于不使用它。只有当我确定我需要它时,比如通过自制软件安装命令。
答案 1 :(得分:5)
在命令替换(pwd
)中使用shell内置$(...)
是一个选项,但不是必需的,因为所有与POSIX兼容的shell定义了特殊的$PWD
shell变量包含当前目录作为绝对路径,为mandated by POSIX。
因此,使用$PWD
比$(pwd)
更简单,更高效:
"$PWD/some/path" # alternatively, for visual clarity: "${PWD}/some/path"
但是,如果你想在目录路径中解析符号链接,你需要pwd
,其 -P
选项强>:
"$(pwd -P)/some/path"
请注意POSIX mandates that $PWD
contain an absolute pathname with symlinks resolved。
但实际上,没有类似POSIX的主要shell(bash
,dash
,ksh
,zsh
)可以做到这一点 - 它们都保留了符号链接组件。因此,需要(POSIX兼容)pwd -P
来解决它们
请注意,所有类似POSIX的shell都将pwd
实现为支持-P
的内置。
Michael Allen's helpful answer指出通常想知道运行脚本所在的目录。
挑战是脚本文件本身可能是符号链接,因此确定原始真实目录非平凡 ,特别是在必须携带时 This answer(我的)显示了解决方案。
答案 2 :(得分:0)
wd=`pwd`
new_path="$wd/some/path"
答案 3 :(得分:0)
与" dirname $0
"你可以获得动态路径到当前运行的scipt。
例如:您的文件位于shell文件夹中,文件名是xyz,并且在xyz文件中包含anthor文件abc。
所以放入xyz文件LIke:
php "`dirname $0`"/abc.php