Diferencias
Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
| tutorial_de_shell_de_bourne [2024/08/10 18:52] – [Construcciones de Programación de Guiones] peron | tutorial_de_shell_de_bourne [2026/04/21 16:09] (actual) – editor externo 127.0.0.1 | ||
|---|---|---|---|
| Línea 1: | Línea 1: | ||
| - | =======Tutorial de Shell de Bourne | + | =======Tutorial de Shell de Bourne======== |
| - | Este tutorial histórico presenta algunos métodos y comandos que lo ayudarán a hacer expeditas las tareas diarias que se realizan con la shell sh de Bourne | + | Este tutorial histórico presenta algunos métodos y comandos que lo ayudarán a hacer expeditas las tareas diarias que se realizan con el [[intérpretes |
| + | |||
| + | La primer sección de este tutorial " | ||
| - | La primer parte del tutorial " | ||
| ===== Lenguaje de Comandos de la Shell ====== | ===== Lenguaje de Comandos de la Shell ====== | ||
| El lenguaje de la shell tiene caracteres especiales que le ofrecen algunos atajos para realizar tareas en la shell. Estos caracteres especiales se listan abajo y se discuten en esta sección del tutorial. | El lenguaje de la shell tiene caracteres especiales que le ofrecen algunos atajos para realizar tareas en la shell. Estos caracteres especiales se listan abajo y se discuten en esta sección del tutorial. | ||
| - | + | Estos son //metacaracteres//. Un metacaracter es un caracter que tiene un significado especial en el lenguaje de comandos | |
| - | Estos son metacaracteres. Un metacaracter es un caracter que tiene un significado especial en el lenguaje de ocmandos | + | |
| ^ Metacaracter ^ Significado ^ | ^ Metacaracter ^ Significado ^ | ||
| Línea 21: | Línea 21: | ||
| - | El significado de los metacaracteres es similar a decir "etc, etc, etc", "todo lo anterior", | + | El significado de los metacaracteres es similar a decir "etc, etc, etc", "todo lo anterior", |
| ===*=== | ===*=== | ||
| - | '' | + | '' |
| El '' | El '' | ||
| Línea 123: | Línea 123: | ||
| Intente el siguiente ejemplo | Intente el siguiente ejemplo | ||
| - | - Haga un fichero corto llamado '' | + | - Escriba |
| - ingresa mv prueba prueba**^g**1 (recuerda que **^g** se hace con **Ctrl+g**) | - ingresa mv prueba prueba**^g**1 (recuerda que **^g** se hace con **Ctrl+g**) | ||
| - ls prueba1 | - ls prueba1 | ||
| Línea 137: | Línea 137: | ||
| le indicará | le indicará | ||
| - | <codeprueba1</ | + | <code> |
| === [...] === | === [...] === | ||
| Línea 171: | Línea 171: | ||
| El caracter ''&'' | El caracter ''&'' | ||
| - | Algunos comandos de shell requieren tiempo considerable para su cumplimiento. Es conveniente dejar que dichos comandos corran en //segundo plano// para dejar libre su terminal de manera que pueda continuar haciendo otras tareas mientras tanto. | + | Algunos comandos de shell requieren tiempo considerable para su cumplimiento. Es conveniente dejar que dichos comandos corran en //segundo plano// para dejar libre su terminal de manera que pueda continuar haciendo otras tareas mientras tanto. |
| <code bash> | <code bash> | ||
| Línea 177: | Línea 177: | ||
| </ | </ | ||
| - | El comando [[grep]] puede desarrollar búsquedas | + | El comando [[grep]] puede desarrollar búsquedas |
| <code bash> | <code bash> | ||
| $ grep palabra * & | $ grep palabra * & | ||
| - | 2190 | + | 21940 |
| $ | $ | ||
| </ | </ | ||
| Línea 193: | Línea 193: | ||
| El metacaracter '';'' | El metacaracter '';'' | ||
| - | Si desea tipear | + | Si desea introducir |
| <code bash> | <code bash> | ||
| Línea 208: | Línea 208: | ||
| ^ Orden ^ Comando ^ Acción ^ | ^ Orden ^ Comando ^ Acción ^ | ||
| - | |1 |cd |cambia al directorio de usuario | | + | |1 |'' |
| - | |2 |pwd |imprime el directorio actual | | + | |2 |'' |
| - | |3 |ls |lista los ficheros en el directorio actual | | + | |3 |'' |
| - | |4 |ed |prueba ingresar al editor de líneas [[ed]] y comenzar por editar el fichero '' | + | |4 |'' |
| ¿Notó la rápida ráfaga de comandos? Podría no querer que estas veloces respuestas se presenten en su terminal. La sección de [[# | ¿Notó la rápida ráfaga de comandos? Podría no querer que estas veloces respuestas se presenten en su terminal. La sección de [[# | ||
| Línea 229: | Línea 229: | ||
| ===Desactivar caracteres especiales por Citado=== | ===Desactivar caracteres especiales por Citado=== | ||
| - | Todos los caracters | + | Todos los caracteres |
| Todos los caracteres entrecomillados ''< | Todos los caracteres entrecomillados ''< | ||
| - | Los metacaracteres en la shell pierden | + | Los metacaracteres en la shell pierden |
| - | Un delimitador separa argumentos, diciéndole a la shell donde termina un argumento y comienza otro. El espacio en blanco tiene un significado especial para la shell porque se usa como delimitador entre los argumentos de un comando. | + | Un //delimitador// separa argumentos, diciéndole a la shell donde termina un argumento y comienza otro. El espacio en blanco tiene un significado especial para la shell porque se usa como delimitador entre los argumentos de un comando. |
| - | El comando //banner// usa espacios | + | El comando //banner// usa los caracteres de espacio |
| <code bash> | <code bash> | ||
| Línea 334: | Línea 334: | ||
| El caracter ''<'' | El caracter ''<'' | ||
| - | El formato | + | La sintaxis |
| <code bash> | <code bash> | ||
| Línea 357: | Línea 357: | ||
| El caracter ''>'' | El caracter ''>'' | ||
| - | Un símbolo único de redirección creará un nuevo fichero, o borrará un fichero viejo y reemplazará sus contenidos con la nueva salida. | + | Un símbolo único de redirección creará un nuevo fichero, o borrará un fichero viejo y reemplazará sus contenidos con la nueva salida. |
| <code bash> | <code bash> | ||
| Línea 437: | Línea 437: | ||
| Si dos comandos o mas están interconectados por medio de un caracter caño '' | Si dos comandos o mas están interconectados por medio de un caracter caño '' | ||
| - | El formato | + | La sintaxis |
| <code bash> | <code bash> | ||
| Línea 512: | Línea 512: | ||
| El comando //batch// es útil si está ejecutando un proceso o programa de shell que requiere una cantidad mayor a la normal de tiempo de cómputo. El comando //batch// produce un trabajo "en lote", que consiste en comandos a ser ejecutados por la computadora. El trabajo forma una cola, y se ejecutará no bien la carga del procesador del sistema descienda hasta un nivel aceptable. Esto libera a la computadora para poder responder rápidamente a otras entradas que le pudiesen efectuar otros o usted mismo. | El comando //batch// es útil si está ejecutando un proceso o programa de shell que requiere una cantidad mayor a la normal de tiempo de cómputo. El comando //batch// produce un trabajo "en lote", que consiste en comandos a ser ejecutados por la computadora. El trabajo forma una cola, y se ejecutará no bien la carga del procesador del sistema descienda hasta un nivel aceptable. Esto libera a la computadora para poder responder rápidamente a otras entradas que le pudiesen efectuar otros o usted mismo. | ||
| - | El formato | + | La sintaxis |
| <code bash> | <code bash> | ||
| $ batch | $ batch | ||
| primer comando | primer comando | ||
| - | " | + | . |
| - | " | + | . |
| - | " | + | . |
| último comando | último comando | ||
| ^d | ^d | ||
| Línea 540: | Línea 540: | ||
| </ | </ | ||
| - | El comando //at// indica a la computadora un momento específico para ejecutar dicho comando. | + | El comando //at// indica a la computadora un momento específico para ejecutar dicho comando. |
| <code bash> | <code bash> | ||
| $ at hora | $ at hora | ||
| primer comando | primer comando | ||
| - | | + | |
| - | | + | |
| - | | + | |
| último comando | último comando | ||
| ^d | ^d | ||
| Línea 563: | Línea 563: | ||
| </ | </ | ||
| - | Tanto el comando //batch// y el comando //at// le proporcionarán un número de trabajo. Si decide que no desea ejecutar los comandos //batch// o //at// que ya están a la espera en una cola de procesos por lote, puede borrarlos con la opción **-r** del comando //at//, proporcionando el número de trabajo. | + | Tanto el comando //batch// y el comando //at// le proporcionarán un número de trabajo. Si decide que no desea ejecutar los comandos //batch// o //at// que ya están a la espera en una cola de procesos por lote, puede borrarlos con la opción **-r** del comando //at//, proporcionando el número de trabajo. |
| <code bash> | <code bash> | ||
| Línea 615: | Línea 615: | ||
| === Terminar Procesos Activos === | === Terminar Procesos Activos === | ||
| - | El comando //kill// se utiliza para detener procesos activos de la shell. | + | El comando //kill// se utiliza para detener procesos activos de la shell. |
| <code bash> | <code bash> | ||
| Línea 621: | Línea 621: | ||
| </ | </ | ||
| - | ¿Que hace si decide que no necesita ejecutar el comando que está ejecutándose en segundo plano? Si presiona la **tecla BREAK** o la **tecla DEL**, decubrirá que no detiene los procesos en segundo plano de la misma forma que lo hace con los comandos interactivos. Para ello se utiliza | + | ¿Que hace si decide que no necesita ejecutar el comando que está ejecutándose en segundo plano? Si presiona la **tecla BREAK** o la **tecla DEL**, decubrirá que no detiene los procesos en segundo plano de la misma forma que lo hace con los comandos interactivos. Para ello debe utilizar |
| <code bash> | <code bash> | ||
| Línea 958: | Línea 958: | ||
| ===Asignar Valores con el comando read === | ===Asignar Valores con el comando read === | ||
| - | Puede establecer su programa de forma que ingrese el comando, y luego que le solicite ingresar el valor para la variable. El comando //read// asigna la entrada a la variable espeficiada. | + | Puede establecer su programa de forma que ingrese el comando, y luego que le solicite ingresar el valor para la variable. El comando //read// asigna la entrada a la variable espeficiada. |
| <code bash> | <code bash> | ||
| Línea 1046: | Línea 1046: | ||
| Otra forma de asignar un valor a una variable es sustituir la salida de un comando por el valor. Esto será muy útil en la siguiente sección, donde intentaremos bucles y construcciones condicionales. | Otra forma de asignar un valor a una variable es sustituir la salida de un comando por el valor. Esto será muy útil en la siguiente sección, donde intentaremos bucles y construcciones condicionales. | ||
| - | El formato | + | La sintaxis |
| <code bash> | <code bash> | ||
| Línea 1137: | Línea 1137: | ||
| === Comentarios=== | === Comentarios=== | ||
| | | ||
| - | Antes de comenzar a escribir programas de la shell con bucles, querrá sabner cómo poner comentarios sobre su programa en el mismo fichero, los cuales son ignorados por el sistema. Para poner comandos en un programa, comience el comentario con ''#'' | + | Antes de comenzar a escribir programas de la shell con bucles, querrá sabner cómo poner comentarios sobre su programa en el mismo fichero, los cuales son ignorados por el sistema. Para poner comandos en un programa, comience el comentario con ''#'' |
| | | ||
| < | < | ||
| Línea 1154: | Línea 1154: | ||
| ===El Documento Aquí=== | ===El Documento Aquí=== | ||
| - | El Documento Aquí le permite redirigir líneas de entrada | + | El Documento |
| <code bash> | <code bash> | ||
| Línea 1162: | Línea 1162: | ||
| </ | </ | ||
| - | El documento Aqui puede usarse en un programa de shell, para redirigir | + | El documento |
| <code bash> | <code bash> | ||
| Línea 1186: | Línea 1186: | ||
| </ | </ | ||
| - | Para recibir | + | Para recibir |
| <code bash> | <code bash> | ||
| - | + | ||
| - | De fulana Lun May 14 14:31 CDT 1984 | + | De fulana |
| Que los cumplas muy feliz! | Que los cumplas muy feliz! | ||
| $ | $ | ||
| Línea 1277: | Línea 1277: | ||
| comando1 | comando1 | ||
| comando2 | comando2 | ||
| - | " | + | . |
| - | " | + | . |
| - | " | + | . |
| último comando | último comando | ||
| done | done | ||
| Línea 1336: | Línea 1336: | ||
| while | while | ||
| | | ||
| - | | + | |
| - | | + | |
| - | | + | |
| | | ||
| do | do | ||
| | | ||
| - | | + | |
| - | | + | |
| - | | + | |
| | | ||
| done | done | ||
| Línea 1397: | Línea 1397: | ||
| if | if | ||
| comando1 | comando1 | ||
| - | " | + | . |
| - | " | + | . |
| - | " | + | . |
| último comando | último comando | ||
| then | then | ||
| comando1 | comando1 | ||
| - | " | + | . |
| - | " | + | . |
| - | " | + | . |
| último comando | último comando | ||
| fi | fi | ||
| Línea 1449: | Línea 1449: | ||
| if | if | ||
| comando1 | comando1 | ||
| - | " | + | . |
| - | " | + | . |
| - | " | + | . |
| último comando | último comando | ||
| then | then | ||
| comando1 | comando1 | ||
| - | " | + | . |
| - | " | + | . |
| - | " | + | . |
| último comando | último comando | ||
| else | else | ||
| comando1 | comando1 | ||
| - | " | + | . |
| - | " | + | . |
| - | " | + | . |
| último comando | último comando | ||
| fi | fi | ||
| Línea 1543: | Línea 1543: | ||
| </ | </ | ||
| + | |||
| + | === La construcción condicional case...esac=== | ||
| + | |||
| + | La **case..esac** es una construcción múltiple choice, que permite elegir una de varios patrones, y luego ejecutar una lista de comandos para dicho patrón. La palabra clave '' | ||
| + | |||
| + | |||
| + | <code bash> | ||
| + | case caracteres | ||
| + | in | ||
| + | patrón1 | ||
| + | linea de comando1 | ||
| + | . | ||
| + | . | ||
| + | . | ||
| + | última linea de comando | ||
| + | ;; | ||
| + | patron2) | ||
| + | línea de comando1 | ||
| + | . | ||
| + | . | ||
| + | . | ||
| + | última línea de comando | ||
| + | ;; | ||
| + | esac | ||
| + | </ | ||
| + | |||
| + | La construcción **case** intentará coincidir caracteres con el primer patrón. Si hay coincidencia, | ||
| + | |||
| + | Si el primer patrón no coincide, entonces el programa procederá al segundo patrón. Luego de alcanzar una coincidencia de patrón, el prorgrama no intentará coincidir ningún otro patrón más, pero irá al comando que sigue a '' | ||
| + | |||
| + | Si usted ha usado el editor [[vi]], ya sabe que debe asignar un valor a la variable '' | ||
| + | |||
| + | '' | ||
| + | |||
| + | <code bash> | ||
| + | TERM=codigo de terminal | ||
| + | export TERM | ||
| + | </ | ||
| + | |||
| + | En este ejemplo de '' | ||
| + | |||
| + | El programa '' | ||
| + | |||
| + | Al final de los patrones para las terminales de la [[serie VT]] aparece el patrón '' | ||
| + | |||
| + | <code bash> | ||
| + | echo Si tiene una terminal DEC VT52, ingrese vt52 | ||
| + | echo Si tiene un terminal DEC VT100, ingrese vt100 | ||
| + | echo Si tiene un terminal DEC VT320, ingrese vt320 | ||
| + | read term | ||
| + | case $term | ||
| + | in | ||
| + | vt52) | ||
| + | TERM=VT32 | ||
| + | ;; | ||
| + | vt100) | ||
| + | TERM=VT100 | ||
| + | ;; | ||
| + | vt320) | ||
| + | TERM=VT320 | ||
| + | ;; | ||
| + | *) | ||
| + | echo No es un tipo de terminal correcto. | ||
| + | ;; | ||
| + | esac | ||
| + | export TERM | ||
| + | echo Fin del programa | ||
| + | </ | ||
| + | |||
| + | ¿Qué hubiese sucedido de haber puesto el patrón '' | ||
| + | |||
| + | Cuando lee la sección de modificar su ambiente de inicio de sesión, podría querer aprovechar el programa '' | ||
| + | |||
| + | <code bash> | ||
| + | set.term | ||
| + | </ | ||
| + | |||
| + | a su fichero '' | ||
| + | |||
| + | ===Declaración de control incondicional break=== | ||
| + | |||
| + | El comando **break** detiene incondicionalmente la ejecución de cualquier bucle en el cual se encuentra, y va al siguiente comando que sigue a las declaraciones '' | ||
| + | |||
| + | En el ejemplo del programa '' | ||
| + | |||
| + | <code bash> | ||
| + | echo Si tiene una terminal DEC VT52, ingrese vt52 | ||
| + | echo Si tiene un terminal DEC VT100, ingrese vt100 | ||
| + | echo Si tiene un terminal DEC VT320, ingrese vt320 | ||
| + | read term | ||
| + | case $term | ||
| + | in | ||
| + | vt52) | ||
| + | TERM=VT32 | ||
| + | ;; | ||
| + | vt100) | ||
| + | TERM=VT100 | ||
| + | ;; | ||
| + | vt320) | ||
| + | TERM=VT320 | ||
| + | ;; | ||
| + | *) | ||
| + | break | ||
| + | ;; | ||
| + | esac | ||
| + | export TERM | ||
| + | echo Fin del programa | ||
| + | </ | ||
| + | |||
| + | En la medida que escriba mas programas de shell, podría querer usar dos otros comandos incondicionales, | ||
| + | |||
| + | Normalmente, | ||
| + | |||
| + | |||
| + | ====Depurando programas==== | ||
| + | |||
| + | Depurar es un término informático que significa buscar y encontrar errores en un programa. Existirán veces en las cuales ejecute un programa de shell y no pasará nada. Hay un " | ||
| + | |||
| + | Su programa puede consistir en varios pasos, o varios gurpos de comandos. ¿Cómo descubriría cuál paso es el culpable? Existen dos opciones en el intérprete **sh** que lo ayudarán a depurar un programa. | ||
| + | |||
| + | |'' | ||
| + | |'' | ||
| + | |||
| + | Para intentar estas dos opciones, cree un programa de shell que contenga un error en él. Por ejemplo, ingrese la siguiente lista de comandos en un fichero llamado '' | ||
| + | |||
| + | <code bash> | ||
| + | $ cat bug | ||
| + | hoy=' | ||
| + | persona=$1 | ||
| + | mail $2 | ||
| + | $persona | ||
| + | Cuando se desconecte, venga a mi oficina, por favor. | ||
| + | $hoy | ||
| + | MLH | ||
| + | $ | ||
| + | </ | ||
| + | |||
| + | El mensaje de correo enviado a Tomás ('' | ||
| + | |||
| + | <code bash> | ||
| + | De mlh Mie Abr 10 11:36 CST 1984 | ||
| + | Tom | ||
| + | Cuando se desconecte, venta a mi oficina por favor. | ||
| + | Mie Abr 10 11: | ||
| + | MLH | ||
| + | $ | ||
| + | ? | ||
| + | . | ||
| + | </ | ||
| + | |||
| + | Si intenta ejecutar '' | ||
| + | |||
| + | Para depurar este programa, intente '' | ||
| + | |||
| + | <code bash> | ||
| + | $ sh -v bug tomas tomi | ||
| + | hoy=' | ||
| + | persona=$1 | ||
| + | mail $2 | ||
| + | </ | ||
| + | |||
| + | Note que la salida se detiene en el comando **mail**. Hay problemas con **mail**. El documento aquí debe usarse para redirigir la entrada a **mail**. | ||
| + | |||
| + | Antes de corregir el programa '' | ||
| + | |||
| + | <code bash> | ||
| + | sh -x bug tomas tomi | ||
| + | +date | ||
| + | hoy=Mie | ||
| + | persona=tomas | ||
| + | +mail tomi | ||
| + | </ | ||
| + | |||
| + | Una vez mas, el programa se detiene en el comando **mail**. Note que las sustituciones para las variables han sido establecidas, | ||
| + | |||
| + | El programa '' | ||
| + | |||
| + | <code bash> | ||
| + | $ cat bug | ||
| + | hoy=' | ||
| + | persona=$1 | ||
| + | mail $2 <<! | ||
| + | $persona | ||
| + | Cuando se desconecte, venga a mi oficina por favor. | ||
| + | $hoy | ||
| + | MLH | ||
| + | ! | ||
| + | $ | ||
| + | </ | ||
| + | |||
| + | El comando **tee** es un comando útil para depurar cañerías. Coloca una copia de la salida de un comando en un fichero que usted nombre, así como lo entuba a otro comando. La sintaxis general del comando **tee** es: | ||
| + | |||
| + | <code bash> | ||
| + | comando1 | tee fichero.guardado | comando2 | ||
| + | </ | ||
| + | |||
| + | '' | ||
| + | |||
| + | Si queire revisar la salida del comando grep en la siguiente línea de comandos: | ||
| + | |||
| + | <code bash> | ||
| + | who | grep $1 | cut -c1-9 | ||
| + | </ | ||
| + | |||
| + | Puede usar tee para copiar la salida de **grep** en un fichero para revisarlo una vez que el programa haya terminado con su ejecución. | ||
| + | |||
| + | <code bash> | ||
| + | who | grep $1 | tee revisar | cut -c1-9 | ||
| + | </ | ||
| + | |||
| + | el fichero '' | ||
| + | |||
| + | <code bash> | ||
| + | $ who | grep mlhmo | tee revisar | cut -c1-9 | ||
| + | $ mlhmo | ||
| + | $ cat revisar | ||
| + | mlhmo | ||
| + | $ | ||
| + | </ | ||
| + | |||
| + | >Si escribe muchos programas de shell, querrás referirte a UNIX System Shell Commands and Programming, | ||
| + | |||
| + | ==== Modificando su Ambiente de Logueo ==== | ||
| + | |||
| + | === ¿Qué es un .profile? === | ||
| + | ===Agregar comandos a .profile=== | ||
| + | ===Configurar las opciones de TErminal=== | ||
| + | |||
| + | ===Usar variables de shell=== | ||
| + | ==HOME== | ||
| + | ==PATH== | ||
| + | == TERM== | ||
| + | ==PS1== | ||
| + | Una de las cosas interesantes de su '' | ||
| + | |||
| + | Ingresa: | ||
| + | |||
| + | <code bash> | ||
| + | |||
| + | Y su prompt tendrá el siguiente aspecto: | ||
| + | |||
| + | <code bash> | ||
| + | $ . .profile | ||
| + | Sus deseos son órdenes | ||
| + | </ | ||
| + | |||
| + | El mundano '' | ||
| + | |||
| + | |||
| + | ====Conclusión==== | ||
| + | |||
| + | Este tutorial le ha otorgado lo básico para crear algunos guiones de programación de shell. Si ha iniciado sesión y ha intentado los ejemplos y ejercicios de este tutorial, proablemente podrás realizar muchas de tus tares diarias recurriendo a programas de shell. La programación de shell puede ser mucho más compleja y desarrollar tareas más complicadas que las que se muestran aquí. Si quieres leer más de los comandos de la shell y la programación, | ||
