如何在Bash中将当前工作目录设置为脚本所在的目录?

785

我正在编写一个Bash脚本,需要让当前工作目录始终是脚本所在的目录。

默认行为是脚本的当前工作目录与运行脚本的shell一样,但我不想要这种行为。


你是否考虑过在 /usr/bin 这样的地方放置一个包装脚本,以便进入(硬编码的)正确目录并执行你的脚本? - Dagg Nabbit
2
你为什么需要脚本的目录?解决潜在问题可能有更好的方法。 - bstpierre
18
我想指出的是,你所称之为“明显不良”的行为实际上是完全必要的——如果我运行 myscript path/to/file ,我希望该脚本相对于我的当前目录来评估 path/to/file ,而不是脚本所在的任何目录。此外,如果使用 ssh remotehost bash < ./myscript 运行脚本,会发生什么情况,就像 BASH FAQ 中提到的那样? - Gordon Davisson
可能是Can a Bash script tell what directory it's stored in?的重复问题。 - kenorb
4
cd "${BASH_SOURCE%/*}" || exit的翻译是:进入"${BASH_SOURCE%/*}"目录,如果失败则退出。 - caw
13个回答

1

大多数答案都无法处理通过相对路径符号链接的文件,不是一行代码或者无法处理BSD(Mac)操作系统。一个同时满足这三个条件的解决方案是:

HERE=$(cd "$(dirname "$BASH_SOURCE")"; cd -P "$(dirname "$(readlink "$BASH_SOURCE" || echo .)")"; pwd)

首先,cd到bash脚本目录的概念。然后使用readlink命令查看文件是否为符号链接(相对或其他方式),如果是,则cd到该目录。如果不是,则cd到当前目录(这是保持命令一行的必要条件)。最后通过pwd命令输出当前目录。

您可以在cd和readlink参数中添加--以避免命名为选项的目录问题,但对于大多数情况我不会这样做。

您可以在此处查看带有插图的完整说明:

https://www.binaryphile.com/bash/2020/01/12/determining-the-location-of-your-script-in-bash.html


-9
echo $PWD

PWD 是一个环境变量。


5
这只会返回脚本所在的目录,而不是调用它的目录。 - dagelf

-10
如果您只需要打印当前工作目录,则可以按照以下步骤进行。
$ vim test

#!/bin/bash
pwd
:wq to save the test file.

授予执行权限:

chmod u+x test

然后通过./test执行脚本,就可以看到当前工作目录。


4
问题是如何确保脚本在它自己的目录中运行,即使那不是工作目录。所以这并不是一个答案。无论如何,为什么不只是运行 pwd 而要这样做呢?对我来说似乎浪费了很多按键。 - underscore_d

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