私のArch Linuxボックスには次のスクリプトがあります。
#!/bin/bash
xterm -e "sudo pacman -Syu;bash"
これで xterm が起動し、sudo pacman -Syu
コマンドが実行されます。この部分のため、;bash
コマンドが完了してもxtermウィンドウは閉じません。これは私のシステムを更新するために使用されるコマンドであり、出力を見たいのでシステムがシャットダウンしたくありません。
これが他の端末、特にlxterminalとroxterm(私が試した唯一の他の端末)では機能しないのはなぜですか?lxterminal
代わりに使用されたのとroxterm
同じコマンドはxterm
端末を起動し、コマンドが実行されるとすぐに端末を閉じます。
答え1
エミュレータごとに機能を開いたままにするための機能とプロトコルが異なります。何人かの人々はそれをしなかったりすることができません。他のものには、エミュレータが開いたままであることを指定するスクリプトが必要です。 HDSentinelというプログラムの簡単なスクリプトの作成中にこの問題が発生しました。私が考えることができるさまざまなソリューションは次のとおりです。
KDE(コンソールエミュレータ)
konsole -hold -e sudo ./HDSentinel
(-hold
必須パラメータです)
啓蒙(学期シミュレータ)
terminology --hold -e "sudo ./HDSentinel"
(--hold
必須パラメータです)
XFCE(XFCE4 エミュレータ)
xfce4-terminal -H -x "sudo ./HDSentinel"
(-H
必須パラメータです。)
編集:xfce端末で-eの代わりに-xを使用してください。
Mate(同伴端末エミュレータ)
mate-terminal --window-with-profile=HoldOpen -e "sudo ./HDSentinel"
(このエミュレータを使用する前に、エミュレータを開いたままにするためのカスタム設定ファイルを作成する必要があります。HoldOpenと呼びますが、どの名前でも構いません)
Gnome(Gnomeターミナルエミュレータ)
gnome-terminal --window-with-profile=HoldOpen -e "sudo ./HDSentinel"
(Mateと同じように動作します。プロファイルを作成してエミュレータを開きます)
LXDE(lx端子)
LXDEに付属のエミュレータは、端末を開いたままにすることをlxterminal
サポートしていません。
したがって、結論は、一部のエミュレータはオープン状態の維持をサポートし、一部はサポートしていないということです。これを行うと、その機能を有効にする方法が異なります。ここにリストされていないエミュレータを見ている場合は、そのエミュレータでGoogle検索を実行して、Keep-Onを有効にするかどうかを確認する必要があります。
使用しているエミュレータが開いたままをサポートしていない場合は、ディストリビューションにそれをサポートする代替エミュレータが含まれていることがわかります(多くのディストリビューションにはxtermおよびデスクトップバージョンエミュレータが含まれています)。オープンメンテナンスをサポートするエミュレータがない場合は、いつでもソフトウェアストアから入手できます。
この情報はかなりの研究時間を意味するので、これが人々の時間と欲求不満を減らすのに役立つことを願っています。ちなみに、xtermもこのパラメータを使用するので、これはkeep-open機能のパラメータを提供するkeep-openエミュレータに役立ちます-hold
。;bash
ただし、エミュレータがこの機能をサポートしていない場合(lxterminalの場合)、エミュレータがオープンコンフィギュレーション機能を有効にするためにカスタム設定ファイルを使用している場合(たとえば、lxterminalの場合)、オープンステートメンテナンス機能は生成されません。 Gnome)、Keep-Open機能は有効になっていません。機能をオンにします。
答え2
基本的な問題は、VTEベースの端末が同じ方法でコマンドラインを処理しないことです。方法xtermで。これには、オプションの維持に関連して発生する可能性のある問題(この議論では不要)は含まれません。
コマンドの引用符
xterm -e "sudo pacman -Syu;bash"
問題です。引用符付き文字列は、単一の引数としてxtermに渡される単一のトークンです。
xtermの場合、次のトークンは最初に-e
execv呼び出しの引数として試行されます。失敗した場合は、同様の操作を試みます"${SHELL:-sh}" -c "parameters"
(必要なシェルを実行してparameters
コマンドラインとして解釈します)。 konsoleはこれらのタスクの1つを実行します(おそらく最初のものです。なぜなら、これはxtermの元の動作であり、konsoleのデザインのほとんどは1990年代後半にさかのぼるからです)。 xtermがluitに変更されている場合、「fail」代替はパラメータをluitに渡すのに役立ちます。
しばらくVTEベースの端末は、あるコマンドラインオプションで1つの側面を実行し、他のオプションでは別の側面を実行しようとしました(私が覚えていると-e
そして-x
、しかし交換これら2つのオプションが行うことは、まだ見たことのない興味深いDebianバグレポートのトピックです。現在のバージョンでは試してみてください。
gnome-terminal -e "sudo pacman -Syu;bash"
生のxtermと同様の動作でのみ動作するため、失敗します。そして(他の端末は以前のバージョンのVTEを使用していることに注意してください。)-x
gnome端末開発者(VTE開発者と重複しています...)がしばらく前にそのオプションを放棄したため、このコマンドにはこのオプションを使用できません。 これこれは元のxtermモデルに従うので機能します。
gnome-terminal -e "bash -c \"sudo pacman -Syu;bash\""
この-e
オプションは、最小限のオプションセット(ヘッダーオプションを含む)を提供しようとするシェルスクリプトを介してDebianによって部分的に処理されます。これに対するDebianの方針は1990年代後半のxtermに基づいており、何度も議論のテーマになりました。
追加資料: