bash - current - shell get script full path
我在写一个bash脚本。 我需要当前的工作目录始终是脚本所在的目录。
默认行为是脚本中的当前工作目录是我从中运行它的shell的工作目录,但我不想要这种行为。
如果你只需要打印当前工作目录,那么你可以按照这个。
$ vim test
#!/bin/bash
pwd
:wq to save the test file.
给予执行权限:
chmod u+x test
然后通过./test
执行脚本,然后你可以看到当前的工作目录。
试试以下简单的一行:
适用于所有UNIX / OSX / Linux
dir=$(cd -P -- "$(dirname -- "$0")" && pwd -P)
注意:在命令中使用双短划线( - )来表示命令选项的结束,因此包含破折号或其他特殊字符的文件不会破坏命令。
对于Linux,Mac和其他* BSD:
cd $(dirname $(realpath $0))
使用空格支持:
cd "$(dirname "$(realpath "$0")")";
注意: realpath
应该默认安装在最流行的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来实现该功能,如:
cd ${0%/*}
但如果脚本是从同一个目录运行的,则它不起作用。
或者,您可以在bash中定义以下函数:
realpath () {
[[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"
}
该函数需要1个参数。 如果参数已经有绝对路径,按原样打印它,否则打印$PWD
变量+文件名参数(不带./
前缀)。
或者这里是从Debian .bashrc
文件中取得的版本:
function realpath()
{
[email protected]
if [ -d "$f" ]; then
base=""
dir="$f"
else
base="/$(basename "$f")"
dir=$(dirname "$f")
fi
dir=$(cd "$dir" && /bin/pwd)
echo "$dir$base"
}
有关:
也可以看看:
这个脚本似乎适用于我:
#!/bin/bash
mypath=`realpath $0`
cd `dirname $mypath`
pwd
无论我从哪里运行,pwd命令行都会将脚本的位置作为当前工作目录回显。
cd "$(dirname ${BASH_SOURCE[0]})"
这很容易。 有用。
cd "`dirname $(readlink -f ${0})`"
echo $PWD | rev | cut -d'/' -f1 | rev