Linux bash脚本中用变量执行cd命令无法切换目录如何解决?
问题原因
你遇到的cd不生效是Linux Shell的通用机制,和你用变量传路径没有本质关联:
- 直接执行
./你的脚本名称.sh时,系统会启动一个独立的子Shell进程运行脚本内容 - 脚本里的
cd命令只会修改这个子Shell的当前工作目录,脚本执行结束后子进程销毁,你当前操作的父Shell环境完全不受影响 - 额外注意你的代码中
cd $wrk没有加引号,如果路径包含空格、特殊字符也会导致执行失败,建议统一改成cd "$wrk"的写法
可用解决方案
场景1:需要脚本执行完后,你当前操作的终端窗口目录切换到目标路径
使用source或者.命令执行脚本,让脚本内容直接在当前Shell进程中运行,不会启动独立子进程:
source ./你的脚本名称.sh # 简写写法 . ./你的脚本名称.sh
场景2:只需要脚本后续的命令都在目标路径下执行,不需要影响当前操作的终端目录
无需修改执行方式,只要在cd命令后加校验逻辑,确认切换成功再执行后续操作即可,调整后的代码参考:
#!/bin/bash current=$(pm2 l | grep online | grep 7701 | awk ' { print $2 } ') echo $current stop=$(pm2 l | grep stopped | grep 7701 | awk ' { print $2 } ') echo $stop wrk=$(pm2 show $stop | grep cwd | awk ' { print $5 } ' ) pwd export wrk="$(pm2 show $stop | grep cwd | awk ' { print $5 } ' )" echo $wrk # 加引号避免路径含特殊字符报错,加判断提前感知切换失败问题 if cd "$wrk"; then echo "成功切换到目录:$wrk" # 后续需要在该目录下执行的命令都写在这个分支里即可 else echo "切换目录失败,请检查路径$wrk是否存在、权限是否正常" exit 1 fi
调整后脚本内cd之后的所有命令都会在$wrk对应的路径下正常执行。
内容的提问来源于stack exchange,提问作者sohan Dogra
相关产品推荐
相关产品推荐

