bash:执行命令行中给出的命令并且不退出

bash:执行命令行中给出的命令并且不退出

如何在 bash 的命令行上指定一个命令,该命令在读取 ~/.bashrc 后将在新 bash 中执行一次——但这一切都不会在命令完成后让 bash 退出?

我正在摆弄“启动配置”终结者其中一些分割应该在启动后启动一些应用程序(vim、mutt、irrsi)。但我仍然希望在后台运行正常的 shell(ctrl-z 等等...),这样在退出应用程序后,我拥有的 shell 与应用程序生命周期中的 shell 相同...

什么对我不起作用(基于给出的答案)

 ( bash; vim )              # vim waits for the exit of bash...
 bash -c vim                # bash exits after vims exit...
 bash -c 'vim; exec bash'   # bash is executed _after_ vim... ctrl-z won't work
 echo vim | bash -s         # "Vim: Warning: Input is not from a terminal"     

手动将“vim”附加到临时的 bashrc 也不起作用。vim 正确启动,但是仍然没有按 ctrl-z 进入的后台 bash。

有什么建议么?

答案1

bash -c 'vim; exec bash'

exec bash用新的 Bash 实例替换当前的 Bash 实例。

答案2

我似乎找到了解决这个问题的方法,以便作业控制能够正常工作:

bash --rcfile <(cat ${HOME}/.bashrc; echo ‘导出 PROMPT_COMMAND="vim; 导出 PROMPT_COMMAND="') -i

这将动态创建自定义 bashrc 文件,并使用 PROMPT_COMMAND 变量来延迟 Vim 启动,以便作业控制能够正常工作。当然,这可以推广到不特定于 Vim。

好的,刚刚用终结者测试了这个,至少似乎可以与配置文件一起使用:

[profiles]
[[default]]
    use_custom_command = True
    custom_command = "bash --rcfile <(cat ${HOME}/.bashrc; echo 'export PROMPT_COMMAND="vim; export PROMPT_COMMAND="') -i"

答案3

滥用.bashrc仅有的可用的方式。但是,第1代是不必要的 – 只需将命令放在环境变量中,eval它就可以:

  • 将以下内容放在您的末尾~/.bashrc

    [[ $startup_cmd ]] && {
        declare +x startup_cmd
        eval "$startup_cmd"
    }
    
  • 配置 Terminator 来启动此命令:

    env startup_cmd='vim' bash
    

1让我们排除“用C4来砸坚果”的情况。

答案4

bash --rcfile <(cat ${HOME}/.bashrc; echo 'trap vim 12'; echo 'echo $$>/tmp/foo'; echo '( sleep 1;kill -12 `</tmp/foo`; )' ) -i

感谢用户为了 ”动态自定义 .bashrc 文件“!

另一个关键部分是“陷阱",bash 内置命令:

  • 陷阱上面的命令只是定义了当 bash 接收到信号 12 时执行 vim。
  • 在执行 rcfile 期间进入后台,潜伏的 kill -12 命令会等待一秒钟,以便 bash 完成初始化。如果你忽略这个,在 vim 中按 Ctrl-Z 不会让你进入在职的壳。
  • 然后执行kill,从而启动vim。
  • kill 从 /tmp/foo 读取进程 ID。可能还有更优雅的方法。
  • 我还测试了 Ctrl-Z,它可以按预期工作。

顺便说一句,我不知道你提到的“终结者”是什么。

我在寻找使用 bash 和 screen 的解决方案时发现了这一点。

相关内容