此问题已在此处有答案:
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 script,Exit shell script from python和https://superuser.com/questions/1547228/how-to-activate-python-virtualenv-through-shell-script,使用源代码应该可以工作,因为exit
命令将在同一个shell中执行。
但是,如果我已经激活了一个poetry shell,并且从终端运行命令(i.e fdev etl
,它只是退出诗歌 shell 和 shell 脚本停止,我必须再次执行命令,使它有效地改变目录,并激活新的诗歌 shell 。
有什么办法可以完成我想做的事吗?谢谢
1条答案
按热度按时间plicqrtu1#
当然,它会这样做,因为你有代码可以做到这一点:
如果你想在子shell内部执行与在子shell外部执行相同的命令,即退出子shell,然后进入一个新的shell,这真的很棘手,因为你想让更高级别的shell为你做一些事情。
我能想到的就是这样的事情:
所以基本上会发生的是,如果你在一个虚拟的诗歌shell中,你调用命令,它将命令写入一个文件,然后退出。当它退出时,上层shell会查看该文件是否存在,如果存在,则在删除临时命令文件之前从该shell执行该文件。因此temp命令文件允许您弹出子shell并将其直接弹出到另一个子shell中。