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

Будь-які пропозиції?

Відповіді:


4

Здається, я знайшов спосіб вирішити це, щоб контроль роботи працював:

bash --rcfile <(cat $ {HOME} /. bashrc; echo 'export PROMPT_COMMAND = "vim; експорт 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Замінить поточний екземпляр 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"
    }
  • Налаштуйте Термінатор для запуску цієї команди:

    env startup_cmd='vim' bash

1 Виключимо "використовувати С4 для розтріскування гайки".


виглядає приємно і працює на перший погляд ... доведеться модифікувати bashrc, могло б життя з цим ... але з якої причини ctrl-z все ще не працює - будь-яка ідея? - у якому шафі я б знайшов рішення на основі с4?
marvin2k

0

У мене була ця сама проблема в контексті того, що я хочу породити vim у вікні tmux із можливістю ctrl-z. Врешті-решт я не зміг зрозуміти, як це зробити чисто всередині 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

Завдяки призначеним для користувача вр для « призначеного для користувача файлу Bashrc на льоту »!

Інша важлива частина - це " пастка ", заснована на базі:

  • Команда пастки вище просто визначає vim, який повинен виконуватися, якщо баш приймає сигнал 12.
  • Якщо перейти на другий план під час виконання rcfile, команда, що ховається kill -12, чекає одну секунду, щоб bash міг закінчити ініціалізацію. Якщо ви пропустите це, Ctrl-Z під час vim не переведе вас у робочу оболонку.
  • Потім виконується kill і, таким чином, запускається vim.
  • kill зчитує ідентифікатор процесу від / tmp / foo. Напевно, є більш елегантний спосіб.
  • Я також протестував Ctrl-Z, і він працює як очікувалося.

Я поняття не маю, до речі, що таке "термінатор", про який ви згадуєте.

Я знайшов це під час пошуку рішення з bash та екраном.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.