Bash脚本当中获取当前脚本绝对路径位置
在 Bash 脚本中,一般使用命令获取当前目录,而不是直接依赖相对路径,这是因为相对路径的基础是脚本的运行位置,相对路径可能会因为脚本的运行位置不同而发生变化,导致脚本找不到指定文件或目录。获取脚本所在的目录可以使脚本更具通用性和可靠性,不论脚本从哪里被调用,都可以正确找到相关文件。
Content
1. 获取脚本所在目录的通用方法
一般使用以下命令来获取脚本的当前目录(即脚本所在的目录):
script_dir=$(cd "$(dirname "$0")" && pwd)
$0
表示脚本的文件名,是一个特殊变量。$(dirname "$0")
获取脚本所在的目录(相对路径)。cd "$(dirname "$0")"
切换到该目录,pwd
命令获取绝对路径。
这样 script_dir
就是脚本的绝对路径所在的目录。
2. 为什么不用相对路径?
相对路径依赖于执行脚本时的工作目录,如果你在不同目录下运行脚本,相对路径可能导致找不到文件。例如:
# 示例脚本 test.sh
# 如果直接使用相对路径 ./data/file.txt
cat ./data/file.txt
假设 test.sh
脚本在 /home/user/scripts
目录中,而文件 file.txt
位于 /home/user/scripts/data/
中,那么只有当用户在 /home/user/scripts
目录运行脚本时,才能找到 file.txt
。如果在其他位置运行,例如 /home/user
目录下运行 scripts/test.sh
,脚本就会找不到文件。
通过获取脚本的绝对路径,可以确保不论在哪个目录执行脚本,文件的路径都不会出错:
script_dir=$(cd "$(dirname "$0")" && pwd)
cat "$script_dir/data/file.txt"
3. $0
的作用
$0
是一个特殊变量,在 Bash 脚本中表示脚本的文件名或脚本的路径(取决于调用方式)。例如:
- 直接调用:如果用
./script.sh
调用,$0
会是./script.sh
。 - 使用绝对路径:如果用
/home/user/script.sh
调用,$0
会是/home/user/script.sh
。 - 通过
bash
调用:bash script.sh
会使$0
显示为script.sh
。
因此,通过 $0
和 dirname
可以获得脚本文件的所在目录,以构建一个可靠的绝对路径。