You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 09:35:27