bash: выполнить команду в командной строке и не выходить


13

как указать команду на командной строке 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.

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

Ответы:


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=, хотя.
Пек

2
bash -c 'vim; exec bash'

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


1
хм да ... это решает проблему "пустого разделения после выхода" ... но ctrl-z по-прежнему не работает - bash просто выполняется снова после выхода из vims ... Мне нужен vim внутри bash
marvin2k

1
Я использовал эту форму и только заметил, что она не наследует псевдонимы и т. Д. При использовании просто exec bash. exec bash --loginпомогает, но, как уже отмечалось, это запускает Bash внутри Bash, который не совсем то, что мы хотим.
altendky

Актуальное решение. Не безобразно +1
Андрей

2

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

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

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

    env startup_cmd='vim' bash

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


выглядит красиво и работает на первый взгляд ... нужно изменить bashrc, может ли жизнь с этим ... но по какой-то причине ctrl-z все еще не работает - есть идеи? - в каком шкафу я найду решение на основе c4?
marvin2k

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.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.