如何在 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 的解决方案时发现了这一点。