En Windows, cuando se utiliza la CLI, solo se utiliza un programa ( cmd.exe
). Usted envía la entrada a cmd.exe
y, cmd.exe
a su vez, le envía la salida (muestra la salida en la pantalla, es decir):
Pero en Linux se utilizan dos programas: la Terminal y el Shell.
Usted envía la entrada a la Terminal (por ejemplo:) gnome-terminal
, y gnome-terminal
a su vez envía esta entrada al Shell (por ejemplo bash
:), y luego bash
envía la salida a gnome-terminal
, y gnome-terminal
a su vez le envía la salida.
Mi pregunta es: ¿Por qué Terminal y Shell son dos programas separados en Linux y no un programa como en Windows?
Respuesta1
Tu premisa es incorrecta. El papel de "terminal" en Windows lo desempeña, más o menos, conhost.exe: el subsistema de la consola no está diseñado de tal manera que sea intercambiable como lo son los terminales en Linux (y existen otras diferencias, por ejemplo , cuando inicia un proceso en modo consola, como cmd.exe, que aún no está conectado a una consola, las bibliotecas del sistema que inician el proceso se encargarán de crear uno por usted), pero es una capa separada administrada por un proceso separado.
Respuesta2
Yo diría 1) por la historia, 2) porque es una buena idea.
Generalmente llamamos gnome-terminal
o xterm
a una terminal.emulador. Antiguamente no existían emuladores de terminal, ya que no había interfaces gráficas de usuario. Todo lo que había era apropiado.Terminales, dispositivos con pantalla y teclado que se conectan mediante un cable serie.a la computadora. Los shells también eran útiles entonces y fueron escritos para admitir la recepción de comandos desde terminales. (Probablemente de descriptores de archivos arbitrarios, pero eso no importa).
Con algo como terminales virtuales y GUI de Linux, era útil hacer que emularan los terminales originales, de modo que las piezas de software antiguas simplemente funcionaran, o al menos lo hicieran con cambios mínimos. Eso no se refiere sólo al shell, sino también a otros programas que interactúan con el "terminal". ( ls
? vi
? emacs
?)
Además, la separación es una buena idea, ya que permite intercambiar el emulador de terminal y el shell de forma independiente. Puedo usar Bash en xterm, o zsh en gnome-terminal, o Bash a través de una conexión SSH, o...
Si las partes estuvieran unidas, esta elección sería más difícil.
Por cierto, tampoco estoy muy seguro de cmd.exe
implementar la parte de emulación de terminal en sí misma. No he tocado un compilador en Windows desde hace algún tiempo, pero si mal no recuerdo, es posible crear una "aplicación de consola" sin involucrar cmd.exe
. Veraquíyaquí.
Respuesta3
gnome-terminal
se ejecutará bash
como una aplicación predeterminada, pero
xterm
y gnome-terminal
las familias están diseñadas para ejecutar comandos arbitrarios, no solo shell; puede ejecutar, por ejemplo:
xterm -e /bin/bash
xterm -e /usr/local/bin/fish
xterm -e tail -f /var/log/messages
xterm -e man ls
en el último caso, xterm me mostrará la página de manual de ls; si salgo, xterm
saldré.
en el caso de /var/log/messages, podría usar las opciones de xterm para configurar la fuente o cambiar el color.
Tenga en cuenta que gnome-terminal
también utiliza -e
la sintaxis para ejecutar comandos.
Respuesta4
Creo que porque en Linux puedes tener varios shell (bash ksh....)
En Windows solo tengo 1 programa, el cmd. Y ahora Microsoft necesita 2 programas para agregar más funcionalidad (power shell)
En Linux solo necesitas cambiar el shell para mejorar tus requisitos.