当前目录是指shell脚本所在的目录吗?还是指我调用它的当前目录?
正如已经提到的,位置将是脚本被调用的位置。如果您希望脚本引用其安装位置,这很简单。以下是一个代码片段,它将打印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/home/user
,并且您通过scripts/x.sh
调用了脚本。因此,脚本内部的$0
值为scripts/x.sh
。为了获取脚本的绝对路径,您可以使用BASEDIR=$(cd $(dirname $0) && pwd)
。 - mnabil大多数答案都可以获取当前路径并具有上下文感知性。为了能够从任何目录运行脚本,请使用以下代码片段。
DIR="$( cd "$( dirname "$0" )" && pwd )"
通过在子shell中切换目录,我们可以调用pwd
并获取脚本的正确路径,而不受上下文影响。
然后你可以使用$DIR
作为"$DIR/path/to/file"
....sh: fork: retry: Resource temporarily unavailable
该脚本由OpenVPN运行。(在nogroup组和nobody帐户下) - HosseyNJFreadlink
和realpath
无法工作。因此,这是我目前发现的最具可移植性的POSIX解决方案。 - Lanti脚本的当前(初始)目录是您调用脚本的目录。
当运行pwd
时,您可以通过检查输出来自己完成此操作。这将打印出您当前所在的目录,而不是脚本所在的目录。
如果您的脚本没有切换目录,它将打印您运行脚本的目录。
echo "the PWD is : ${PWD}"
${PWD}
吗?Shell 变量名区分大小写,并且传统上使用大写字母。${pwd}
不是预定义的变量名,除非你明确地将其设置为某个值。 - Z4-tier$(pwd)
可能更好。 - jdenoc你也可以完全使用posix shell脚本实现它
#!/bin/sh
get_current_directory() {
current_file="${PWD}/${0}"
echo "${current_file%/*}"
}
CWD=$(get_current_directory)
echo "$CWD"