我如何找到一个Bash脚本位于该脚本内部的目录的路径?
我想用Bash脚本作为另一个应用程序的启动器,我想将工作目录更改为Bash脚本所在的目录,所以我可以在该目录中的文件上运行,如下:
$ ./application
我如何找到一个Bash脚本位于该脚本内部的目录的路径?
我想用Bash脚本作为另一个应用程序的启动器,我想将工作目录更改为Bash脚本所在的目录,所以我可以在该目录中的文件上运行,如下:
$ ./application
当前回答
我用三种不同的处决尝试了追踪。
echo $(实际上是 $_)
. application # /correct/path/to/dir or /path/to/temporary_dir
bash application # /path/to/bash
/PATH/TO/application # /correct/path/to/dir
echo $(相当于 $(相当于 $0))
. application # failed with `realpath: missing operand`
bash application # /correct/path/to/dir
/PATH/TO/application # /correct/path/to/dir
echo $(相当于 $BASH_SOURCE)
$BASH_SOURCE 基本上与 ${BASH_SOURCE[0]} 相同。
. application # /correct/path/to/dir
bash application # /correct/path/to/dir
/PATH/TO/application # /correct/path/to/dir
只有$(实际上是$BASH_SOURCE)似乎是可靠的。
其他回答
还有另一个选项:
SELF=$(SELF=$(dirname "$0") && bash -c "cd \"$SELF\" && pwd")
echo "$SELF"
它在 macOS 上也起作用,确定了频道路径,并且不会改变当前的目录。
我认为最简单的答案是原始变量的参数扩展:
#!/usr/bin/env bash
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
echo "opt1; original answer: $DIR"
echo ''
echo "opt2; simple answer : ${BASH_SOURCE[0]%/*}"
它应该产生产量如:
$ /var/tmp/test.sh
opt1; original answer: /var/tmp
opt2; simple answer : /var/tmp
变量/参数扩展 ${BASH_SOURCE[0]%/*}”似乎更容易保持。
这应该是这样做的:
DIR="$(dirname "$(realpath "$0")")"
这与路线上的交线和空间一起工作。
请参见男人的页面为 dirname 和 realpath。
请添加关于如何支持MacOS的评论,对不起,我可以验证。
我想确保剧本在其目录中运行。
cd $(dirname $(which $0) )
接下来,如果你真的想知道你在哪里运行,然后运行下面的命令。
DIR=$(/usr/bin/pwd)
对于具有 GNU coreutils readlink 的系统(例如,Linux):
$(readlink -f "$(dirname "$0")")
您不需要使用 BASH_SOURCE 当 $0 包含脚本文件名时。