如何在shell脚本中退出诗歌shell [复制]

but5z9lq  于 2023-05-01  发布在  Shell
关注(0)|答案(1)|浏览(132)

此问题已在此处有答案

Pass commands as input to another command (su, ssh, sh, etc)(3个答案)
2天前关闭。
我有以下工作流程,我想自动化(Unix):

cd repos/data-warehouse
poetry shell

do my stuff

exit (to deactivate the poetry shell)

cd ..
cd etl
poetry shell

为此,我创建了以下shell脚本,并将其保存到.sh文件中:

#!/bin/bash

REPO_NAME="$1"

TARGET_DIR=~/repos/$REPO_NAME

if [ -n "$VIRTUAL_ENV" ]; then
  exit
fi

cd $TARGET_DIR
poetry shell

所以每次我运行一个别名(i。e fdev),我将只执行fdev数据仓库,它将执行所有必要的命令,并在该文件夹中激活诗歌 shell 。
为了创建别名,我在nano ~/.zshrc文件中添加了以下行:

alias fdev="source ~/repos/fdev.sh"

根据一些链接,如call "exit" from within shell scriptExit shell script from pythonhttps://superuser.com/questions/1547228/how-to-activate-python-virtualenv-through-shell-script,使用源代码应该可以工作,因为exit命令将在同一个shell中执行。
但是,如果我已经激活了一个poetry shell,并且从终端运行命令(i.e fdev etl,它只是退出诗歌 shell 和 shell 脚本停止,我必须再次执行命令,使它有效地改变目录,并激活新的诗歌 shell 。
有什么办法可以完成我想做的事吗?谢谢

plicqrtu

plicqrtu1#

当然,它会这样做,因为你有代码可以做到这一点:

if [ -n "$VIRTUAL_ENV" ]; then
  exit
fi

如果你想在子shell内部执行与在子shell外部执行相同的命令,即退出子shell,然后进入一个新的shell,这真的很棘手,因为你想让更高级别的shell为你做一些事情。
我能想到的就是这样的事情:

#!/bin/bash

REPO_NAME="$1"

TARGET_DIR=~/repos/$REPO_NAME

if [ -n "$VIRTUAL_ENV" ]; then
  echo "$0 $*" >~/poetrycmd.sh
  exit
fi

cd $TARGET_DIR
poetry shell
if [ -f ~/poetrycmd.sh ]
then
   source ~/poetrycmd.sh
   rm ~/poetrycmd.sh
fi

所以基本上会发生的是,如果你在一个虚拟的诗歌shell中,你调用命令,它将命令写入一个文件,然后退出。当它退出时,上层shell会查看该文件是否存在,如果存在,则在删除临时命令文件之前从该shell执行该文件。因此temp命令文件允许您弹出子shell并将其直接弹出到另一个子shell中。

相关问题