我正在写一个Bash脚本。我需要当前工作目录始终是脚本所在的目录。
默认行为是脚本中的当前工作目录是我从中运行它的shell的目录,但我不想要这种行为。
我正在写一个Bash脚本。我需要当前工作目录始终是脚本所在的目录。
默认行为是脚本中的当前工作目录是我从中运行它的shell的目录,但我不想要这种行为。
当前回答
接受的答案适用于没有符号链接到其他地方的脚本,例如到$PATH。
#!/bin/bash
cd "$(dirname "$0")"
然而,如果脚本是通过符号链接运行的,
ln -sv ~/project/script.sh ~/bin/;
~/bin/script.sh
这将cd到~/bin/目录,而不是~/project/目录,如果cd的目的是包含相对于~/project/的依赖项,这可能会破坏您的脚本
符号链接安全的答案如下:
#!/bin/bash
cd "$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" # cd current directory
需要Readlink -f来解析潜在符号链接文件的绝对路径。
需要引号来支持可能包含空格的文件路径(不好的做法,但假设情况不是这样也不安全)
其他回答
获取脚本的真实路径
if [ -L $0 ] ; then
ME=$(readlink $0)
else
ME=$0
fi
DIR=$(dirname $ME)
(这是对我这里相同问题的回答:获取脚本执行的目录的名称)
接受的答案适用于没有符号链接到其他地方的脚本,例如到$PATH。
#!/bin/bash
cd "$(dirname "$0")"
然而,如果脚本是通过符号链接运行的,
ln -sv ~/project/script.sh ~/bin/;
~/bin/script.sh
这将cd到~/bin/目录,而不是~/project/目录,如果cd的目的是包含相对于~/project/的依赖项,这可能会破坏您的脚本
符号链接安全的答案如下:
#!/bin/bash
cd "$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" # cd current directory
需要Readlink -f来解析潜在符号链接文件的绝对路径。
需要引号来支持可能包含空格的文件路径(不好的做法,但假设情况不是这样也不安全)
大多数答案要么不处理通过相对路径进行符号链接的文件,要么不是一行程序,要么不处理BSD (Mac)。同时满足这三个要求的解决方案是:
HERE=$(cd "$(dirname "$BASH_SOURCE")"; cd -P "$(dirname "$(readlink "$BASH_SOURCE" || echo .)")"; pwd)
首先,cd到bash脚本目录的概念。然后重新链接该文件以查看它是否是符号链接(相对或其他),如果是,则cd到该目录。如果不是,则cd到当前目录(必须保持一行程序)。然后通过pwd回显当前目录。
您可以将——添加到cd和readlink的参数中,以避免目录名称类似于选项的问题,但出于大多数目的,我不这么做。
你可以在这里看到完整的解释和插图:
https://www.binaryphile.com/bash/2020/01/12/determining-the-location-of-your-script-in-bash.html
cd "$(dirname "${BASH_SOURCE[0]}")"
很容易。它的工作原理。
#!/bin/bash
cd "$(dirname "$0")"