我如何找到一个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 包含脚本文件名时。