如何将当前工作目录设置为脚本的目录?
我正在写一个bash脚本。 我需要当前的工作目录始终是脚本所在的目录。
默认行为是脚本中的当前工作目录是我从中运行它的shell的工作目录,但是我不想要这种行为。
#!/bin/bash cd "$(dirname "$0")"
以下内容也适用:
cd "${0%/*}"
尝试以下简单的一行:
适用于所有UNIX / OSX / Linux
dir=$(cd -P -- "$(dirname -- "$0")" && pwd -P)
注意:在命令中使用双短划线( – )来表示命令选项的结尾,因此包含短划线或其他特殊字符的文件不会中断命令。
对于Linux,Mac和其他* BSD:
cd $(dirname $(realpath $0))
用白色空间支持:
cd "$(dirname "$(realpath "$0")")";
注意:默认情况下, realpath
应该安装在最stream行的Linux发行版中(比如Ubuntu),但是有些可能会丢失,所以你必须安装它。
否则,你可以尝试类似的东西(它将使用第一个现有的工具):
cd $(dirname $(readlink -f $0 || realpath $0))
对于Linux特定的:
cd $(dirname $(readlink -f $0))
在* BSD / Mac上使用GNU readlink:
cd $(dirname $(greadlink -f $0))
注:您需要安装coreutils
(例如1.安装Homebrew ,2. brew install coreutils
)。
在bash中
在bash中,你可以使用Parameter Expansions来实现这个function,比如:
cd ${0%/*}
但是如果脚本是从同一个目录运行的,则不起作用。
或者,你可以在bash中定义下面的函数:
realpath () { [[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}" }
这个函数需要1个参数。 如果参数已经是绝对path,按原样打印,否则打印$PWD
variables+文件名参数(不带./
前缀)。
或者这里是从Debian .bashrc
文件中取得的版本:
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" }
有关:
-
如何检测我运行我的shell脚本的当前目录?
-
从内部获取Bash脚本的源代码目录
-
Bash脚本绝对path与OSX
-
一个bash脚本可靠的方式来获得自己的完整path?
也可以看看:
如何在Mac上获得GNU的readlink -f的行为?
cd "$(dirname ${BASH_SOURCE[0]})"
这很容易。 有用。
这个脚本似乎适用于我:
#!/bin/bash mypath=`realpath $0` cd `dirname $mypath` pwd
pwd命令行回显当前工作目录的脚本位置,而不pipe从哪里运行。
获取脚本的真实path
if [ -L $0 ] ; then ME=$(readlink $0) else ME=$0 fi DIR=$(dirname $ME)
(这是对我的同样问题的答案: 获取执行脚本的目录的名称 )
cd "`dirname $(readlink -f ${0})`"
echo $PWD
PWD是一个环境variables。
如果你只需要打印目前的工作目录,那么你可以按照这个。
$ vim test #!/bin/bash pwd :wq to save the test file.
给予执行权限:
chmod u+x test
然后通过./test
执行脚本,你可以看到当前的工作目录。