为何在当前目录运行Bash脚本时,命令执行在主目录?
问题原因与解决方法
你的问题核心是脚本执行时的工作目录被意外切换到主目录,结合你给出的脚本和现象,主要有以下几种可能及对应解法:
1. 脚本语法错误导致意外跳转目录
你尝试的部分脚本存在bash语法错误,触发了默认跳转主目录的行为:
- 第三个脚本
variable = $PWD:bash变量赋值时=前后不能有空格,这会导致命令执行失败,后续cd $variable中$variable为空,cd不带参数默认跳转主目录; - 第四个脚本
variable=pwd``:=后有空格会让bash把variable=当成无效命令,pwd单独执行后$variable依然为空,同样触发cd跳转主目录。
解法:
- 修复脚本语法:变量赋值的正确写法是
variable=$PWD或variable=$(pwd); - 若无需切换目录,直接执行
touch test.txt即可,子shell会继承你运行脚本时的当前工作目录。
2. 脚本运行方式错误
如果你用source script.sh或. script.sh执行脚本,脚本会在当前zsh环境中运行(而非子shell),此时脚本中的错误会直接改变当前shell的工作目录。
解法:
- 用子shell执行脚本:在当前目录下运行
./script.sh(先给脚本加可执行权限:chmod +x script.sh); - 若必须用
source执行,先排查并修复脚本中的所有语法错误。
3. 执行路径导致工作目录异常
如果你用绝对路径运行脚本(比如bash ~/script.sh),且脚本未指定工作目录,会默认基于脚本所在目录执行操作,而非你当前所在的目录。
解法:
- 若要在你运行脚本的当前目录执行操作,无需添加
cd命令,直接写目标命令即可; - 若要固定在脚本所在目录执行操作,可在脚本开头添加:
这段代码会自动切换到脚本所在目录,再执行后续命令。#!/bin/bash cd "$(dirname "$0")" || exit 1 touch test.txt
快速验证方法
在脚本开头添加一行打印当前工作目录的代码,就能明确脚本实际运行的目录:
#!/bin/bash echo "脚本当前工作目录: $PWD" touch test.txt
运行后查看输出,再针对性调整脚本或执行方式即可。
内容的提问来源于stack exchange,提问作者Janek Eilts
相关产品推荐
相关产品推荐

