当前目录的Shell脚本?

113
当前目录是指shell脚本所在的目录吗?还是指我调用它的当前目录?

请参阅什么是当前工作目录?,该问题表面上与Python有关,但在这里也相关。 - tripleee
7个回答

210

正如已经提到的,位置将是脚本被调用的位置。如果您希望脚本引用其安装位置,这很简单。以下是一个代码片段,它将打印PWD和安装目录:

#!/bin/bash
echo "Script executed from: ${PWD}"

BASEDIR=$(dirname $0)
echo "Script location: ${BASEDIR}"

这对我不起作用。它只给出包含目录的名称,而不是完整路径。例如,如果我在/home/user/scripts/x.sh脚本中执行此操作,它将返回scripts,而不是/home/user/scripts - Synchro
2
我认为这是因为您的当前工作目录是/home/user,并且您通过scripts/x.sh调用了脚本。因此,脚本内部的$0值为scripts/x.sh。为了获取脚本的绝对路径,您可以使用BASEDIR=$(cd $(dirname $0) && pwd) - mnabil

74

大多数答案都可以获取当前路径并具有上下文感知性。为了能够从任何目录运行脚本,请使用以下代码片段。

DIR="$( cd "$( dirname "$0" )" && pwd )"

通过在子shell中切换目录,我们可以调用pwd并获取脚本的正确路径,而不受上下文影响。

然后你可以使用$DIR作为"$DIR/path/to/file"


你能解释一下发生了什么吗?当我的脚本同时运行超过20次时,我会收到以下错误提示: ....sh: fork: retry: Resource temporarily unavailable 该脚本由OpenVPN运行。(在nogroup组和nobody帐户下) - HosseyNJF
这个例子的另一个优点是,在Systemd单元文件调用shell脚本时,readlinkrealpath无法工作。因此,这是我目前发现的最具可移植性的POSIX解决方案。 - Lanti

21

脚本的当前(初始)目录是您调用脚本的目录。


8

当运行pwd时,您可以通过检查输出来自己完成此操作。这将打印出您当前所在的目录,而不是脚本所在的目录。

如果您的脚本没有切换目录,它将打印您运行脚本的目录。


5

补充这个评论,我认为最优化和最合理的方式是:

realpath `dirname $0`

或者

realpath $(dirname $0)

如何链接到评论 - Y. E.

1
要打印当前工作目录,即pwd,只需键入如下命令:
echo "the PWD is : ${PWD}"

1
你是想表达 ${PWD} 吗?Shell 变量名区分大小写,并且传统上使用大写字母。${pwd} 不是预定义的变量名,除非你明确地将其设置为某个值。 - Z4-tier
$(pwd)可能更好。 - jdenoc

0

你也可以完全使用posix shell脚本实现它

#!/bin/sh

get_current_directory() {
    current_file="${PWD}/${0}"
    echo "${current_file%/*}"
}

CWD=$(get_current_directory)
echo "$CWD"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接