WSL Ubuntu环境下readlink调用PATH目录脚本时依赖执行位置的问题咨询
WSL Ubuntu环境下readlink调用PATH目录脚本时依赖执行位置的问题咨询
嗨,我来帮你拆解这个问题哈~
首先得明白为什么会出现这种情况:你用readlink -f $1的时候,$1是你传入的相对路径(比如demo.txt),readlink默认是以当前执行脚本的工作目录为基准去解析这个路径的,而不是脚本本身所在的目录。所以当你在/usr/local/bin执行时,当前工作目录就是这个文件夹,解析出来就是/usr/local/bin/demo.txt;当你切换到/home/<user>执行时,当前工作目录变了,自然就解析成/home/<user>/demo.txt了,哪怕这个文件根本不存在。
那要解决这个问题,核心是先拿到脚本自身所在的绝对目录,再把传入的参数和这个目录拼接起来,最后用readlink解析。
修改后的脚本可以写成这样:
#!/bin/bash # 获取脚本所在的绝对路径目录 SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd) # 拼接脚本目录与传入的参数,再解析为绝对路径 echo $(readlink -f "$SCRIPT_DIR/$1")
简单解释下这段代码:
${BASH_SOURCE[0]}会返回当前脚本的路径(不管你从哪个目录执行它)dirname用来提取路径里的目录部分cd到这个目录再执行pwd,就能得到脚本所在的绝对目录了- 最后把这个目录和传入的参数拼接,再用
readlink -f解析,就能得到基于脚本所在位置的绝对路径,和你执行脚本的目录完全无关啦
你可以测试一下,不管在哪个目录运行linktest demo.txt,都会输出/usr/local/bin/demo.txt,完美解决你的问题~
备注:内容来源于stack exchange,提问作者jake_asks_short_questions
相关产品推荐
相关产品推荐

