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

9980
marvin2k

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

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

12

5 ответов на вопрос

4
wor

I seem to have found a way to solve this so that the job control works:

bash --rcfile <(cat $/.bashrc; echo 'export PROMPT_COMMAND="vim; export PROMPT_COMMAND="') -i

This creates custom bashrc file on the fly and uses PROMPT_COMMAND variable to delay the Vim start so that job control should work. This of course can be generalized to not be Vim specific.

Ok, just tested this with terminator and at least seems to work with config file:

[profiles] [[default]] use_custom_command = True custom_command = "bash --rcfile <(cat $/.bashrc; echo 'export PROMPT_COMMAND="vim; export PROMPT_COMMAND="') -i" 
Большое спасибо. Я предпочитаю `unset PROMPT_COMMAND`, а не` export PROMPT_COMMAND = `. Peque 8 лет назад 0
2
grawity

(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 12 лет назад 0
1
Michael Hoffman
bash -c 'vim; exec bash' 

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

хм, да ... это решает проблему "пустого разделения после выхода" ... но ctrl-z по-прежнему не работает - bash просто выполняется _again_ после выхода из vims ... Мне нужен vim _inside_ bash marvin2k 12 лет назад 1
Я использовал эту форму и только заметил, что она не наследует псевдонимы и т. Д. При использовании просто `exec bash`. `exec bash --login` помогает, но, как уже было отмечено, он запускает bash внутри bash, что на самом деле не совсем то, что мы хотим. altendky 8 лет назад 1
0
masher

У меня была такая же проблема в контексте желания порождать vim в окне tmux с возможностью ctrl-z out. В конце концов, я не смог понять, как сделать это чисто внутри bash. Я остановился на следующем:

tmux new-session -d -s foo tmux send-keys -t foo:0.0 "vim " 
0
klaus thorn
bash --rcfile <(cat $/.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.