¿El shell tiene la misma entrada estándar, salida estándar y error estándar como cada otro comando?

¿El shell tiene la misma entrada estándar, salida estándar y error estándar como cada otro comando?

El bash, por ejemplo, se encuentra en /bin/bash, esto significa que es un comando y cada comando tiene tres (0,1,2) poros: entrada estándar, salida estándar, error estándar.

¿Es esto también 100 por ciento cierto para el Shell o hay algo diferente desde el significado especial del Shell como comando o proceso?

Respuesta1

Es lo mismo que cualquier otro programa. Esto le permite redirigir y canalizar las E/S como otros programas.

echo "cat filename" | bash

ejecutará el cat filenamecomando cuando bashlea su entrada estándar de la tubería.

bash -c "echo foo" > filename

ejecutará el echo foocomando y la salida será redirigida al archivo.

En Unix, no hay nada "especial" en el shell. Es sólo un programa ordinario cuyo objetivo principal es ejecutar otros programas.

Respuesta2

Diferenciamos alguna terminología:

Adominioes lo que escribes en tu shell. Puede ser unaliaso unfunción de shell, o puede referirse a unArchivo ejecutable.

UnArchivo ejecutabletal vez unejecutable binario(es decir, uno que contiene código de máquina directamente) o unguion. Los scripts incluyen scripts bash, scripts sh, scripts perl, scripts awk, scripts sed, scripts python, etc. Alabama.

Los primeros dos bytes de su secuencia de comandos (si se va a ejecutar directamente como un archivo ejecutable) deben ser #!, que es el "número mágico" que le indica a su núcleo que lea más bytes hasta que se lea una nueva línea, interprete esos bytes como un camino a unejecutable binario, posiblemente con un solo argumento separado por espacios en blanco (por ejemplo #!/bin/awk -f), y ejecutaresoejecutable binario, con la ruta al script en sí pasada como argumento.

En última instancia, lo único que el núcleo realmente puede ejecutar es código de máquina, es decir, un ejecutable binario. Ejecutables binarios como sh, bash, perl, python, awk, etc. Alabama. son llamadosintérpretes. Interpretan un guión y ejecutan sus instrucciones. Pero deben existir en código de máquina para poder ejecutarse.

Cuando un programa (ejecutable binario) es realmente ejecutado por el kernel, existe como unproceso. Un ejecutable binario es solo un archivo que contiene instrucciones. Aprocesoes una "instancia en ejecución de un programa"; más específicamente, es una abstracción integrada en el kernel que tiene memoria asociada, variables de entorno, un ID de proceso (PID),descriptores de archivosque puede utilizar para entrada y salida, y otros atributos. Puede ejecutar un archivo ejecutable más de una vez "simultáneamente" (no literalmente simultáneamente en una máquina de un solo núcleo, pero debido a la forma en que el kernel asigna los ciclos de CPU, lo hará).parecersimultáneamente) y cada instancia en ejecución será un proceso diferente, aunque todas sean instancias del mismo programa.

0, 1 y 2 (entrada estándar, salida estándar y error estándar) sondescriptores de archivos. A decir verdad, sólo existen por convención. Puede crear un programa usando C que iniciará (ejecutará) otros programas (ejecutará varios ejecutables binarios) sin darles estos descriptores de archivos. Sin embargo,Dado que todos los programas estándar se escriben asumiendo la disponibilidad de los descriptores de archivos 0, 1 y 2, probablemente no obtendrá más que errores (en la mayoría de los casos) y los programas no funcionarán correctamente.

Para entender esto completamente, debes entendercómo surge un proceso. Esto es un poco como el milagro del nacimiento. ;) Todos los procesos deben ser iniciados porotroproceso. Sin preocuparse por cómo se inicia el primer proceso cuando inicia el sistema, el proceso con PID 1 se llama "init" e inicia los otros procesos básicos que su sistema operativo necesita para funcionar.

Cómo un proceso inicia otro proceso es con dos pasos básicos:tenedoryejecutivo Ambas son llamadas al sistema, es decir, son acciones/solicitudes que envía el proceso.al núcleoque sólo el núcleo puede cumplir.

"Fork" significa (en pocas palabras), "núcleo, por favor haz una copia de mí". ("Yo" es un proceso en ejecución). El kernel hace una copia completa del proceso: sus descriptores de archivos, memoria, estado de ejecución (dónde se encuentra al seguir las instrucciones que componen el programa del cual es una instancia), variables de entorno, etc. Entonces es un "clon" del proceso. Ahora bien, ¿cómo puedes distinguir el original de la copia? Por una sola cosa: el estado de devolución de la forkllamada al sistema. El proceso hijo obtiene "0" (éxito) y el proceso padre obtiene el PID del proceso hijo recién creado. Por lo tanto, al inspeccionar este estado de devolución, cada proceso puede determinar qué debe hacer ahora (porque recuerde, ¡están siguiendo el mismo conjunto de instrucciones!).

"Exec" es realmente "execve()". En pocas palabras, le pregunta al núcleo: "núcleo, por favor".reemplazaryo (soy un proceso) con una instancia del programa especificado en el archivo ______". Y el programador también especifica elargumentosque tendrá el nuevo proceso, y laambiente(matriz de variables de entorno) que tendrá.

Entonces, cuando escribes un comando en el shell, lo que realmente sucede (la mayoría de las veces, ignorando casos especiales como los comandos integrados del shell como cd) es que tu shell (que es un proceso en ejecución)tenedores,y luegoejecutivosel comando que especificaste.

Si ha realizado una redirección de entrada o salida como /bin/echo hello > /dev/null, entonces el proceso secundario bifurcadoantes de exechacer ecoajustará sus descriptores de archivo en consecuencia, de modo que el descriptor de archivo 1 (en este ejemplo) esté vinculado /dev/nullen lugar de su terminal o donde estuviera antes.

Entonces, sí, cualquier instancia en ejecución del archivo ejecutable /bin/bashesperará tener disponible un descriptor de archivo 0 desde el cual pueda leer la entrada, un descriptor de archivo 1 en el que pueda escribir la salida y un descriptor de archivo 2 en el que pueda leer y escribir errores. mensajes y entradas/salidas similares.

información relacionada