Shell y la relación entre shell y bash

1. ¿Qué es un caparazón?

El shell es el programa de interfaz entre usted (el usuario) y Linux (o más exactamente, usted y el kernel de Linux). Cada comando que ingresa en el indicador es interpretado por el shell y luego pasado al kernel de Linux.

El shell es un intérprete de lenguaje de comandos. Tiene su propio conjunto de comandos de shell incorporado. Además, el shell también puede ser llamado por otras utilidades y programas de aplicación efectivos de Linux en el sistema.

Siempre que escribe un comando, el shell de Linux lo interpreta. Algunos comandos, como el comando imprimir directorio de trabajo actual (pwd), se incluyen en Linux bash (al igual que los comandos internos de DOS). Otros comandos, como el comando copiar (cp) y el comando mover (rm), son programas independientes que existen en un directorio del sistema de archivos. Para el usuario, no sabe (o puede que no le importe) si un comando está construido dentro del shell o en un programa separado.

El shell primero verifica si el comando es un comando interno, y si no lo es, luego verifica si es una aplicación. La aplicación aquí puede ser un programa de utilidad del propio Linux, como ls y rm, o un programa comercial comprado , como xv, o software público (software de dominio público), como ghostview. Luego, el shell intenta encontrar estas aplicaciones en la ruta de búsqueda ($ PATH). La ruta de búsqueda es una lista de directorios donde se pueden encontrar programas ejecutables. Si el comando que escribe no es un comando interno y el archivo ejecutable no se encuentra en la ruta, se mostrará un mensaje de error. Y si el comando se encuentra con éxito, los comandos internos o las aplicaciones del shell se dividirán en llamadas al sistema y se pasarán al kernel de Linux.

Otra característica importante del shell es que en sí mismo es un lenguaje de programación interpretado, que admite la mayoría de las estructuras de control de programas que se pueden ver en lenguajes de alto nivel, como bucles, funciones, variables y matrices. El lenguaje de programación de shell es fácil de aprender y, una vez que lo domines, se convertirá en tu poderosa herramienta. Cualquier comando que se pueda escribir en el indicador también se puede colocar en un programa de shell ejecutable, lo que significa que una determinada tarea puede simplemente repetirse en el lenguaje de shell.

2. Cómo iniciar el shell

El shell se inicia después de iniciar sesión correctamente en el sistema y siempre será su medio de interactuar con el núcleo del sistema hasta que cierre la sesión. Cada usuario de su sistema tiene un shell predeterminado. El shell predeterminado de cada usuario se especifica en el archivo passwd en el sistema y la ruta del archivo es / etc / passwd. El archivo passwd también contiene otras cosas: el número de identificación de usuario de todos, una copia de la contraseña encriptada y el programa que se ejecuta inmediatamente después de que el usuario inicia sesión. (Nota: para mejorar la seguridad, el sistema actual generalmente coloca la contraseña encriptada en Otro file-shadow, y la contraseña almacenada en passwd se reemplaza por un carácter x) Aunque no existe un requisito estricto de que este programa deba ser un shell de Linux, es el caso en la mayoría de los casos.

3. Conchas de uso común

Hay muchos shells diferentes disponibles en sistemas Linux y UNIX. Los más utilizados son el shell Bourne (sh) , el shell C (csh) y el shell Korn (ksh) . Los tres proyectiles tienen sus ventajas y desventajas.

  • El autor del caparazón de Bourne es Steven Bourne. Es el shell utilizado originalmente por UNIX y se puede utilizar en todos los tipos de UNIX. El shell Bourne es bastante bueno en la programación de shell, pero no es tan bueno como otros shells en el manejo de la interacción con los usuarios.

  • El shell C fue escrito por Bill Joy y tiene más en cuenta la facilidad de uso de la interfaz de usuario. Admite algunas funciones que el shell Bourne no admite, como la finalización de la línea de comandos. Generalmente se cree que la interfaz de programación del shell C no es tan buena como el shell Bourne, pero muchos programadores C utilizan el shell C porque la sintaxis del shell C es muy similar a la del lenguaje C, que es el origen del nombre de shell C.

  • Korn shell (ksh) fue escrito por Dave Korn. Combina las ventajas de C shell y Bourne shell y es totalmente compatible con Bourne shell.

Además de estos shells, muchos otros programas de shell han absorbido las ventajas de estos programas de shell originales y se han convertido en nuevos shells. Los más utilizados en Linux son tcsh (csh extendido) , Bourne Again shell (extendido bash, sh) y Public Domain Korn shell (extendido pdksh, ksh) . Bash es el shell predeterminado para la mayoría de los sistemas Linux.

4. El Bourne Again Shell (bash)

El shell Bourne Again (bash) , como su nombre lo indica, es una extensión del shell Bourne. bash es totalmente compatible con versiones anteriores del shell Bourne, y se han agregado y mejorado muchas características sobre la base del shell Bourne. Bash también contiene muchas ventajas de los proyectiles C y Korn. Bash tiene una interfaz de programación muy flexible y potente, así como una interfaz de usuario muy amigable.

¿Por qué usar bash en lugar de sh? La mayor desventaja del shell Bourne es que maneja la entrada del usuario. Escribir comandos en el shell Bourne puede resultar engorroso, especialmente cuando escribe muchos comandos similares. Y bash ha preparado varias funciones para facilitar la entrada de comandos.

4.1 Finalización de la línea de comandos

Por lo general, cuando ingresa un comando en bash (o cualquier otro shell), puede determinar el comando que desea ingresar sin escribir el comando en el shell completo. Por ejemplo, suponga que el directorio de trabajo actual contiene los siguientes archivos y subdirectorios:
News/ bin/ games/ mail/ samplefile test/

Si desea ingresar al subdirectorio de prueba, ingresará el siguiente comando:
cd test

Este comando puede satisfacer sus necesidades, pero bash también proporciona una forma ligeramente diferente de lograr lo mismo. Debido a que test es el único subdirectorio en el directorio actual que comienza con la letra t, bash puede determinar lo que desea hacer después de ingresar solo la letra t:
cd t

Después de escribir esa letra, la única posibilidad es probar. Si desea que bash termine el comando por usted, presione la tecla Tab:
cd t<tab>

Cuando hagas esto, bash te ayudará a completar los comandos y mostrarlos en la pantalla. Pero el comando no se ejecuta antes de presionar la tecla Enter, y bash le permitirá verificar si el comando completado es lo que realmente necesita. Es posible que no vea su valor cuando ingresa un comando corto como este, incluso cuando el comando es muy corto, ralentizará la velocidad de entrada, pero cuando el comando que desea ingresar sea un poco largo, encontrará cómo esta característica es. Hermoso.

Pero, ¿qué sucede cuando hay más de un archivo que comienza con la letra t en el directorio? Habrá problemas cuando use el comando de finalización, veamos la siguiente situación, el directorio actual tiene el siguiente contenido:
News/ bin/ mail/ samplefile test/ tools/ working/

Ahora hay dos archivos que comienzan con la letra t en este directorio. Suponga que aún desea ingresar al subdirectorio de prueba, ¿cómo usar los comandos para completarlo? Si escribe como antes:
cd t<tab>

Bash no sabrá en qué subdirectorio desea ingresar, porque la información proporcionada no es única. Si lo hace, bash emitirá un pitido para recordarle que no hay suficiente información para completar su comando. Después del pitido, bash no cambia el comando ingresado. Esto le permitirá ingresar más información sobre la base original. En este ejemplo, solo necesita escribir una e y presionar la tecla Tab nuevamente, y luego bash will Hay suficiente información para completar su comando:
cd test

Siempre que presione la tecla Tab cuando ingrese un comando, bash hará todo lo posible para completar el comando. Si no funciona, emitirá un pitido para recordarle que necesita más información. Debe escribir más caracteres y presionar Tab nuevamente, repita este proceso hasta que aparezca el comando que desea.

4.2 comodín

Otra forma de facilitar la entrada de comandos es usar comodines en el comando. bash admite tres comodines:

  • * Coincide con cualquier personaje y cualquier número de caracteres
  • ? Coincide con cualquier carácter individual
  • […] Coincide con cualquier carácter individual contenido entre paréntesis

* El uso de comodines es algo así como completar un comando. Por ejemplo, suponga que el directorio actual contiene los siguientes archivos:
News/ bin/ games/ mail/ samplefile test/

Si desea ingresar al directorio de prueba, debe escribir cd test, o desea completarlo con el comando:
cd t<tab>

Ahora hay una tercera forma de hacer lo mismo. Debido a que solo hay un archivo que comienza con la letra t, también puede usar el comodín * para ingresar al directorio. Escriba el siguiente comando:
cd t*

* Coincide con cualquier carácter y cualquier número de caracteres, por lo que el shell reemplazará t * con test (el único archivo en el directorio actual que coincide con el esquema de comodines). Será confiable si solo hay un archivo en el directorio actual que comienza con la letra t. Pero si hay más de un archivo en el directorio actual que comienza con la letra t, el shell intentará ingresar al primer directorio que cumpla con el esquema de coincidencia. Este directorio es el primer directorio en orden alfabético. Este directorio puede o no ser lo que esperas.

Un uso más práctico del comodín * es usar comodines en varios archivos con nombres similares en el comando que desea ejecutar. Por ejemplo, suponga que el directorio actual contiene los siguientes archivos:
ch1.doc ch2.doc ch3.doc chimp config mail/ test/ tools/

Si necesita imprimir todos los .docarchivos con la extensión , puede usar un comando simplificado como este:
lpr *.doc

En este ejemplo, bash reemplazará * .doc con todos los archivos en el directorio actual cuyos nombres coincidan con el esquema de comodines. Después de que bash lo haya reemplazado, el comando se procesará como:
lpr ch1.doc ch2.doc ch3.doc

El comando lpr se llamará con ch1.doc, ch2.doc y ch3.doc como parámetros.

¿El carácter comodín? Excepto para hacer coincidir un solo carácter, otras funciones son las mismas que el carácter comodín *. Si usa el carácter comodín? Para imprimir todos los archivos con la extensión .doc en el directorio mencionado anteriormente, escriba el siguiente comando:
lpr ch?.doc

El comodín puede [...] coincidir con el carácter o el rango de caracteres entre paréntesis. También tome el directorio anterior como ejemplo, para imprimir todos los archivos con la extensión .doc en ese directorio, puede escribir uno de los siguientes comandos:
lpr ch[123].doc
o:
lpr ch[1-3].doc

4.3 Historial de comandos

4.4 Redirección de entrada

La redirección de entrada se utiliza para cambiar la fuente de entrada de un comando. Algunos comandos requieren suficiente información en la línea de comandos para funcionar. Por ejemplo, rm, debe decirle a rm el archivo que desea eliminar en la línea de comando. Otros comandos requieren una entrada más detallada y la entrada de estos comandos puede ser un archivo. Por ejemplo, el comando wc cuenta el número de caracteres, palabras y líneas en los archivos ingresados. Si simplemente escribe wc <enter> en la línea de comando, wc esperará a que le diga qué contar. En este momento, bash está muerto, todo lo que escribe aparece en la pantalla, pero no sucederá nada. Esto se debe a que el comando wc recopila entradas para sí mismo. Si presiona Ctrl-D, el resultado del comando wc se escribirá en la pantalla. Si ingresa un nombre de archivo como parámetro, como en el siguiente ejemplo, wc devolverá el número de caracteres, palabras y líneas que contiene el archivo:
wc test
11 2 1

Otra forma de pasar el contenido del archivo de prueba al comando wc es redirigir la entrada de wc. El símbolo <se usa en bash para redirigir la entrada del comando actual a un archivo específico. Por lo tanto, puede usar el siguiente comando para redirigir la entrada del comando wc al archivo de prueba:
wc < test
11 2 1
La redirección de entrada no se usa a menudo porque la mayoría de los comandos especifican el nombre del archivo de entrada en la línea de comando en forma de parámetros. Sin embargo, cuando usa un comando que no acepta nombres de archivo como parámetros de entrada y la entrada requerida está en un archivo existente, puede usar la redirección de entrada para resolver el problema .

4.5 Redirección de salida

La redirección de salida se usa más comúnmente que la redirección de entrada. La redirección de salida le permite redirigir la salida de un comando a un archivo en lugar de mostrarlo en la pantalla.

Esta función se puede utilizar en muchos casos. Por ejemplo, si el resultado de un determinado comando es demasiado para mostrarse completamente en la pantalla, puede redirigirlo a un archivo y luego usar un editor de texto para abrir el archivo más tarde; también cuando desee guardar el resultado de un comando Este método se puede utilizar. Además, la redirección de salida se puede usar cuando la salida de un comando se usa como entrada de otro comando. (También hay una forma más sencilla de usar la salida de un comando como entrada de otro comando, que es usar tuberías. El uso de tuberías se presentará en la sección "Tuberías" de este artículo).

El uso de la redirección de salida es muy similar a la redirección de entrada, pero el símbolo para la redirección de salida es>.

Nota: La mejor manera de memorizar los símbolos de redirección de entrada / salida es considerar <como un embudo, y la boca pequeña del embudo apunta a los comandos que deben ingresarse (porque los comandos que deben ingresarse estarán en el lado izquierdo de <), y> como Una boca grande apunta a un embudo con comandos de salida.

Como ejemplo de redirección, cuando desee guardar la salida del comando ls como un archivo llamado directorio.out, puede usar el siguiente comando:
ls > directory.out

4.6 Tuberías

Las tuberías pueden conectar una serie de comandos. Esto significa que la salida del primer comando se canalizará al segundo comando y se usará como entrada del segundo comando, la salida del segundo comando se usará como entrada del tercer comando , y así sucesivamente. La salida será el último comando en la línea de tubería que se muestra en la pantalla (si la línea de comando usa la redirección de salida, colocará un archivo).

Puede crear una tubería utilizando el símbolo de tubería |. El siguiente ejemplo es una tubería:
cat sample.text | grep "High" | wc -l
esta tubería enviará la salida del comando cat (enumera el contenido de un archivo) al comando grep. El comando grep busca la palabra High en la entrada. La salida del comando grep son todas las líneas que contienen la palabra High. Esta salida se envía al comando wc. El comando wc con la opción -l contará el número de líneas en la entrada. Suponga que el contenido de sample.txt es el siguiente:

Things to do today:
Low: Go grocery shopping
High: Return movie
High: Clear level 3 in Alien vs. Predator
Medium: Pick up clothes from dry cleaner

La canalización devolverá el resultado 2, lo que indica que tiene dos cosas muy importantes que hacer hoy:
cat sample.text | grep "High" | wc -l
2

4.7 Aviso

Bash tiene dos niveles de mensajes de usuario. El primer nivel es el indicador que suele ver cuando bash está esperando la entrada de un comando. El indicador predeterminado de primer nivel es el carácter $ (si es un superusuario, es el signo #). Puede cambiar su mensaje predeterminado cambiando el valor de la variable PS1 en bash, por ejemplo:
PS1="Please enter a command"

Cambie el indicador del shell bash a la cadena especificada.

Muestra un indicador de segundo nivel cuando bash espera ingresar más información para completar el comando. El indicador de segundo nivel predeterminado es>. Si desea cambiar el indicador de segundo nivel, puede hacerlo configurando el valor de la variable PS2:
PS2="I need more information"

Además, también puede utilizar caracteres especiales para definir su mensaje. La siguiente lista enumera los caracteres especiales más utilizados.

personaje sentido
/! Muestra el número de registro histórico del comando.
/ # Muestra el número de comando del comando actual.
PS Muestre el signo $ como aviso, si el usuario es root, se muestra el signo #.
// Mostrar barras invertidas.
/re Muestra la fecha actual.
/ h Muestra el nombre de host.
/norte Imprime una nueva línea.
/ nnn Muestra el valor octal de nnn.
/ s Muestra el nombre del shell que se está ejecutando actualmente.
/ t Muestra la hora actual.
/ u Muestra el nombre de usuario del usuario actual.
/ W Muestra el nombre del directorio de trabajo actual.
/ w Muestra la ruta del directorio de trabajo actual.

Estos caracteres especiales se pueden combinar en muchos esquemas de mensajes útiles (o se pueden combinar en esquemas muy extraños). Por ejemplo, configure PS1 en:
PS1="/t"

Esto hace que el mensaje muestre la hora actual como se muestra a continuación (no habrá espacios después del mensaje):
02:16:15

Y las siguientes configuraciones:
PS1=/t

Hará que el mensaje se convierta en lo siguiente:
t

Esto muestra la importancia de las comillas en la configuración, la siguiente cadena de solicitud:
PS1="/t// "

Hará que el mensaje se vea así:
02:16:30/

En este caso, habrá un espacio después de la solicitud porque hay un espacio entre las comillas.

4.8 Control de trabajos

El control de trabajos puede controlar el comportamiento del proceso en ejecución. En particular, puede suspender un proceso en ejecución y reanudar su funcionamiento más tarde. Bash realiza un seguimiento de todos los procesos iniciados. Puede suspender o reanudar un proceso en ejecución en cualquier momento durante su vida útil.

Presione Ctrl-Z para suspender un proceso en ejecución. El comando bg hace que un proceso suspendido continúe ejecutándose en segundo plano, mientras que el comando fg hace que el proceso continúe ejecutándose en primer plano. Estos comandos se utilizan a menudo cuando el usuario quiere ejecutar en segundo plano y accidentalmente ponerlo en primer plano. Cuando un comando se ejecuta en primer plano, prohibirá al usuario interactuar con el shell hasta el final del comando. Esto generalmente no causa problemas, porque la mayoría de los comandos se ejecutan rápidamente. Si el comando que desea ejecutar lleva mucho tiempo, generalmente lo ponemos en segundo plano para que podamos seguir ingresando otros comandos en primer plano. Por ejemplo, si ingresa este comando:
command find / -name "test" > find.out

Buscará un archivo llamado test en todo el sistema de archivos y guardará el resultado en un archivo llamado fing.out. Si se ejecuta en primer plano, dependiendo del tamaño del sistema de archivos, su shell no estará disponible durante varios segundos o incluso varios minutos. Si no desea esto, puede ingresar lo siguiente:
control-z
bg

El comando de búsqueda se suspende primero, luego continúa ejecutándose en segundo plano y puede volver inmediatamente a bash.

Supongo que te gusta

Origin blog.csdn.net/mahoon411/article/details/112499963
Recomendado
Clasificación