bash: Befehl in Befehlszeile ausführen und nicht beenden

10090
marvin2k

Wie gebe ich einen Befehl in der Commmandline von Bash an, der nach dem Lesen von ~ / .bashrc innerhalb der neuen Bash einmal ausgeführt werden soll - aber all dies, ohne dass Bash nach Beenden des Befehls beendet wird?

Ich fummle mit einer "Boot-up-Konfiguration" für Terminatoren, bei denen einige Splits nach dem Start einige Anwendungen (vim, mutt, irrsi) starten sollten. Aber ich möchte immer noch normale Muscheln im Hintergrund (Strg-Z usw.), so dass ich nach dem Beenden einer Anwendung die gleiche Muschel habe, die ich zu Lebzeiten hatte ...

Was funktioniert nicht für mich (basierend auf gegebenen Antworten)

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

Das manuelle Anhängen von "vim" an eine temporäre bashrc funktioniert ebenfalls nicht. vim startet korrekt, aber es ist noch kein Hintergrund-Bash vorhanden, wohin mich eine Strg-z bringen würde.

Irgendwelche Vorschläge?

12

5 Antworten auf die Frage

4
wor

Ich habe scheinbar einen Weg gefunden, um das Problem zu lösen, damit die Jobsteuerung funktioniert:

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

Dadurch wird schnell eine benutzerdefinierte bashrc-Datei erstellt und die Variable PROMPT_COMMAND wird verwendet, um den Start von Vim zu verzögern, damit die Jobsteuerung funktionieren kann. Dies kann natürlich verallgemeinert werden, um nicht Vim-spezifisch zu sein.

Ok, habe das gerade mit Terminator getestet und scheint zumindest mit der Konfigurationsdatei zu funktionieren:

[profiles] [[default]] use_custom_command = True custom_command = "bash --rcfile <(cat $/.bashrc; echo 'export PROMPT_COMMAND="vim; export PROMPT_COMMAND="') -i" 
Danke vielmals. Ich bevorzuge jedoch `unset PROMPT_COMMAND` anstelle von` export PROMPT_COMMAND = `. Peque vor 8 Jahren 0
2
grawity

(Ab) verwenden .bashrcist der einzige verwendbare Weg. 1 Generierung ist jedoch nicht erforderlich - setzen Sie einfach den Befehl (die Befehle) in eine Umgebungsvariable und eval:

  • Setze folgendes an dein Ende ~/.bashrc:

    [[ $startup_cmd ]] && { declare +x startup_cmd eval "$startup_cmd" } 
  • Konfigurieren Sie Terminator, um diesen Befehl zu starten:

    env startup_cmd='vim' bash 

1 Lassen Sie uns die "Verwenden von C4, um eine Nuss zu knacken" ausschließen.

sieht nett aus und funktioniert auf den ersten Blick ... muss bashrc ändern, könnte das Leben damit ... aber aus irgendeinem Grund funktioniert ctrl-z immer noch nicht - keine Idee? - In welcher Art von Schrank würde ich die c4-basierte Lösung finden? marvin2k vor 12 Jahren 0
1
Michael Hoffman
bash -c 'vim; exec bash' 

Die exec bashaktuelle Bash-Instanz wird durch eine neue ersetzt.

hm yeah ... das löst das "leere split after exit" Problem ... aber ctrl-z funktioniert immer noch nicht - bash wird einfach _again_ nach vims exit ausgeführt ... Ich brauche vim _inside_ bash marvin2k vor 12 Jahren 1
Ich habe dieses Formular verwendet und habe gerade festgestellt, dass es keine Aliasnamen usw. erbt, wenn nur `exec bash` verwendet wird. `exec bash --login` hilft, aber wie bereits erwähnt, läuft bash in bash, was nicht wirklich das ist, was wir wollen. altendky vor 8 Jahren 1
0
masher

I had this same problem in the context of wanting to spawn vim in a tmux window with the ability to ctrl-z out. In the end, I failed to figure out how to do it cleanly inside of bash. I settled on the following:

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 

Vielen Dank an user wor für die " benutzerdefinierte bashrc-Datei ".

Der andere entscheidende Teil ist " trap ", ein bash-builtin:

  • Der Trap- Befehl oben definiert nur vim, das ausgeführt werden soll, wenn die Bash das Signal 12 empfängt.
  • Während der Ausführung von rcfile im Hintergrund ausgeführt wird, wartet ein lauernder kill -12-Befehl eine Sekunde, damit bash die Initialisierung beenden kann. Wenn Sie dies nicht angeben, werden Sie mit einer Strg-Z während von vim nicht in eine funktionierende Shell versetzt.
  • Dann wird kill ausgeführt und somit wird vim gestartet.
  • kill liest die Prozess-ID aus / tmp / foo. Es gibt wahrscheinlich einen eleganteren Weg.
  • Ich habe auch Ctrl-Z getestet und es funktioniert wie erwartet.

Ich habe keine Ahnung, was der "Terminator" ist, den Sie übrigens nennen.

Ich fand das auf der Suche nach einer Lösung mit bash und screen.