El término 'shell' está bien nombrado. Es literalmente un caparazón alrededor del O / S que permite al usuario interactuar con la computadora. Cuando se concibió originalmente, había muy poca o ninguna interfaz gráfica de usuario (sin ventanas :(). Todo se hizo en la línea de comando. Pero incluso la línea de comando necesitaba un lugar para vivir. Vivía, y aún lo hace, en un shell .
En términos simples, para que la línea de comando sea útil, necesitaba instrucciones a las que pudiera llamar. Por lo tanto, los programas se ejecutaron dentro del shell para que la línea de comando los utilizara. Los programas se agruparon estrechamente en sus propios paquetes y tenían la intención de trabajar juntos. Incluyen programas como "ls" y "grep", "ps", "sed", etc. También incluyen comandos de redirección de archivos como ">" y "<" y tuberías ("|"). Más importante aún, también incluyen construcciones de programación como operaciones condicionales (si, entonces, de lo contrario, para bucles, mientras que bucles, formas de verificar el estado devuelto cuando ejecuta una instrucción (por ejemplo, si ejecuta "ls", ¿encontró algo?) como eso). Estos son los fundamentos de los scripts de línea de comandos (shell) más complejos,
Cuando alguien usa el término 'Bash Shell' está hablando de un intérprete de línea de comando llamado 'Bash' que se ejecuta en el shell O / S. Se podría pensar que es la abreviatura de 'Bash Shell Interpreter'. Hay otros intérpretes como Bourne (Bash es un nuevo y mejorado Bourne Shell y es la abreviatura de Bourne Again Shell). También está el C-Shell, el K-Shell (favorecido por muchos que escriben scripts de shell complejos) y otras variantes de GNU. A lo largo de los años, se ha vuelto habitual consultar el intérprete de línea de comandos particular que está utilizando como shell porque uno no se puede usar sin el otro. Pero la realidad es que son diferentes.
En cuanto a por qué se los conoce correctamente como intérpretes de línea de comandos y no como el shell real: es porque viven en el shell e interpretan todos los comandos como si se estuvieran ejecutando en un programa. Y al shell no le importa qué intérprete ejecute, siempre que cumpla con los estándares correctos.
Y en cuanto a por qué se les llama intérpretes, es porque realmente son intérpretes. Incluso si no está ejecutando explícitamente un script (y un script es realmente solo un archivo de texto de comandos que crea para que pueda ejecutar los mismos comandos una y otra vez sin tener que volver a escribirlos). Por ejemplo, tome el humilde comando 'ls'. Cuando lo ejecuta, devuelve una lista de archivos. Pero cómo se ejecuta es más importante para su pregunta: en realidad se ejecuta dentro del contexto del intérprete de línea de comandos, incluso si solo ejecuta lo que parece ser un simple comando de apagado. Es decir, se ejecuta como si fuera una declaración en parte de un programa más grande. Se ejecuta como si estuviera en un archivo de script de script de shell sin estar realmente en un archivo de script de shell. Un archivo de script de shell anónimo, por así decirlo.
Todo lo que ejecute en la línea de comandos tiene esto en común (ya sea un comando único como 'ls' o un archivo de script lleno de comandos e iteradores y declaraciones condicionales): todo es procesado por el intérprete de línea de comandos; ya sea Bash, C-Shell, K-Shell (predeterminado en AIX por cierto).
Para ver a qué me refiero, haga un directorio 'prueba':
mkdir test
Ingrese y ejecute los siguientes comandos
grep hello *
Obtendrá algún tipo de respuesta como 'no existe tal archivo o directorio'. Ahora ingrese el comando
echo $?
($? dice, dime qué encontraste en la computadora críptica.) Deberías ver que devuelve un número (debería ser) '2'. Ese es el código de retorno de grep que significa 'no existe tal archivo o directorio'. Ahora ejecuta lo siguiente:
echo hello > hello.txt
grep hello *
echo $?
Verá el archivo 'hello.txt' devuelto por el comando grep inicial y ahora debería ver el 'echo $?' devuelve el número '0', lo que significa que realmente encontró algo.
Incluso si se ejecutan estos comandos aparentemente únicos, el intérprete de línea de comandos actúa como si fueran parte de un programa más grande y realiza un seguimiento de sus valores de retorno. Es por eso que si olvida el * al final del comando grep, no regresa. Se sabe que la declaración está incompleta y espera más información. Después de todo, posiblemente podría pedirle que tome los resultados de algún bucle que es perfectamente legal escribir y ejecutar en la línea de comando.
La conclusión es que el shell es el shell, y el intérprete (cualquiera que sea el nombre del que usa, 'Bash', k-shell, etc.) es diferente. Pero a menudo se usan indistintamente, porque en cualquier instante están completamente unidos.