Windowsでは、CLIを使用するときは1つのプログラム(cmd.exe
)のみが使用されます。入力をに送信すると結果がcmd.exe
出力cmd.exe
されます(画面に出力を表示)。
ただし、Linuxでは、TerminalとShellという2つのプログラムが使用されます。
gnome-terminal
入力を端末(たとえば)に送信し、端末はこのgnome-terminal
入力をシェル(たとえばbash
)に送信し、出力をに送信し、シェルから出力をユーザーに送信します。bash
gnome-terminal
gnome-terminal
私の質問は:Windowsのような1つのプログラムではなく、Linux上のターミナルとシェルが2つの別々のプログラムであるのはなぜですか?
答え1
あなたの前提が間違っています。 Windowsでは、「ターミナル」の役割は、conhost.exeである程度実行されます。コンソールサブシステムは、Linux上の端末が交換可能に設計されていません(コンソールモードを起動するときなどの他の違いもあります)。プロセス(たとえば、コンソールにまだ接続されていないcmd.exe)、プロセスを開始するシステムライブラリはプロセスを作成しますが、これは別のプロセスによって管理される別の階層です。
答え2
1)歴史のせいで、2)いい考えだからと言いたいです。
通常、私たちは電話gnome-terminal
したり、xterm
端末でエミュレータ。過去にはグラフィカルユーザーインターフェイスがなかったので、ターミナルエミュレータもありませんでした。すべてが正しい画面とキーボードがシリアルケーブルで接続された端末、デバイスコンピュータに。 Shellは当時も便利で、端末からコマンドを受け取ることをサポートするように書かれています。 (すべてのファイル記述子から来ることができますが、問題ではありません。)
Linux 仮想端末や GUI などの場合は、既存のソフトウェアが正しく動作するように、または最小限の変更で動作できるように元の端末をエミュレートすることが便利です。これはシェルだけでなく、「ターミナル」とインタフェースする他のプログラムも意味します。 (ls
??? vi
)emacs
また、デカップリングは、ターミナルエミュレータとシェルを独立して交換できるようにする良いアイデアです。 xterm で Bash を使用したり、gnome 端末で 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はさらに多くの機能を追加するために2つのプログラムが必要です(Power Shell)。
Linuxでは、要件を改善するためにシェルを変更してください。