さまざまなターミナルエミュレータの新しいインスタンスでコマンドを開く

さまざまなターミナルエミュレータの新しいインスタンスでコマンドを開く

複合コマンドを同時に渡しながらターミナル エミュレータを開こうとしています。これを行うためのコマンドは何ですか (完了後にターミナルを開いたままにするか、ターミナルを閉じるかの 2 つのバージョン)?


たとえば、xtermターミナル エミュレーターの場合、コマンドはxterm -e "ls; sleep 3"新しいxtermGUI ウィンドウを作成し、現在のディレクトリを一覧表示し、3 秒間待機してからウィンドウを閉じます。

gnome-terminal私は特に、、、、、、、およびkonsoleの呼び出し、およびWindows のに興味があります。lxterminalrxvtterminatorxfce4-terminalxtermcmd


これまでに私が自分で考え出した使用例をいくつか示します。

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"      |

誰か、さらに記入するのを手伝ってくれませんか? 部分的な回答でも大歓迎です。

答え1

を除けばcmd、これらはすべて X 端末エミュレータであり、そのほとんどは xterm の-eオプションのバリエーションを提供します。これらの違いは、オプション値を引用符で囲む必要があるかどうかにあります。

シェルの制限を除けば、xtermは全てトークンの過去を-eコマンドの一部として記述します。これらは引用符で囲む必要はありません(1つのトークンになります)。rxvt もこの動作に従います(ドキュメンテーション)。

コマンドがシェルに渡される方法によって微妙な違いもあります。xtermではその一部がマニュアル(「シェル」と「フィルター」を探してください)他のサイトでは、そのレベルの詳細を提供していません。それらのソースコードを読んだりテストしたりすることによって。

によるとドキュメンテーションkonsole も-exterm (一般的な慣例) の動作に従います。

gnome-terminalは慣例と異なります(ドキュメンテーション):

--commandCMDF, -eCMDF

実行するCMDF起動時のコマンド。

--executeCMDF ARGS, -xCMDF ARGS

コマンドを実行するCMDFその議論とともにARGS起動時にこれを超える引数は端末によって処理されません。この動作は xterm -e の動作を模倣します。

つまり、その-eオプションは単一のトークンを期待しています。互換性を提供するために修正するのではなく、開発者は似ている異なるオプション名を持つ機能。

他のものは gnome-terminal とほぼ同じコードを使用しており、共有の範囲に応じて、-e他のものと同じように実装するか、gnome-terminal からコピーするだけです。

lxターミナル

-e--command=--command

このオプションは、ターミナルで実行するプログラム (およびそのコマンドライン引数) を指定します。--command= 形式を除き、これはコマンドラインの最後のオプションである必要があります。

ターミネータードキュメンテーションgnome-terminalに一致する

xfce4 ターミナルドキュメンテーションlxterminal に一致します。

答え2

私が抱えていた主な問題は、ほとんどの端末エミュレータではコマンド引数が単一の項目であることが期待されている(つまり、シェルスタイルの解析がない)ということだったようです。例えば

rxvt -e "ls; sleep 3"

同じ方法でxterm呼び出されたにもかかわらず、失敗します。

引用符を解除しようとしても、うまくいきません。例:

rxvt -e ls; sleep 3

2 つのコマンドとして別々に解析され、実行されます。

rxvt -e ls
sleep 3

私が見つけたトリックを使ってここでは、ターミナル エミュレータを呼び出して を実行しbash、エミュレータではなく のインタープリタにコマンドを渡すことができます。これにより、問題が解決され、すべてのケースで がメイン コマンド文字列を解析するbashため、動作の一貫性が向上します。bash

私が見つけたトリックを使ってここbash、 for を呼び出すことができxterm、シェルを開いたままにして、永続的なバリアントを生成することができます。

rxvt -e bash -c "ls;sleep 3;bash"

これはkonsole、、、にlxterminalも機能しますterminatorterminator少なくとも、もサポートされている-xようです)。しかし、よく考えてみると(または、gnome-terminalの同等のものを使用して-x、ウィンドウを閉じようとしたときに警告が表示されると)、ターミナルは を実行しておりbash、 は をbash実行していることがわかりますbash。代わりに、交換する-that's bash-going-to-terminate はbash-that-won't で終了します:

rxvt -e bash -c "ls;sleep 3;exec bash"

これは野生でも見られるここ

注記代替案xtermは のオプションで-hold、他の端末でも同等の機能があります (例:konsole--hold)。hold オプションは端末エミュレータが閉じないようにしますが、対話機能は戻りません。これは私が探していたものではありませんが、完全性のために以下にリストしました。

ここに表があります (コマンドが長くなるため、形式が異なります)。 も追加しましたurxvt。すべての呼び出しはテスト済みです。

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"                 

残りの疑問符は、あり得ないと思います。

新しい端末、新しい呼び出し、または修正があれば、この表を自由に編集してください。

関連情報