如何在Shell脚本中实现Poetry Shell的自动切换与激活?
解决方案
问题出在你用source执行脚本的方式:当处于poetry子shell中时,脚本里的exit会直接退出当前子shell,而脚本中exit之后的代码是在子shell中运行的,子shell退出后后续逻辑自然无法执行。改用shell函数可以完美解决这个问题,因为函数的执行上下文是父shell,子shell退出后父shell会继续执行函数剩余逻辑。
步骤1:定义shell函数
将以下函数添加到你的shell配置文件中(比如~/.bashrc、~/.zshrc):
fdev() { # 检测当前是否处于poetry激活的shell,是则退出子shell if [[ -n "$POETRY_ACTIVE" ]]; then exit fi # 切换到data-warehouse目录并激活poetry shell cd ~/repos/data-warehouse || { echo "无法进入data-warehouse目录" >&2; return 1; } poetry shell # 退出data-warehouse的shell后,自动切换到etl目录并激活对应shell cd ../etl || { echo "无法进入etl目录" >&2; return 1; } poetry shell }
步骤2:生效配置
保存配置文件后,执行命令让配置生效:
source ~/.bashrc # 如果你用bash # 或者 source ~/.zshrc # 如果你用zsh
效果说明
- 首次执行
fdev:直接进入data-warehouse目录的poetry shell; - 在
data-warehouse的shell中执行fdev:自动退出当前子shell,回到父shell后继续执行函数逻辑,进入etl目录的poetry shell; - 在
etl的shell中执行fdev:同样退出当前子shell,回到父shell后重新进入data-warehouse的poetry shell,实现循环切换。
为什么函数能解决问题
脚本是在当前shell进程中执行的,如果当前是poetry子shell,exit会直接终止子shell,后续代码无法运行;而shell函数定义在父shell中,执行poetry shell时父shell会等待子shell退出,子shell退出后父shell会继续执行函数剩余的切换目录、激活shell逻辑。
内容的提问来源于stack exchange,提问作者Javier Lopez Tomas
相关产品推荐
相关产品推荐

