如何调用bash、在新shell中运行命令,然后将控制权还给用户?

27 浏览
0 Comments

如何调用bash、在新shell中运行命令,然后将控制权还给用户?

这个问题可能非常简单,也可能非常复杂,但我找不到相关的信息...我试图打开一个新的Bash实例,然后在里面运行一些命令,并将控制权交回给用户,使其在同一实例内完成。

我尝试了:

$ bash -lic "some_command"

但这会在新实例中执行some_command,然后关闭它。我希望它保持打开状态。

还有一个可能影响答案的细节:如果我能使其工作,则会在我的 .bashrc 中使用它作为别名实现,因此对于alias实现的额外奖励分!

admin 更改状态以发布 2023年5月23日
0
0 Comments

这是一个晚回答,但我有完全相同的问题,并且谷歌把我带到了这个页面,所以为了完整性,这是我解决问题的方法.

据我所知, bash 没有选项来做原帖子想做的事情. -c 选项将在命令执行后始终返回.

错误的解决方案: 最简单明显的尝试是:

bash -c 'XXXX ; bash'

这部分可以工作(尽管有一个额外的子shell层). 但问题在于, 虽然子shell将继承导出的环境变量, 但别名和函数不会被继承. 所以这可能对某些事情有效, 但不是一个通用的解决方案.

更好的解决方案: 摆脱这个问题的方法是动态创建启动文件并使用这个新的初始化文件来调用bash, 确保你的新init文件可以在必要时调用你的常规 ~/.bashrc.

# Create a temporary file
TMPFILE=$(mktemp)
# Add stuff to the temporary file
echo "source ~/.bashrc" > $TMPFILE
echo "" >> $TMPFILE
echo "rm -f $TMPFILE" >> $TMPFILE
# Start the new bash shell 
bash --rcfile $TMPFILE

美妙的是,临时init文件将在使用后自动删除,减少了不正确清理的风险。

注意: 我不确定 /etc/bashrc 是否通常作为普通非登录Shell 的一部分被调用. 如果是这样, 您可能需要在你的~/.bashrc之外再源代码 /etc/bashrc.

0
0 Comments
0