複合コマンドを同時に渡しながらターミナル エミュレータを開こうとしています。これを行うためのコマンドは何ですか (完了後にターミナルを開いたままにするか、ターミナルを閉じるかの 2 つのバージョン)?
たとえば、xterm
ターミナル エミュレーターの場合、コマンドはxterm -e "ls; sleep 3"
新しいxterm
GUI ウィンドウを作成し、現在のディレクトリを一覧表示し、3 秒間待機してからウィンドウを閉じます。
gnome-terminal
私は特に、、、、、、、およびkonsole
の呼び出し、およびWindows のに興味があります。lxterminal
rxvt
terminator
xfce4-terminal
xterm
cmd
これまでに私が自分で考え出した使用例をいくつか示します。
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 も-e
xterm (一般的な慣例) の動作に従います。
gnome-terminalは慣例と異なります(ドキュメンテーション):
--command
CMDF, -e
CMDF実行するCMDF起動時のコマンド。
--execute
CMDF ARGS, -x
CMDF ARGSコマンドを実行するCMDFその議論とともにARGS起動時にこれを超える引数は端末によって処理されません。この動作は xterm -e の動作を模倣します。
つまり、その-e
オプションは単一のトークンを期待しています。互換性を提供するために修正するのではなく、開発者は似ている異なるオプション名を持つ機能。
他のものは gnome-terminal とほぼ同じコードを使用しており、共有の範囲に応じて、-e
他のものと同じように実装するか、gnome-terminal からコピーするだけです。
-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
も機能しますterminator
(terminator
少なくとも、もサポートされている-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"
残りの疑問符は、あり得ないと思います。
新しい端末、新しい呼び出し、または修正があれば、この表を自由に編集してください。