Windows では、CLI を使用する場合、1 つのプログラムのみが使用されます ( cmd.exe
)。 に入力を送信するcmd.exe
と、cmd.exe
から出力が送信されます (出力が画面に表示されます)。
しかし、Linux では、ターミナルとシェルの 2 つのプログラムが使用されます。
入力をターミナル (例: gnome-terminal
) に送信し、gnome-terminal
次にこの入力をシェル (例: bash
) に送信し、次にbash
出力を に送信しgnome-terminal
、gnome-terminal
次に から出力が送信されます。
私の質問は、なぜ Linux ではターミナルとシェルが 2 つの別々のプログラムであり、Windows のように 1 つのプログラムではないのかということです。
答え1
あなたの前提は正しくありません。Windows の「ターミナル」の役割は、多かれ少なかれ conhost.exe によって果たされます。コンソール サブシステムは、Linux のターミナルのように交換可能に設計されていません (他にも違いがあります。たとえば、コンソールにまだ接続されていない cmd.exe などのコンソール モード プロセスを開始すると、プロセスを開始するシステム ライブラリがコンソールを作成します)。ただし、これは別のプロセスによって管理される別のレイヤーです。
答え2
1) 歴史的な理由、2) 良いアイデアだから、だと思います。
通常は電話gnome-terminal
かxterm
端末でエミュレータ昔は、グラフィカルユーザーインターフェースがなかったため、ターミナルエミュレーターはありませんでした。あったのは、適切な端末、シリアルケーブルで接続された画面とキーボードを備えたデバイスコンピュータに。シェルも当時は便利で、端末からのコマンドの取得をサポートするように書かれていました。(おそらく任意のファイル記述子からのコマンドですが、それは問題ではありません。)
Linux の仮想端末や GUI のようなものでは、元の端末をエミュレートして、古いソフトウェアがそのまま動作するようにしたり、少なくとも最小限の変更で動作するようにしたりすることが役立ちました。これはシェルだけでなく、「端末」とインターフェイスする他のプログラムも意味します。( ls
? vi
? emacs
?)
また、ターミナル エミュレーターとシェルを互いに独立して切り替えることができるため、分離は良いアイデアです。xterm で Bash を使用したり、gnome-terminal で zsh を使用したり、SSH 接続で Bash を使用したりすることができます。
部品が結び付けられていたら、この選択はより困難になるでしょう。
cmd.exe
ちなみに、ターミナルエミュレーション部分の実装自体についても、よくわかりません。Windows のコンパイラにはしばらく触れていませんが、正しく思い出せば、 を使わずに「コンソールアプリケーション」を作成することは可能ですcmd.exe
。ここそしてここ。
答え3
gnome-terminal
bash
はデフォルトのアプリケーションとして 実行されますがxterm
、gnome-terminal
および ファミリはシェルだけでなく任意のコマンドを実行することを目的としているので、たとえば を実行できます。
xterm -e /bin/bash
xterm -e /usr/local/bin/fish
xterm -e tail -f /var/log/messages
xterm -e man ls
最後のケースでは、xterm は ls のマニュアル ページを表示し、終了するとxterm
終了します。
/var/log/messages の場合、xterm オプションを使用してフォントを設定したり色を変更したりすることがあります。
gnome-terminal
コマンドを実行するには構文も使用することに注意してください-e
。
答え4
Linux では複数のシェル (bash ksh ....) を使用できるからだと思います。
Windows には cmd という 1 つのプログラムしかありません。そして今、Microsoft はより多くの機能 (Power Shell) を追加するために 2 つのプログラムを必要としています。
Linuxでは、要件を改善するためにシェルを変更するだけで済みます