jam*_*her 500 bash scripting path
我正在写一个bash脚本.我需要当前的工作目录始终是脚本所在的目录.
默认行为是脚本中的当前工作目录是我运行它的shell的目录,但我不想要这种行为.
ndi*_*dim 584
#!/bin/bash
cd "$(dirname "$0")"
Run Code Online (Sandbox Code Playgroud)
小智 306
以下也有效:
cd "${0%/*}"
Run Code Online (Sandbox Code Playgroud)
语法中充分地阐述这个 StackOverflow的答案.
ken*_*orb 171
尝试以下简单的单行:
适用于所有UNIX/OSX/Linux
dir=$(cd -P -- "$(dirname -- "$0")" && pwd -P)
Run Code Online (Sandbox Code Playgroud)
注意:命令中使用双短划线( - )表示命令选项的结束,因此包含短划线或其他特殊字符的文件不会破坏命令.
对于Linux,Mac和其他*BSD:
dir=$(cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)
Run Code Online (Sandbox Code Playgroud)
白色空间支持:
cd "$(dirname "$(realpath "$0")")";
Run Code Online (Sandbox Code Playgroud)
注意:${BASH_SOURCE[0]}默认情况下应该安装在最流行的Linux发行版中(比如Ubuntu),但在某些情况下它可能会丢失,所以你必须安装它.
否则你可以尝试类似的东西(它将使用第一个现有的工具):
cd "$(dirname "$(readlink -f "$0" || realpath "$0")")"
Run Code Online (Sandbox Code Playgroud)
对于Linux特定:
cd "$(dirname "$(readlink -f "$0")")"
Run Code Online (Sandbox Code Playgroud)
在*BSD/Mac上使用GNU readlink:
cd "$(dirname "$(greadlink -f "$0")")"
Run Code Online (Sandbox Code Playgroud)
注意:您需要$0安装(例如1.安装Homebrew,2.source).
在bash中
在bash中,您可以使用参数扩展来实现这一点,例如:
cd "${0%/*}"
Run Code Online (Sandbox Code Playgroud)
但如果脚本从同一目录运行,则它不起作用.
或者,您可以在bash中定义以下函数:
realpath () {
[[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"
}
Run Code Online (Sandbox Code Playgroud)
此函数需要1个参数.如果参数已经是绝对路径,则按原样打印,否则打印.变量+文件名参数(不带realpath前缀).
或者这是从Debian ${BASH_SOURCE[0]}文件中获取的版本:
function realpath()
{
f=$@
if [ -d "$f" ]; then
base=""
dir="$f"
else
base="/$(basename "$f")"
dir=$(dirname "$f")
fi
dir=$(cd "$dir" && /bin/pwd)
echo "$dir$base"
}
Run Code Online (Sandbox Code Playgroud)
有关:
也可以看看:
Dan*_*ing 66
cd "$(dirname "${BASH_SOURCE[0]}")"
Run Code Online (Sandbox Code Playgroud)
这很简单.有用.
And*_*ken 16
这里有很多正确的答案,但对我来说更有用的一个(确保脚本的相对路径保持可预测/工作)是使用 Pushd/popd:
pushd "$(dirname ${BASH_SOURCE:0})"
trap popd EXIT
# ./xyz, etc...
Run Code Online (Sandbox Code Playgroud)
这会将源文件的目录推送到导航堆栈,从而更改工作目录,但是,当脚本退出(无论出于何种原因,包括失败)时,将trap运行popd,在执行之前恢复当前工作目录。如果脚本执行后cd失败,则执行结束后您的终端可能会处于不可预测的状态 - 陷阱可以防止这种情况发生。
对于没有在其他地方进行符号链接(例如)的脚本,可接受的答案很好用$PATH。
#!/bin/bash
cd "$(dirname "$0")"
Run Code Online (Sandbox Code Playgroud)
但是,如果脚本是通过符号链接运行的,
ln -sv ~/project/script.sh ~/bin/;
~/bin/script.sh
Run Code Online (Sandbox Code Playgroud)
这将进入~/bin/目录,而不是~/project/目录cd ,如果的目的cd是包括相对于Windows的依赖关系,则可能会破坏脚本。~/project/
symlink安全答案如下:
#!/bin/bash
cd "$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")"
Run Code Online (Sandbox Code Playgroud)
readlink -f 需要解析潜在的符号链接文件的绝对路径。
需要使用引号来支持可能包含空格的文件路径(不好的做法,但不能肯定不会出现这种情况)
这个脚本似乎对我有用:
#!/bin/bash
mypath=`realpath $0`
cd `dirname $mypath`
pwd
Run Code Online (Sandbox Code Playgroud)
无论我从哪里运行脚本,pwd 命令行都会将脚本的位置作为当前工作目录进行回显。
| 归档时间: |
|
| 查看次数: |
349129 次 |
| 最近记录: |