
Ich möchte ein Skript (das beim Start ausgeführt wird) zum Öffnen eines konsole
Terminals verwenden können.
Wenn es geöffnet wird, soll es einige dauerhafte Dinge tun (wie das Ändern des Verzeichnisses und der bashrc-Quelle) und ein Programm mit langer Laufzeit ausführen.
Wenn das Programm abstürzt oder ich es betrete <ctrl+c>
, soll es beginnen, Befehle von der Standardeingabe anzunehmen (wie „Up-Enter“, um es erneut zu versuchen, als ob es die ganze Zeit interaktiv gewesen wäre).
Ich habe so vieles probiert, um es zum Laufen zu bekommen (aktuell versuche ich, es zum Laufen zu bringen ls
und nach Abschluss wieder auf interaktiv umzustellen);
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 etwas mit den Anführungszeichen zu tun? Sollte ich sie nicht verwenden, sollte ich etwas umgehen?
Soll ich überhaupt versuchen, es auszuführen bash
?
Mir gehen die Ideen aus, aber ich hoffe, es ist überhaupt machbar (aber hoffentlich nicht etwas peinlich Einfaches, das ich übersehen habe).
Ich werde Antworten hochstimmen, die erfolgreich andere Terminalemulatoren verwenden, wenn konsole
das Problem insbesondere besteht (aber da es in der Frage speziell um geht, konsole
glaube ich nicht, dass ich Ihnen das saftige Häkchen geben kann).
Antwort1
Dank der Kommentare von @n.st habe ich diesen Einzeiler verfasst:
konsole -e /bin/bash --rcfile <(echo "cd /;ls;echo hi | less")
Dies ist lediglich eine kürzere Version ohne temporäre Dateien, die die Bash-Prozessersetzung für Folgendes verwendet:
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 lang laufendes Programm ausgeführt ( less
) und wenn es endet ( :q
) ist interaktiv.
Ersetzen Sie also cd /;ls;echo hi | less
(die Demonstration) durch Ihr Skript.
Kein Verlauf, aber zumindest befinden Sie sich jetzt im richtigen Verzeichnis und haben alle Umgebungsvariablen eingerichtet, die Sie möglicherweise wollten.
Im Grunde dasselbe wie mein vorheriger Versuch;
konsole -e "echo ls > /tmp/konsolebash;/bin/bash -i --rcfile /tmp/konsolebash"
außer dass das Schreiben der Datei außerhalb der konsole
Ausführung erfolgt, ich habe das Flag gelöscht -i
und die Ausführungsparameter befinden sich nicht in einem Anführungszeichenblock
Leider --rcfile
führt der Schalter dazu, dass Ihr Computer ~/.bashrc
für diese Befehle nicht geladen wird. Wenn Sie also einen Alias oder etwas Ähnliches benötigen, müssen Sie dies tun.
cat ~/.bashrc > /tmp/konsolebash; echo "commands" >> /tmp/konsolebash;konsole -e /bin/bash --rcfile /tmp/konsolebash
Das kopiert dann einfach Ihre Bashrcfügt hinzudeine Befehle bis zum Ende
Antwort2
Eine kürzere und einfachere Lösung:
konsole -e '$SHELL -c "ls; $SHELL"' &
Auch hier gibt es keine Probleme mit Verlauf oder Sourcing .bashrc
. Wenn Ihre $SHELL
Umgebungsvariable nicht auf Bash verweist, können Sie sie manuell angeben.
Dadurch wird eine zweite (Bash-)Shell im selben Terminalfenster geöffnet, sodass einige Dinge aus dem ersten Befehl möglicherweise nicht übernommen werden.
Antwort adaptiert von einem AskubuntuAntwort.