Bash: Befehl in der Kommandozeile ausführen und nicht beenden

13

Wie spezifiziere ich einen Befehl in der Kommandozeile von Bash, der nach dem Lesen von ~ / .bashrc einmal in der neuen Bash ausgeführt werden soll?

Ich spiele mit einer "Boot-up-Konfiguration" für den Terminator, bei der einige Splits nach dem Start einige Anwendungen (vim, mutt, irrsi) starten sollten. Aber ich möchte immer noch normale Shells im Hintergrund (Strg-Z und so weiter ...), also habe ich nach dem Beenden einer Anwendung die gleiche Shell, die ich zu Lebzeiten von eapplications hatte ...

Was funktioniert bei mir nicht (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 einen temporären bashrc funktioniert ebenfalls nicht. vim startet korrekt, aber es ist noch kein Hintergrund-Bash vorhanden, zu dem mich ein Strg-Z bringen würde.

Irgendwelche Vorschläge?

marvin2k
quelle

Antworten:

4

Ich habe anscheinend einen Weg gefunden, dies zu lösen, damit die Jobkontrolle funktioniert:

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

Dadurch wird eine benutzerdefinierte bashrc-Datei im laufenden Betrieb erstellt und die PROMPT_COMMAND-Variable verwendet, um den Start von Vim zu verzögern, sodass die Auftragssteuerung funktionieren sollte. Dies kann natürlich verallgemeinert werden, um nicht Vim-spezifisch zu sein.

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

[profiles]
[[default]]
    use_custom_command = True
    custom_command = "bash --rcfile <(cat ${HOME}/.bashrc; echo 'export PROMPT_COMMAND="vim; export PROMPT_COMMAND="') -i"
wor
quelle
Danke vielmals. Ich ziehe es unset PROMPT_COMMANDnicht export PROMPT_COMMAND=, though.
Peque
2
bash -c 'vim; exec bash'

Dadurch exec bashwird die aktuelle Bash-Instanz durch eine neue ersetzt.

Michael Hoffman
quelle
1
hm yeah ... das löst das Problem "Empty Split After Exit" ... aber Strg-Z funktioniert immer noch nicht - Bash wird einfach nach dem Beenden von Vims erneut ausgeführt ... Ich brauche Vim Inside Bash
marvin2k
1
Ich habe dieses Formular verwendet und gerade bemerkt, dass es keine Aliase usw. erbt, wenn ich nur verwende exec bash. exec bash --loginhilft aber wie gesagt dies läuft bash in bash was nicht ganz das ist was wir wollen.
Altendky
Tatsächliche Lösung. Nicht hässlich. +1
Andrew
2

(Ab) using .bashrcist der einzig verwendbare Weg. Eine Generierung ist jedoch nicht erforderlich. Fügen Sie einfach die Befehle in eine Umgebungsvariable ein und führen evalSie Folgendes aus:

  • Fügen Sie am Ende Folgendes ein ~/.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 Sie C4, um eine Nuss zu knacken" diejenigen ausschließen.

user1686
quelle
sieht gut aus und funktioniert auf den ersten blick ... muss bashrc modifizieren, könnte das leben damit ... aber aus irgendeinem grund funktioniert strg-z immer noch nicht - keine idee? - In was für einem Schrank würde ich die c4-basierte Lösung finden?
marvin2k
0

Ich hatte das gleiche Problem im Zusammenhang mit dem Wunsch, vim in einem tmux-Fenster mit der Möglichkeit, Strg-Z-Out zu erzeugen. Am Ende habe ich nicht herausgefunden, wie man es sauber in bash macht. Ich entschied mich für Folgendes:

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

Vielen Dank an den User wor für die " custom bashrc file on the fly "!

Der andere entscheidende Teil ist " Trap ", ein Bash-Builtin:

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

Ich habe übrigens keine Ahnung, was der von Ihnen erwähnte "Terminator" ist.

Ich habe dies gefunden, als ich nach einer Lösung mit Bash und Screen gesucht habe.

klaus dorn
quelle