使用初始命令运行交互式 bash 子 shell,而不立即返回(“超级”)shell

使用初始命令运行交互式 bash 子 shell,而不立即返回(“超级”)shell

我想运行一个 bash 子 shell,(1) 运行几个命令,(2) 然后留在该子 shell 中执行我想做的事情。我可以分别执行以下每一项操作:

  1. 使用标志运行命令-c

    $> bash -c "ls; pwd; <other commands...>"
    

    但是,执行完命令后它会立即返回到“超级”shell。我也可以运行一个交互式子shell:

  2. 开始新bash流程:

    $> bash
    

    并且它不会退出子 shell,除非我明确说明...但我无法运行任何初始命令。我找到的最接近的解决方案是:

    $> bash -c "ls; pwd; <other commands>; exec bash"
    

    它可以工作,但不是我想要的方式,因为它在一个子shell中运行给定的命令,然后打开一个单独的命令进行交互。

我想在一行中完成此操作。一旦我退出子 shell,我应该可以顺利返回常规“超级”shell。一定有办法~~

注意:我问的不是...

  1. 不询问在哪里可以找到 bash 手册页
  2. 没有询问如何从文件中读取初始化命令...我知道如何做到这一点,这不是我正在寻找的解决方案
  3. 不想使用 tmux 或 gnu screen
  4. 不想给出背景信息。也就是说,这个问题是一般性的,不针对任何特定目的
  5. 如果可能的话,我希望避免使用那些能达到我想要的效果,但又“肮脏”的变通方法。我只想在一行中完成这件事。特别是,我不想做类似的事情xterm -e 'ls'

答案1

这可以很容易地完成临时命名管道

bash --init-file <(echo "ls; pwd")

此答案归功于来自的评论赖安。我发现这确实很有用,而且在评论中不太明显,所以我认为它应该是它自己的答案。

答案2

尝试一下这个:

$> bash -c "ls;pwd;other commands;$SHELL"

$SHELL 它使 shell 以交互模式打开,等待关闭exit

答案3

您可以使用临时文件以迂回的方式完成此操作,尽管这需要两行:

echo "ls; pwd" > initfile
bash --init-file initfile

答案4

您需要执行启动脚本,然后继续交互式会话。

默认启动脚本是~/.bashrc,可以使用选项提供另一个脚本--init-file。如果您只是传递一个--init-file选项,您的脚本将代替默认,而不是增加它。

解决方案是使用语法传递<(...)一个临时脚本,该脚本提供默认值,~/.bashrc然后是任何其他命令:

bash --init-file <(echo ". ~/.bashrc; ls; pwd; ### other commands... ###")

相关内容