我正在写一个Bash脚本。我需要当前工作目录始终是脚本所在的目录。
默认行为是脚本中的当前工作目录是我从中运行它的shell的目录,但我不想要这种行为。
我正在写一个Bash脚本。我需要当前工作目录始终是脚本所在的目录。
默认行为是脚本中的当前工作目录是我从中运行它的shell的目录,但我不想要这种行为。
当前回答
试试下面这些简单的语句:
适用于所有UNIX/OSX/Linux
dir=$(cd -P -- "$(dirname -- "$0")" && pwd -P)
Bash
dir=$(cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)
注意:双破折号(——)在命令中用于表示命令选项的结束,因此包含破折号或其他特殊字符的文件不会中断命令。
注意:在Bash中,使用${BASH_SOURCE[0]}来代替$0,否则在源路径(source/.)时路径会中断。
对于Linux, Mac和其他*BSD:
cd "$(dirname "$(realpath "$0")")";
注意:默认情况下,realpath应该安装在最流行的Linux发行版中(如Ubuntu),但在某些情况下,它可能会丢失,所以你必须安装它。
注意:如果您正在使用Bash,请使用${BASH_SOURCE[0]}来代替$0,否则该路径会在源文件(source/.)时中断。
否则,你可以尝试类似的东西(它将使用第一个现有的工具):
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中,你可以使用参数展开来实现这一点,比如:
cd "${0%/*}"
但是,如果脚本在同一个目录中运行,那么它就不起作用。
或者你也可以在bash中定义以下函数:
realpath () {
[[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"
}
这个函数有一个参数。如果参数已经有绝对路径,则打印它,否则打印$PWD变量+文件名参数(不带。/前缀)。
或者这里是从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脚本绝对路径与OS X Bash脚本获取自身完整路径的可靠方法
参见:
如何在Mac上获得GNU的readlink -f的行为?
其他回答
获取脚本的真实路径
if [ -L $0 ] ; then
ME=$(readlink $0)
else
ME=$0
fi
DIR=$(dirname $ME)
(这是对我这里相同问题的回答:获取脚本执行的目录的名称)
试试下面这些简单的语句:
适用于所有UNIX/OSX/Linux
dir=$(cd -P -- "$(dirname -- "$0")" && pwd -P)
Bash
dir=$(cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)
注意:双破折号(——)在命令中用于表示命令选项的结束,因此包含破折号或其他特殊字符的文件不会中断命令。
注意:在Bash中,使用${BASH_SOURCE[0]}来代替$0,否则在源路径(source/.)时路径会中断。
对于Linux, Mac和其他*BSD:
cd "$(dirname "$(realpath "$0")")";
注意:默认情况下,realpath应该安装在最流行的Linux发行版中(如Ubuntu),但在某些情况下,它可能会丢失,所以你必须安装它。
注意:如果您正在使用Bash,请使用${BASH_SOURCE[0]}来代替$0,否则该路径会在源文件(source/.)时中断。
否则,你可以尝试类似的东西(它将使用第一个现有的工具):
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中,你可以使用参数展开来实现这一点,比如:
cd "${0%/*}"
但是,如果脚本在同一个目录中运行,那么它就不起作用。
或者你也可以在bash中定义以下函数:
realpath () {
[[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"
}
这个函数有一个参数。如果参数已经有绝对路径,则打印它,否则打印$PWD变量+文件名参数(不带。/前缀)。
或者这里是从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脚本绝对路径与OS X Bash脚本获取自身完整路径的可靠方法
参见:
如何在Mac上获得GNU的readlink -f的行为?
如果你只是需要打印当前的工作目录,那么你可以这样做。
$ vim test
#!/bin/bash
pwd
:wq to save the test file.
给予执行权限:
chmod u+x test
然后通过./test执行脚本,然后可以看到当前的工作目录。
cd "`dirname $(readlink -f ${0})`"
echo $PWD
PWD是一个环境变量。