父Shell执行命令后,如何在子Shell中执行指定命令并正常退出?
解决子Shell中命令执行与退出的问题
我来帮你搞定这个问题!你遇到的核心问题是:bef useTable 会启动一个交互式子Shell,直接用 && 串联命令的话,exit 并不会在这个子Shell里执行,而是要等 bef useTable 退出后才会跑——但交互式子Shell不手动退出的话,这个 exit 根本没机会执行。
下面给你两种可行的方案,都能完美实现你的需求:
方案1:用管道传递命令给子Shell
把需要在子Shell中执行的命令(包括exit)通过管道输入给bef useTable启动的子Shell:
# 先在父Shell执行创建表命令 bef createTable xyz # 通过管道将命令传入子Shell执行 echo -e "bef refreshTable -latest\nexit" | bef useTable xyz
echo -e 用来解析换行符,让两个命令依次执行:先刷新表,再退出子Shell。
方案2:用Here-Doc传递命令(更易读)
如果后续需要添加更多子Shell命令,Here-Doc的写法会更清晰,可读性更强:
bef createTable xyz # 用Here-Doc把命令传给子Shell bef useTable xyz << EOF bef refreshTable -latest exit EOF
这里的EOF是自定义分界符(你也可以换成其他任意字符串,只要首尾一致就行),分界符之间的内容会作为标准输入传给bef useTable启动的子Shell,按顺序执行里面的命令。
为什么你之前的写法不行?
你用 /bin/bash -c 'bef useTable mrinal_bugs && exit' 时,bef useTable 是在 /bin/bash -c 启动的Shell里运行的,它会创建一个新的交互式子Shell并接管终端。这时候后面的 exit 属于外层的 /bin/bash -c Shell,要等 bef useTable 退出后才会执行——但交互式子Shell不主动退出的话,这个 exit 永远不会被触发。
内容的提问来源于stack exchange,提问作者Mrinal Bhattacharjee
相关产品推荐
相关产品推荐

