Ich versuche, einen Terminalemulator zu öffnen und ihm gleichzeitig einen zusammengesetzten Befehl zu übergeben. Welche Befehle gibt es dafür (zwei Versionen: bei denen das Terminal nach Abschluss geöffnet bleibt oder bei denen es geschlossen wird)?
xterm
Beim Terminalemulator erstellt der Befehl beispielsweise xterm -e "ls; sleep 3"
ein neues xterm
GUI-Fenster, listet das aktuelle Verzeichnis auf, wartet 3 Sekunden und schließt dann das Fenster.
Ich bin insbesondere an Aufrufen für gnome-terminal
, konsole
, lxterminal
, rxvt
, terminator
, xfce4-terminal
, und xterm
sowie für Windows interessiert cmd
.
Hier sind einige Anwendungsbeispiele für das, was ich bisher selbst herausgefunden habe:
Emulator | Invocation (Exiting) | Invocation (Persistent) |
----------------+------------------------------------+------------------------------------+
cmd | start CMD /C "DATE /T & TIME /T" | start CMD /K "DATE /T & TIME /T" |
gnome-terminal | ??? | ??? |
konsole | ??? | ??? |
lxterminal | ??? | ??? |
rxvt | ??? | ??? |
terminator | ??? | ??? |
xfce4-terminal | ??? | ??? |
xterm | xterm -e "ls; sleep 3" | xterm -e "ls; sleep 3; bash" |
Kann mir jemand helfen, mehr auszufüllen? Teilantworten sind willkommen.
Antwort1
Abgesehen von cmd
sind dies alles X-Terminalemulatoren, und die meisten bieten eine Variante der xterm- -e
Option. Der Unterschied besteht darin, ob der Optionswert in Anführungszeichen gesetzt werden muss.
Abgesehen von Shell-Einschränkungen verwendet xtermalleder Tokens, die -e
als Teil des Befehls vorhanden sind. Sie müssen nicht wie gezeigt in Anführungszeichen gesetzt werden (was ein Token ergibt). rxvt folgt diesem Verhalten (sieheDokumentation).
Es gibt auch subtile Unterschiede, je nachdem, wie der Befehl an die Shell übergeben wird; xterm dokumentiert einige davon in derHandbuch(suchen Sie nach „Shell“ und „Filter“), während keiner der anderen diese Detailgenauigkeit bietet. Sie finden nurdiesedurch Lesen des Quellcodes oder Testen.
EntsprechendDokumentation, konsole folgt auch dem -e
Verhalten von xterm (der vorherrschenden Konvention).
gnome-terminal weicht von der Konvention ab (sieheDokumentation):
--command
CMD, -e
CMDFührt denCMDBefehl beim Start.
--execute
CMD ARGS, -x
CMD ARGSFührt den Befehl ausCMDmit seinen ArgumentenARGSbeim Start. Keine weiteren Argumente als dieses werden vom Terminal verarbeitet. Dieses Verhalten imitiert das Verhalten von xterm -e.
Das heißt, seine -e
Option erwartet ein einzelnes Token. Anstatt es zu ändern, um Kompatibilität zu gewährleisten, entschieden sich die Entwickler,ähnlichFunktionalität mit einem anderen Optionsnamen.
Die anderen verwenden fast denselben Code wie Gnome-Terminal und implementieren ihn, abhängig vom Ausmaß der gemeinsamen Nutzung, möglicherweise -e
wie die anderen oder kopieren ihn einfach von Gnome-Terminal:
-e
Zeichenfolge--command=
Zeichenfolge--command
ZeichenfolgeDiese Option gibt das Programm (und seine Befehlszeilenargumente) an, das im Terminal ausgeführt werden soll. Außer in der Form --command= muss dies die letzte Option in der Befehlszeile sein.
TerminatorDokumentationentspricht Gnome-Terminal
xfce4-terminalDokumentationentspricht lxterminal.
Antwort2
Das Hauptproblem, das ich hatte, war anscheinend, dass bei den meisten Terminalemulatoren das Befehlsargument ein einzelnes Element sein muss (d. h. es gibt keine Shell-artige Analyse). Zum Beispiel
rxvt -e "ls; sleep 3"
schlägt fehl, obwohl dieser auf die gleiche Weise xterm
aufgerufen wurde.
Wenn Sie versuchen, die Anführungszeichen zu entfernen, funktioniert das auch nicht. Beispiel:
rxvt -e ls; sleep 3
wird analysiert und separat als zwei Befehle ausgeführt:
rxvt -e ls
sleep 3
Mit einem Trick, den ich gefunden habeHier, können Sie den Terminalemulator aufrufen, um auszuführen bash
, und dann Befehle an bash
den Interpreter von übergeben, statt an den des Emulators. Dadurch wird das Problem gelöst und das Verhalten ist konsistenter, da in allen Fällen bash
die Hauptbefehlszeichenfolge von analysiert wird.
Mit einem Trick, den ich gefunden habeHierkönnen Sie bash
für aufrufen xterm
, wodurch eine Shell geöffnet bleibt und die persistente Variante erzeugt wird:
rxvt -e bash -c "ls;sleep 3;bash"
Dies funktioniert auch für konsole
, lxterminal
, und terminator
( terminator
zumindest unterstützt -x
es anscheinend auch). Wenn Sie jedoch darüber nachdenken (oder gnome-terminal
das Äquivalent von verwenden -x
und dann die Warnung beim Versuch, das Fenster zu schließen, beachten), stellen Sie fest, dass das Terminal ausgeführt wird bash
und dass das bash
ausgeführt wird bash
. Stattdessen möchten Sieersetzendas bash
-das-endet-mit einem bash
-das-nicht-endet:
rxvt -e bash -c "ls;sleep 3;exec bash"
Dies kann man in der freien Natur sehenHier.
Notizeine Alternativeist die Option xterm
von -hold
, die auf einigen anderen Terminals Entsprechungen hat (z konsole
. B. --hold
). Die Option hold verhindert, dass der Terminalemulator geschlossen wird, gibt Ihnen aber nicht die Interaktivität zurück. Das war nicht wirklich das, wonach ich gesucht habe, aber ich habe es der Vollständigkeit halber unten aufgeführt.
Hier ist die Tabelle (anderes Format, da diese Befehle länger werden). Ich habe auch hinzugefügt urxvt
. Alle Aufrufe wurden getestet:
Emulator | Command Type | Invocation
---------------+---------------------+-------------------------------------------------
cmd | exiting | start CMD /C "DATE /T & TIME /T"
| persistent | ???
| persistent (inter.) | start CMD /K "DATE /T & TIME /T"
---------------+---------------------+-------------------------------------------------
gnome-terminal | exiting | gnome-terminal -x bash -c "ls;sleep 3"
| persistent | ???
| persistent (inter.) | gnome-terminal -x bash -c "ls;sleep 3;exec bash"
---------------+---------------------+-------------------------------------------------
konsole | exiting | konsole -e bash -c "ls;sleep 3"
| persistent | konsole --hold -e bash -c "ls;sleep 3"
| persistent (inter.) | konsole -e bash -c "ls;sleep 3;exec bash"
---------------+---------------------+-------------------------------------------------
lxterminal | exiting | lxterminal -e bash -c "ls;sleep 3"
| persistent | ???
| persistent (inter.) | lxterminal -e bash -c "ls;sleep 3;exec bash"
---------------+---------------------+-------------------------------------------------
rxvt | exiting | rxvt -e bash -c "ls;sleep 3"
| persistent | ???
| persistent (inter.) | rxvt -e bash -c "ls;sleep 3;exec bash"
---------------+---------------------+-------------------------------------------------
terminator | exiting | terminator -x bash -c "ls;sleep 3"
| persistent | ???
| persistent (inter.) | terminator -x bash -c "ls;sleep 3;exec bash"
---------------+---------------------+-------------------------------------------------
urxvt | exiting | urxvt -e bash -c "ls;sleep 3"
| persistent | urxvt -hold -e bash -c "ls;sleep 3"
| persistent (inter.) | urxvt -e bash -c "ls;sleep 3;exec bash"
---------------+---------------------+-------------------------------------------------
xfce4-terminal | exiting | xfce4-terminal -x bash -c "ls;sleep 3"
| persistent | xfce4-terminal --hold -x bash -c "ls;sleep 3"
| persistent (inter.) | xfce4-terminal -x bash -c "ls;sleep 3;exec bash"
---------------+---------------------+-------------------------------------------------
xterm | exiting | xterm -e "ls;sleep 3"
| persistent | xterm -hold -e "ls; sleep 3"
| persistent (inter.) | xterm -e "ls;sleep 3;exec bash"
Die restlichen Fragezeichen halte ich für nicht möglich.
Sie können diese Tabelle gerne mit neuen Terminals, neuen Aufrufen oder Korrekturen bearbeiten.