我正在编写一个Bash脚本,需要让当前工作目录始终是脚本所在的目录。
默认行为是脚本的当前工作目录与运行脚本的shell一样,但我不想要这种行为。
大多数答案都无法处理通过相对路径符号链接的文件,不是一行代码或者无法处理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
echo $PWD
PWD 是一个环境变量。
$ vim test
#!/bin/bash
pwd
:wq to save the test file.
授予执行权限:
chmod u+x test
然后通过./test
执行脚本,就可以看到当前工作目录。
pwd
而要这样做呢?对我来说似乎浪费了很多按键。 - underscore_d
myscript path/to/file
,我希望该脚本相对于我的当前目录来评估path/to/file
,而不是脚本所在的任何目录。此外,如果使用ssh remotehost bash < ./myscript
运行脚本,会发生什么情况,就像 BASH FAQ 中提到的那样? - Gordon Davissoncd "${BASH_SOURCE%/*}" || exit
的翻译是:进入"${BASH_SOURCE%/*}"目录,如果失败则退出。 - caw