LinuxでターミナルとShellが2つの別々のプログラムであるのはなぜですか?

LinuxでターミナルとShellが2つの別々のプログラムであるのはなぜですか?

Windowsでは、CLIを使用するときは1つのプログラム(cmd.exe)のみが使用されます。入力をに送信すると結果がcmd.exe出力cmd.exeされます(画面に出力を表示)。

ここに画像の説明を入力してください。

ただし、Linuxでは、TerminalとShellという2つのプログラムが使用されます。

gnome-terminal入力を端末(たとえば)に送信し、端末はこのgnome-terminal入力をシェル(たとえばbash)に送信し、出力をに送信し、シェルから出力をユーザーに送信します。bashgnome-terminalgnome-terminal

ここに画像の説明を入力してください。

私の質問は:Windowsのような1つのプログラムではなく、Linux上のターミナルとシェルが2つの別々のプログラムであるのはなぜですか?

答え1

あなたの前提が間違っています。 Windowsでは、「ターミナル」の役割は、conhost.exeである程度実行されます。コンソールサブシステムは、Linux上の端末が交換可能に設計されていません(コンソールモードを起動するときなどの他の違いもあります)。プロセス(たとえば、コンソールにまだ接続されていないcmd.exe)、プロセスを開始するシステムライブラリはプロセスを作成しますが、これは別のプロセスによって管理される別の階層です。

答え2

1)歴史のせいで、2)いい考えだからと言いたいです。

通常、私たちは電話gnome-terminalしたり、xterm端末でエミュレータ。過去にはグラフィカルユーザーインターフェイスがなかったので、ターミナルエミュレータもありませんでした。すべてが正しい画面とキーボードがシリアルケーブルで接続された端末、デバイスコンピュータに。 Shellは当時も便利で、端末からコマンドを受け取ることをサポートするように書かれています。 (すべてのファイル記述子から来ることができますが、問題ではありません。)

Linux 仮想端末や GUI などの場合は、既存のソフトウェアが正しく動作するように、または最小限の変更で動作できるように元の端末をエミュレートすることが便利です。これはシェルだけでなく、「ターミナル」とインタフェースする他のプログラムも意味します。 (ls??? viemacs

また、デカップリングは、ターミナルエミュレータとシェルを独立して交換できるようにする良いアイデアです。 xterm で Bash を使用したり、gnome 端末で zsh を使用したり、SSH 接続で Bash を使用したりできます。

この選択は、断片が互いに結ばれている場合、さらに困難になります。


cmd.exeところで、端末エミュレーション部分自体の実装についてもよくわかりません。 Windowsのコンパイラについて扱うのはかなり時間がかかりましたが、私が正確に覚えている場合は、その内容を扱わないチュートリアルで見つけることができますcmd.exeここそしてここ

答え3

gnome-terminalbash基本的なアプリケーションとして実行されますが、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はさらに多くの機能を追加するために2つのプログラムが必要です(Power Shell)。

Linuxでは、要件を改善するためにシェルを変更してください。

関連情報