bash: wykonaj polecenie podane w wierszu poleceń i nie wychodź

13

jak mogę podać polecenie w linii poleceń bash, które zostanie wykonane raz w nowym bashie po przeczytaniu ~ / .bashrc - Ale to wszystko bez pozwalania bashowi wyjść po zakończeniu polecenia?

Bawię się „konfiguracją rozruchową” terminatora, w której niektóre podziały powinny uruchamiać niektóre aplikacje (vim, mutt, irsi) po uruchomieniu. Ale nadal chcę normalne powłoki w tle (ctrl-z i tak dalej ...), więc po zamknięciu aplikacji mam tę samą powłokę, którą miałem w czasie życia aplikacji ...

Co dla mnie nie działa (na podstawie podanych odpowiedzi)

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

Ręczne dołączanie „vim” do tymczasowego bashrc również nie działa. vim uruchamia się poprawnie, ale nadal nie ma bashu w tle, do którego doprowadziłoby mnie Ctrl-Z.

Jakieś sugestie?

marvin2k
źródło

Odpowiedzi:

4

Wydaje mi się, że znalazłem sposób na rozwiązanie tego problemu, aby kontrola zadań działała:

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

To tworzy niestandardowy plik bashrc w locie i używa zmiennej PROMPT_COMMAND, aby opóźnić start Vima, aby kontrola zadań mogła działać. Można to oczywiście uogólnić tak, aby nie było specyficzne dla Vima.

Ok, właśnie przetestowałem to z terminatorem i przynajmniej wydaje się działać z plikiem konfiguracyjnym:

[profiles]
[[default]]
    use_custom_command = True
    custom_command = "bash --rcfile <(cat ${HOME}/.bashrc; echo 'export PROMPT_COMMAND="vim; export PROMPT_COMMAND="') -i"
wor
źródło
Wielkie dzięki. Wolę jednak unset PROMPT_COMMANDniż export PROMPT_COMMAND=.
Peque,
2
bash -c 'vim; exec bash'

exec bashZastąpi bieżącą instancję atakujących z nowym.

Michael Hoffman
źródło
1
hm tak ... rozwiązuje to problem "pusty podział po wyjściu" ... ale ctrl-z nadal nie działa - bash jest po prostu uruchamiany ponownie po wyjściu vims ... Potrzebuję vima w bash
marvin2k
1
Korzystałem z tego formularza i właśnie zauważyłem, że nie dziedziczy aliasów itp., Gdy używa tylko exec bash. exec bash --loginpomaga, ale jak wspomniano, uruchamia bash wewnątrz bash, co nie jest tak naprawdę tym, czego chcemy.
altendky
Rzeczywiste rozwiązanie. Niebrzydka. +1
Andrew
2

(Ab) używanie .bashrcjest jedynym użytecznym sposobem. 1 Generacja nie jest jednak potrzebna - wystarczy umieścić polecenie (-a) w zmiennej środowiskowej i eval:

  • Na końcu umieść ~/.bashrc:

    [[ $startup_cmd ]] && {
        declare +x startup_cmd
        eval "$startup_cmd"
    }
  • Skonfiguruj Terminator, aby uruchomić to polecenie:

    env startup_cmd='vim' bash

1 Wykluczmy te, które używają C4 do zgryzienia orzechów.

użytkownik1686
źródło
wygląda ładnie i działa na pierwszy rzut oka ... muszę zmodyfikować bashrc, czy życie z tym może ... ale z jakiegoś powodu ctrl-z nadal nie działa - jakiś pomysł? - w jakiej szafce znajdę rozwiązanie oparte na c4?
marvin2k
0

Miałem ten sam problem w kontekście potrzeby odradzania vima w oknie tmux z możliwością Ctrl-Z. W końcu nie udało mi się wymyślić, jak to zrobić czysto w bashu. Postanowiłem, co następuje:

tmux new-session -d -s foo
tmux send-keys -t foo:0.0 "vim
"
masher
źródło
0
bash --rcfile <(cat ${HOME}/.bashrc; echo 'trap vim 12'; echo 'echo $$>/tmp/foo'; echo '( sleep 1;kill -12 `</tmp/foo`; )' ) -i

Dzięki użytkownikowi wor za „ niestandardowy plik bashrc w locie ”!

Inną ważną częścią jest „ pułapka ”, wbudowana w bash:

  • Powyższe polecenie pułapki po prostu określa, że ​​vim ma zostać wykonany, jeśli uderzenie odbierze sygnał 12.
  • Umieszczone w tle podczas wykonywania pliku rc, czające się polecenie zabicia -12 czeka jedną sekundę, aby bash mógł zakończyć inicjalizację. Jeśli pominiesz to, Ctrl-Z podczas vima nie umieści cię w działającej powłoce.
  • Następnie wykonywane jest zabijanie, a więc uruchamiany jest vim.
  • kill odczytuje identyfikator procesu z / tmp / foo. Prawdopodobnie jest to bardziej elegancki sposób.
  • Testowałem również Ctrl-Z i działa zgodnie z oczekiwaniami.

Nawiasem mówiąc, nie mam pojęcia, co to jest „terminator”, o którym pan wspomina.

Znalazłem to, szukając rozwiązania z bash i screenem.

Klaus Cierń
źródło