WSL环境下bash脚本无法切换转换后的Windows路径问题求助
WSL环境下bash脚本无法切换转换后的Windows路径问题求助
我之前查了类似问题也试了别人给的答案,但都没解决。现在我在WSL里想写个简单的脚本cdw,把Windows路径转成WSL能识别的路径,然后切换过去,脚本代码是这样的:
#!/bin/bash input_path="$1" # Replace backslashes with forward slashes new_path="${input_path//\\//}" # Replace drive letter with linux mount path new_path="${new_path/Z:/\/mnt\/z}" echo "$new_path" cd "$new_path"
但是运行的时候,比如输入./cdw.sh 'Z:\test',虽然正确输出了/mnt/z/test,但当前目录还是没切换,还是停在原来的/mnt/z:
user1: /mnt/z $ ./cdw.sh 'Z:\test' /mnt/z/test user1: /mnt/z $
有没有什么我漏掉的简单点的问题呀?
嗨,这个问题其实很多刚写bash脚本的朋友都会踩坑!核心原因是脚本默认会在一个新的子shell进程里运行,你在脚本里执行cd,只是切换了子shell的工作目录,当脚本运行结束,子shell退出,回到原来的父shell,目录自然就没变啦。
给你两个简单的解决办法:
用source命令运行脚本
不要直接./cdw.sh,而是用source ./cdw.sh 'Z:\test'或者简写.(点号):. ./cdw.sh 'Z:\test'这样脚本会在当前shell进程里执行,
cd命令就能直接改变当前的工作目录了。把脚本改成shell函数
如果你经常要用这个功能,不如把它写成一个函数放到你的~/.bashrc或者~/.zshrc里(看你用的是bash还是zsh):cdw() { input_path="$1" new_path="${input_path//\\//}" new_path="${new_path/Z:/\/mnt\/z}" echo "$new_path" cd "$new_path" }保存之后,执行
source ~/.bashrc(或者对应的配置文件),之后直接在命令行打cdw 'Z:\test'就能切换目录啦,比脚本还方便~
另外补充个小细节:如果你的脚本要支持多个盘符,比如C、D盘,可以把替换盘符的部分改成更通用的写法,比如用正则匹配:
new_path=$(echo "$input_path" | sed -e 's/\\/\//g' -e 's/^\([A-Z]\):/\/mnt\/\L\1/')
这样不管是Z盘还是C盘,都能自动转换成/mnt/c、/mnt/z这种路径了。
备注:内容来源于stack exchange,提问作者Patrik G
相关产品推荐
相关产品推荐

