Öffnen Sie eine neue Konsole aus einem Skript, führen Sie den Befehl aus und werden Sie zum Abschluss interaktiv

3785
Hashbrown

Ich möchte in der Lage sein, ein Skript zu bekommen (beim Start ausgeführt), um ein konsoleTerminal zu öffnen .
Wenn es geöffnet wird, müssen einige permanente Aktionen ausgeführt werden (wie zum Beispiel Verzeichnis und Quell-Bashrc ändern) und ein lang andauerndes Programm ausgeführt werden.
Wenn das Programm abstürzt oder ich komme und <ctrl+c>es kommt, ist es so, dass Sie Befehle von der Standardeingabe annehmen (wie 'up-enter', um es erneut zu versuchen, als ob es die ganze Zeit interaktiv wäre).

Ich habe so viele Dinge ausprobiert, um es zum lsLaufen zu bringen (ich versuche gerade, es fertigzustellen und nach Fertigstellung wieder auf interaktiv zurückzugreifen);

konsole -e ls konsole --hold ls konsole -e /bin/bash -c ls konsole --hold -e "/bin/bash -c ls" konsole -e "/bin/bash -i -c ls" konsole -e /bin/bash -i -c ls konsole -e "echo ls > /tmp/konsolebash;/bin/bash -i --rcfile /tmp/konsolebash"  echo ls > /tmp/konsolebash konsole -e "/bin/bash -i --rcfile /tmp/konsolebash" 

Hat es mit den Zitaten zu tun? Sollte ich sie nicht benutzen, sollte ich etwas entkommen?
Soll ich überhaupt versuchen und ausführen bash?
Mir gehen die Ideen aus, aber ich hoffe, es ist sogar erreichbar (aber hoffentlich nicht etwas peinlich einfaches, was ich vermisst habe).

Ich habe Antworten auf Antworten erhalten, die erfolgreich andere Terminal-Emulatoren verwenden, wenn konsoleinsbesondere das Problem vorliegt (aber da es sich speziell um die Frage handelt, konsoleglaube ich nicht, dass ich Ihnen das saftige Häckchen geben kann)

2
Die letzten beiden Zeilen sehen vielversprechend aus. Haben Sie sie ausprobiert, ohne den Zitaten um 'source ... ls' zu entgehen? n.st vor 10 Jahren 0
Entschuldigung, das war ein Fehler beim Kopieren der Frage Hashbrown vor 10 Jahren 0
Und das hat nicht funktioniert? Seltsam ... Was genau * hat es getan? n.st vor 10 Jahren 0
Ja, es wird nur eine normale interaktive Shell aufgerufen (es wird kein Befehl sichtbar ausgeführt, nur die Eingabeaufforderung wird angezeigt). Es scheint entweder Argumente zu akzeptieren oder interaktiv zu sein, niemals beides. Hashbrown vor 10 Jahren 0
Wenn nichts anderes funktioniert, können Sie `konsole -e" bash -c 'ls'; bash "` - verwenden, was wirklich hässlich ist, aber Sie sollten eine interaktive Shell hinterlassen, wenn `ls 'beendet wird. n.st vor 10 Jahren 0
das würde aber jede 'cd'- und Befehlshistorie vergessen (break `up-enter`). Könnte es auch nicht interaktiv machen und zwei Schalen öffnen Hashbrown vor 10 Jahren 0
Since we're already doing ugly things: `ls; echo 'ls' >> $HOME/.bash_history; bash` n.st vor 10 Jahren 0
Ich denke immer noch, dass mit --rcfile` genau das gemacht werden sollte, was Sie brauchen ... Edit: Ich habe es gerade überprüft und `bash --rcfile / tmp / foo` arbeitet für mich, während` bash` sich weigert Beginnen Sie mit `-i --rcfile / tmp / foo`. Versuchen Sie also, das "-i" wegzulassen und zu sehen, ob das hilft. n.st vor 10 Jahren 1
Sorry, I overlooked that commands in the rcfile are not added to the history, so `--rcfile` is useless for your application. Looks like we'll need the `echo 'ls' >> .bash_history` hack after all... n.st vor 10 Jahren 0
Und noch eine andere Idee, die ZyX in einem Kommentar zu [dieser Antwort] (http://stackoverflow.com/a/6219428/1114687) vorschlägt: Rufen Sie eine `screen'-Sitzung auf, und lassen Sie dann` ls` im neuen ausführen erstellte Sitzung. n.st vor 10 Jahren 0
Danke für all das, ich wusste nicht, dass es so schwer sein würde. Der Kommentar, den ich angehoben habe, funktionierte (allerdings ohne Historie). Auch wenn eine `cd` in der Datei ist. Sie sollten eine Antwort geben, damit ich sie bestätigen kann / damit andere sie sehen und auch Hilfe bekommen können Hashbrown vor 10 Jahren 0

1 Antwort auf die Frage

3
Hashbrown

Dank der Kommentare von @n.st habe ich diesen Liner gemacht:

konsole -e /bin/bash --rcfile <(echo "cd /;ls;echo hi | less") 

Dies ist nur eine kürzere Version ohne tmpfiles, wobei für den folgenden Vorgang die Bash-Prozessersetzung verwendet wird.

echo "cd /;ls;echo hi | less" > /tmp/konsolebash;konsole -e /bin/bash --rcfile /tmp/konsolebash 

Dadurch werden einige Befehle ausgeführt, angezeigt, die Umgebung geändert, ein Programm ausgeführt ( less), und wenn es endet ( :q), wird es interaktiv sein.
Ersetzen Sie also cd /;ls;echo hi | lessdie Demonstration durch Ihr Skript.

Kein Verlauf, aber Sie befinden sich jetzt im richtigen Verzeichnis und haben alle Umgebungsvariablen, die Sie möglicherweise eingerichtet haben möchten.


Im Grunde dasselbe wie mein früherer Versuch;

konsole -e "echo ls > /tmp/konsolebash;/bin/bash -i --rcfile /tmp/konsolebash" 

Außer, dass das Schreiben der Datei außerhalb der konsoleAusführung liegt, habe ich das -iFlag entfernt und die Ausführungsparameter befinden sich nicht in einem Anführungsblock


Leider führt der --rcfileSchalter dazu, dass Sie ~/.bashrcfür diese Befehle nicht geladen werden. Wenn Sie also einen Alias ​​oder etwas benötigen, müssen Sie dies tun.

cat ~/.bashrc > /tmp/konsolebash; echo "commands" >> /tmp/konsolebash;konsole -e /bin/bash --rcfile /tmp/konsolebash 

Welche nur kopiert Ihre bashrc dann anfügt Ihre Befehle an das Ende davon

Es ist nicht notwendig, Ihre Bashrc zu kopieren, verwenden Sie einfach `source ~ / .bashrc`. n.st vor 10 Jahren 0
Ich habe das tatsächlich versucht, es funktioniert nicht für die restlichen Befehle in der Liste. Das heißt, wenn `.bashrc` den Alias` BOB` hat, wird das Argument `source ~ / .bashrc; BOB; cd /` `BOB` fehlschlagen. Ich habe keine Ahnung warum, aber das funktioniert Hashbrown vor 10 Jahren 0