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


13

我如何在bash的命令行上指定一条命令,该命令在读取〜/ .bashrc后将在新的bash中执行一次-但是所有这些都不会在命令完成后退出bash?

我在摆弄一个终结器的“启动配置”,其中一些拆分应该在启动后启动某些应用程序(vim,mutt,irrsi)。但是我仍然希望在后台使用普通的shell(ctrl-z等),因此退出应用程序后,我拥有与eapplications生命周期中相同的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仍然不存在。

有什么建议么?

Answers:


4

我似乎找到了解决此问题的方法,以便工作控制起作用:

bash --rcfile <(cat $ {HOME} /。bashrc; echo'export PROMPT_COMMAND =“ vim; export 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"

非常感谢。我更喜欢unset PROMPT_COMMAND而不是export PROMPT_COMMAND=
Peque

2
bash -c 'vim; exec bash'

exec bash会以更换新的电流击实例。


1
hm yeah ...这解决了“退出后空拆分”的问题...但是ctrl-z仍然不起作用-bash在vims退出后只是再次执行...我需要 bash中使用vim
marvin2k 2011年

1
我一直在使用这种形式,只是注意到使用just时它不继承别名等exec bashexec bash --login有所帮助,但如上所述,这在bash中运行bash并不是我们真正想要的。
2015年

实际的解决方案。不难看 +1
安德鲁(Andrew)

2

(ab)使用.bashrc唯一可用的方法。1但是,不需要生成-只需将命令放在环境变量中即可eval

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

    [[ $startup_cmd ]] && {
        declare +x startup_cmd
        eval "$startup_cmd"
    }
  • 配置终结者以启动此命令:

    env startup_cmd='vim' bash

1让我们排除“使用C4破坏螺母”的那些。


看起来不错,乍一看就行了。。。必须修改bashrc,这样才能生存。。。但是由于某种原因,ctrl-z仍然不起作用-知道吗?-我会在哪种柜子中找到基于c4的解决方案?
marvin2k 2011年

0

在要在具有ctrl-z功能的tmux窗口中生成vim的情况下,我遇到了同样的问题。最后,我无法弄清楚如何在bash内干净地进行此操作。我决定以下几点:

tmux new-session -d -s foo
tmux send-keys -t foo:0.0 "vim
"

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

由于用户WOR为“ 动态自定义的.bashrc文件 ”!

另一个关键部分是bash内置的“ trap ”:

  • 上面的trap命令仅定义了bash收到信号12时要执行的vim。
  • 在rcfile执行期间置于后台,潜伏的kill -12命令等待一秒钟,以便bash可以完成初始化。如果您忽略了这一点,那么在vim期间按Ctrl-Z不会使您进入正常运行的 shell。
  • 然后执行kill并因此启动vim。
  • kill从/ tmp / foo中读取进程ID。可能有一种更优雅的方法。
  • 我还测试了Ctrl-Z,它可以按预期工作。

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.