12

как мне указать команду на командной строке bash, которая должна быть выполнена один раз внутри нового bash после прочтения ~/.bashrc - Но все это, не давая bash завершиться после завершения команды?

Я возился с «загрузочной конфигурацией» для терминатора, где некоторые сплиты должны запускать некоторые приложения (vim, mutt, irrsi) после запуска. Но я все еще хочу нормальные оболочки в фоновом режиме (ctrl-z и так далее ...), поэтому после выхода из приложения у меня будет та же оболочка, которая была у меня при жизни приложения ...

Что у меня не работает (основываясь на данных ответах)

 ( 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 запускается правильно, но до сих пор нет фонового bash, куда меня бы привел ctrl-z.

Какие-либо предложения?

5 ответов5

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"
2

(Ab) использование .bashrc - единственный используемый способ. 1 Генерация, однако, не нужна - просто поместите команду (и) в переменную окружения и eval ее:

  • Поместите следующее в конец вашего ~/.bashrc:

    [[ $startup_cmd ]] && {
        declare +x startup_cmd
        eval "$startup_cmd"
    }
    
  • Настройте терминатор для запуска этой команды:

    env startup_cmd='vim' bash
    

1 Давайте исключим "использовать C4, чтобы взломать орехи".

1
bash -c 'vim; exec bash'

exec bash заменит текущий экземпляр Bash новым.

0

У меня была такая же проблема в контексте желания порождать vim в окне tmux с возможностью ctrl-z out. В конце концов, я не смог понять, как сделать это чисто внутри 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 просто определяет vim, который должен быть выполнен, если bash получает сигнал 12.
  • В фоновом режиме во время выполнения rcfile скрытая команда kill -12 ждет одну секунду, чтобы bash мог завершить инициализацию. Если вы пропустите это, Ctrl-Z во время vim не поместит вас в рабочую оболочку.
  • Затем выполняется kill и, таким образом, запускается vim.
  • kill читает идентификатор процесса из /tmp /foo. Там, наверное, есть более элегантный способ.
  • Я также проверил Ctrl-Z, и он работает как ожидалось.

Между прочим, я понятия не имею, что такое терминатор, о котором вы упоминаете.

Я нашел это, когда искал решение с помощью bash и screen.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .