bash: выполнить команду, заданную в командной строке, и не выходить
Как мне указать команду на командной строке 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 ответов
bash -c 'vim; exec bash'
exec bash
заменит текущий экземпляр Bash новым.
Кажется, я нашел способ решить эту проблему, чтобы контроль работы работал:
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"
(Ab), используя .bashrc
это единственный используемый способ.1 Генерация, однако, не нужна - просто поместите команду (и) в переменную окружения и eval
Это:
Поместите следующее в конце вашего
~/.bashrc
:[[ $startup_cmd ]] && { declare +x startup_cmd eval "$startup_cmd" }
Настройте Terminator для запуска этой команды:
env startup_cmd='vim' bash
1 Давайте исключим "использовать C4, чтобы взломать орехи".
У меня была такая же проблема в контексте желания порождать vim в окне tmux с возможностью ctrl-z out. В конце концов, я не смог понять, как сделать это чисто внутри bash. Я остановился на следующем:
tmux new-session -d -s foo
tmux send-keys -t foo:0.0 "vim
"
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.