如何在非脚本所在目录执行脚本时输出该脚本的存放路径?
嗨,这事儿好办!要让你的脚本输出它自己的存放目录,得用能获取脚本绝对路径的方法——毕竟你可能用不同的方式运行它(比如绝对路径、相对路径)。这里有两种靠谱的实现方式:
方法1:用
readlink + dirname(最通用) 这是Linux系统下最常用的方案,还能处理符号链接的情况:
在你的abc.sh里添加以下代码:
#!/bin/bash # 获取脚本的完整绝对路径(自动解析符号链接) full_script_path=$(readlink -f "$0") # 从完整路径中提取脚本所在的目录 script_dir=$(dirname "$full_script_path") # 输出目标路径 echo "$script_dir"
简单解释下:
$0代表脚本本身的名称/路径,你用绝对路径运行时它就是绝对路径,用相对路径运行时就是相对路径;readlink -f "$0"会把$0解析成真实的绝对路径,哪怕脚本是符号链接也能正确指向原始文件的位置;dirname则从完整路径里剥离出目录部分,也就是你要的/home/path/to/script。
方法2:用
realpath(更简洁) 如果你的系统支持realpath命令(大部分现代Linux发行版都自带),可以用更简洁的写法:
#!/bin/bash script_dir=$(realpath "$(dirname "$0")") echo "$script_dir"
逻辑很直观:
dirname "$0"先拿到脚本所在的相对/绝对目录;realpath直接把这个路径转换成绝对路径,一步到位得到你需要的结果。
避坑提醒
别直接用dirname "$0"!如果哪天你用相对路径运行脚本(比如sh ../script/abc.sh),dirname "$0"只会返回../script这种相对路径,而上面两种方法都能确保输出的是完整的绝对目录。
内容的提问来源于stack exchange,提问作者bosari
相关产品推荐
相关产品推荐

