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

Fél*_*lli 70 bash shell

这必须是非常简单或非常复杂,但我找不到任何关于它...我试图打开一个新的bash实例,然后在其中运行一些命令,并将控件返回给用户内部相同的实例.

我试过了:

$ bash -lic "some_command"
Run Code Online (Sandbox Code Playgroud)

但这会some_command在新实例中执行,然后关闭它.我希望它保持开放.

还有一个可能会影响答案的细节:如果我可以让它工作,我会在我的.bashrc别名中使用它,所以实现的奖励积分alias!

Cir*_*四事件 50

bash --rcfile <(echo '. ~/.bashrc; some_command')
Run Code Online (Sandbox Code Playgroud)

免除了临时文件的创建.其他网站的问题:

  • @Scott,我们刚刚在 WSL 上遇到了这个问题(从启动批处理文件启动 bash)。我们的解决方案是转义一些字符,以便批处理可以理解它: `bash.exe --rcfile ^&lt;^(echo 'source $HOME/.bashrc; ls; pwd'^)` 应该从 Windows 命令提示符运行。 (2认同)

dav*_*aja 35

这是一个迟到的答案,但我有完全相同的问题,谷歌把我发送到这个页面,所以为了完整性这里我是如何解决这个问题.

据我所知,bash没有选择去做原始海报想做的事情.执行命令后,-c选项将始终返回.

破碎的解决方案:最简单明了的尝试是:

bash -c 'XXXX ; bash'
Run Code Online (Sandbox Code Playgroud)

这部分工作(尽管有一个额外的子壳层).但是,问题是虽然子shell将继承导出的环境变量,但不会继承别名和函数.所以这可能适合某些人,但不是一般解决方案.

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

# Create a temporary file
TMPFILE=$(mktemp)

# Add stuff to the temporary file
echo "source ~/.bashrc" > $TMPFILE
echo "<other commands>" >> $TMPFILE
echo "rm -f $TMPFILE" >> $TMPFILE

# Start the new bash shell 
bash --rcfile $TMPFILE
Run Code Online (Sandbox Code Playgroud)

好处是临时init文件将在使用后立即删除,从而降低未正确清除的风险.

注意:我不确定/ etc/bashrc是否通常作为普通非登录shell的一部分调用.如果是这样,你可能想要/ etc/bashrc以及〜/ .bashrc.

  • 没有进程替换的tmp文件`bash --rcfile <(echo".~/.bashrc; a = b")` (6认同)
  • 仅当您的 Bash 脚本成功运行时,才会清除临时文件。一个更健壮的解决方案是使用`trap`。 (3认同)

tri*_*eee 5

您可以传递--rcfile给Bash使其读取您选择的文件。该文件将代替您的读取.bashrc。(如果有问题,请~/.bashrc从其他脚本中获取。)

编辑:因此,从中开始使用东西启动新shell的函数应~/.more.sh类似于:

more() { bash --rcfile ~/.more.sh ; }
Run Code Online (Sandbox Code Playgroud)

...,并且.more.sh您将拥有要在Shell启动时执行的命令。(我想避免使用单独的启动文件是很不错的选择-您不能使用标准输入,因为这样外壳将无法交互,但是您可以在临时位置从here文档创建启动文件,然后读取它。)


小智 5

bash -c '<some command> ; exec /bin/bash'
Run Code Online (Sandbox Code Playgroud)

将避免额外的壳子层


归档时间:

查看次数:

84941 次

最近记录:

6 年,6 月 前