Öffnen Sie einen Befehl in einer neuen Instanz verschiedener Terminalemulatoren

Öffnen Sie einen Befehl in einer neuen Instanz verschiedener Terminalemulatoren

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)?


xtermBeim Terminalemulator erstellt der Befehl beispielsweise xterm -e "ls; sleep 3"ein neues xtermGUI-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 xtermsowie 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 cmdsind dies alles X-Terminalemulatoren, und die meisten bieten eine Variante der xterm- -eOption. Der Unterschied besteht darin, ob der Optionswert in Anführungszeichen gesetzt werden muss.

Abgesehen von Shell-Einschränkungen verwendet xtermalleder Tokens, die -eals 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 -eVerhalten von xterm (der vorherrschenden Konvention).

gnome-terminal weicht von der Konvention ab (sieheDokumentation):

--commandCMD, -eCMD

Führt denCMDBefehl beim Start.

--executeCMD ARGS, -xCMD ARGS

Fü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 -eOption 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 -ewie die anderen oder kopieren ihn einfach von Gnome-Terminal:

luxterminal

-eZeichenfolge--command=Zeichenfolge--commandZeichenfolge

Diese 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 xtermaufgerufen 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 bashden Interpreter von übergeben, statt an den des Emulators. Dadurch wird das Problem gelöst und das Verhalten ist konsistenter, da in allen Fällen bashdie Hauptbefehlszeichenfolge von analysiert wird.

Mit einem Trick, den ich gefunden habeHierkönnen Sie bashfü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( terminatorzumindest unterstützt -xes anscheinend auch). Wenn Sie jedoch darüber nachdenken (oder gnome-terminaldas Äquivalent von verwenden -xund dann die Warnung beim Versuch, das Fenster zu schließen, beachten), stellen Sie fest, dass das Terminal ausgeführt wird bashund dass das bashausgefü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 xtermvon -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.

verwandte Informationen