如何将当前工作目录设置为脚本的目录?

我正在写一个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,按原样打印,否则打印$PWDvariables+文件名参数(不带./前缀)。

或者这里是从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执行脚本,你可以看到当前的工作目录。