Herramientas de usuario

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anteriorRevisión previa
Próxima revisión
Revisión previa
tutorial_de_shell_de_bourne [2024/08/10 18:52] – [Construcciones de Programación de Guiones] perontutorial_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 (sh)========+=======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 en [[versiones de unix#unix system v|UNIX System V]]. Siendo una shell de 1985, no todos se aplican a los actuales [[BSD]] o GNU con Linux, pero si la mayoría de ellos.+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 de comandos|intérprete de comandos]] en [[versiones de unix#unix system v|UNIX System V]], la [[bourne shell|Bourne Shell]]. Lógicamente al ser una shell de 1985, no todos se aplican a los actuales [[BSD]] o GNU con Linux, pero si la mayoría de ellos
 + 
 +La primer sección de este tutorial "[[#lenguaje de comandos de la shell|Lenguaje de Comandos de la shell]]", introduce algunos atajos básicos y comandos que ayudarán a realizar de forma rápida y sencilla algunas tareas en el sistema UNIX. La segunda sección de este tutorial "[[#programación de la shell|Programación de la Shell]]", le enseñará cómo colocar dichas tareas en un fichero y pedirle a la shell que ejecute los comandos contenidos en el fichero.
  
-La primer parte del tutorial "[[#lenguaje de comandos de la shell|Lenguaje de Comandos de la shell]]", introduce algunos atajos básicos y comandos que le ayudan a realizar tareas en el sistema UNIX de forma rápida y sencilla. La segunda parte del tutorial "[[#programación de la shell|Programación de la Shell]]", le enseñará cómo colocar estas tareas en un fichero y pedirle a la shell que ejecute los comandos en el fichero mientras se toma una taza de café. 
 ===== 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 de la shell.
-Estos son metacaracteres. Un metacaracter es un caracter que tiene un significado especial en el lenguaje de ocmandos de la shell.+
  
 ^ 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", o "uno de esos". Al usar metacaracters para todo o una parte de un nombre de fichero se le dice "generación de nombre de finchero" Es una manera rápida y fácil de referirse a los nombres de ficheros.+El  significado de los metacaracteres es similar a decir "etc, etc, etc", "todo lo anterior", o "uno de esos". Al usar metacaracters para todo o una parte de un nombre de fichero se le dice "generación de nombre de fichero" Es una manera rápida y fácil de referirse a los nombres de ficheros.
  
 ===*=== ===*===
  
-''*'' Este metacaracter coincide con "todo", cualquier cadena de caracters, incluyendo una que no tenga caracteres en lo absoluto.+''*'' Este metacaracter coincide con "todo", cualquier cadena de caracteres, incluyendo una que no tenga caracteres en lo absoluto.
  
 El ''*'' solo refiere a todos los nombres de fichero en el directorio actual, el directorio en el que se encuentra en este momento. Para ver los efectos del ''*''. intenta el siguiente comando: El ''*'' solo refiere a todos los nombres de fichero en el directorio actual, el directorio en el que se encuentra en este momento. Para ver los efectos del ''*''. intenta el siguiente comando:
Línea 123: Línea 123:
 Intente el siguiente ejemplo Intente el siguiente ejemplo
  
-  - Haga un fichero corto llamado ''prueba''+  - Escriba un fichero corto llamado ''prueba''
   - 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>+<code>prueba1</code>
  
 === [...] === === [...] ===
Línea 171: Línea 171:
 El caracter ''&'' puesto al final de una línea de comandos, ejecuta la tarea en segundo plano. El caracter ''&'' puesto al final de una línea de comandos, ejecuta la tarea en segundo plano.
  
-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. El formato general de un comando que se ejecuta en segundo plano es+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. La sintaxis general de un comando que se ejecuta en segundo plano es
  
 <code bash> <code bash>
Línea 177: Línea 177:
 </code> </code>
  
-El comando [[grep]] puede desarrollar búsquedas largas que pueden llevar mucho tiempo. Si pone el comando grep en modo segundo plano, podrá continuar haciendo alguna otra tarea en su terminal mientras se realiza la búsqueda por la shell. En el ejemplo siguiente, el modo segundo plano se usa mientras se buscan en todos los ficheros del directorio los caracteres ''palabra''. El ''&'' es el último metacaracter del comando.+El comando [[grep]] puede desarrollar búsquedas intensivas, que pueden requerir cierto tiempo en completarse. Si pone el comando //grep// en modo segundo plano, podrá continuar haciendo alguna otra tarea en su terminal mientras se realiza la búsqueda por la shell. En el ejemplo siguiente, el modo segundo plano se usa mientras se buscan en todos los ficheros del directorio los caracteres ''palabra''. El ''&'' es el último metacaracter del comando.
  
 <code bash> <code bash>
 $ grep palabra * & $ grep palabra * &
-2190+21940
 $ $
 </code> </code>
Línea 193: Línea 193:
 El metacaracter '';'' realiza ejecución secuencial de comandos indicados en una línea, y separados un '';''. El metacaracter '';'' realiza ejecución secuencial de comandos indicados en una línea, y separados un '';''.
  
-Si desea tipear varios comandos en una línea, debe separar cada uno de ellos con un '';''El formato general para poner ''comando1'', ''comando2'' y ''comando3'' en una línea de comandos es el siguiente:+Si desea introducir varios comandos en una línea, debe separar cada uno de ellos con un '';''La sintaxis general para poner ''comando1'', ''comando2'' y ''comando3'' en una línea de comandos es el siguiente:
  
 <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 |''cd'' |cambia al directorio de usuario | 
-|2 |pwd |imprime el directorio actual | +|2 |''pwd'' |imprime el directorio actual | 
-|3 |ls |lista los ficheros en el directorio actual | +|3 |''ls'' |lista los ficheros en el directorio actual | 
-|4 |ed |prueba ingresar al editor de líneas [[ed]] y comenzar por editar el fichero ''prueba'' |+|4 |''ed'' |prueba ingresar al editor de líneas [[ed]] y comenzar por editar el fichero ''prueba'' |
  
 ¿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 [[#redirigir salida|redirigir salida]] le enseñará a resolver este problema. ¿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 [[#redirigir salida|redirigir salida]] le enseñará a resolver este problema.
Línea 229: Línea 229:
 ===Desactivar caracteres especiales por Citado=== ===Desactivar caracteres especiales por Citado===
  
-Todos los caracters encerrados entre apóstrofes ''<nowiki>'...'</nowiki>'' pierden su significado especial.+Todos los caracteres encerrados entre apóstrofes ''<nowiki>'...'</nowiki>'' pierden su significado especial.
  
 Todos los caracteres entrecomillados ''<nowiki>"..."</nowiki>'' pierden su significado, excepto ''<nowiki>$</nowiki>'', ''<nowiki>\</nowiki>'' y ''<nowiki>'</nowiki>'' Todos los caracteres entrecomillados ''<nowiki>"..."</nowiki>'' pierden su significado, excepto ''<nowiki>$</nowiki>'', ''<nowiki>\</nowiki>'' y ''<nowiki>'</nowiki>''
  
-Los metacaracteres en la shell pierden si significado especial cuando van entrecomillados o apostrofados. El apóstrofo desactiva el significado especial de cualquier metacaracter. El entrecomillado desactiva el significado especial de cualquier metacaracter, con expresión de ''<nowiki>$</nowiki>'', ''<nowiki>\</nowiki>'' y ''<nowiki>'</nowiki>''. Los caracteres ''<nowiki>$</nowiki>'', ''<nowiki>\</nowiki>'' y ''<nowiki>'</nowiki>'' son muy importantes en la programación de la shell.+Los metacaracteres en la shell pierden su significado especial cuando van entrecomillados o apostrofados. El apóstrofo desactiva el significado especial de cualquier metacaracter. El entrecomillado desactiva el significado especial de cualquier metacaracter, con expresión de ''<nowiki>$</nowiki>'', ''<nowiki>\</nowiki>'' y ''<nowiki>'</nowiki>''. Los caracteres ''<nowiki>$</nowiki>'', ''<nowiki>\</nowiki>'' y ''<nowiki>'</nowiki>'' son muy importantes en la programación de la shell.
  
-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 en blanco para delimitar sus argumentos. Si no ha usado el comando [[banner]] inténtelo ahora. La respuesta del sistema será algo sorpresiva.+El comando //banner// usa los caracteres de espacio en blanco para delimitar sus argumentos. Si no ha usado el comando [[banner]] inténtelo ahora. La respuesta del sistema será algo sorpresiva.
  
 <code bash> <code bash>
Línea 334: Línea 334:
 El caracter ''<'' redirige los contenidos de un fichero en un comando. El caracter ''<'' redirige los contenidos de un fichero en un comando.
  
-El formato general para redigir los contenidos de un fichero en un comando se muestra a continuación+La sintaxis general para redirigir los contenidos de un fichero en un comando se muestra a continuación
  
 <code bash> <code bash>
Línea 357: Línea 357:
 El caracter ''>'' redirige la salida de un comando a un fichero. El caracter ''>'' redirige la salida de un comando a un fichero.
  
-Un símbolo único de redirección creará un nuevo fichero, o borrará un fichero viejo y reemplazará sus contenidos con la nueva salida. El formato general re la redirección de salida se muestra a continuación:+Un símbolo único de redirección creará un nuevo fichero, o borrará un fichero viejo y reemplazará sus contenidos con la nueva salida. La sintaxis general para la redirección de salida se muestra a continuación:
  
 <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 ''|'', la salida del primer comando es entubada al siguiente comando, formando parte de la entrada a dicho comando. Si dos comandos o mas están interconectados por medio de un caracter caño ''|'', la salida del primer comando es entubada al siguiente comando, formando parte de la entrada a dicho comando.
  
-El formato general del caño es el siguiente:+La sintaxis general del caño es el siguiente:
  
 <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 general de //batch// es:+La sintaxis general de //batch// es:
  
 <code bash> <code bash>
 $ batch $ batch
 primer comando primer comando
-     " +     . 
-     " +     . 
-     "+     .
 último comando último comando
 ^d ^d
Línea 540: Línea 540:
 </code> </code>
  
-El comando //at// indica a la computadora un momento específico para ejecutar dicho comando. El formato general del comando //at// es:+El comando //at// indica a la computadora un momento específico para ejecutar dicho comando. La sintaxis general del comando //at// es:
  
 <code bash> <code bash>
 $ at hora $ at hora
 primer comando primer comando
-    " +    . 
-    " +    . 
-    "+    .
 último comando último comando
 ^d ^d
Línea 563: Línea 563:
 </code> </code>
  
-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. El formato general de cancelación es:+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. La sintaxis general de cancelación es:
  
 <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 formato general del comando //kill// es:+El comando //kill// se utiliza para detener procesos activos de la shell. La sintaxis general del comando //kill// es:
  
 <code bash> <code bash>
Línea 621: Línea 621:
 </code> </code>
  
-¿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 el comando //kill//. Si desea terminar el comando //grep// al que se recurrió en el ejemplo anterior:+¿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 el comando //kill//. Si desea terminar el comando //grep// al que se recurrió en el ejemplo anterior:
  
 <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. El formato general del comando //read// es:+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. La sintaxis general del comando //read// es:
  
 <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 general para asignar una salida como valor de variable es recurrir al apostrofe agudo ''`'':+La sintaxis general para asignar una salida como valor de variable es recurrir al apostrofe agudo ''`'':
  
 <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 ''#'' y termínelos con **tecla Intro**. El formato general para una línea de comentario es:+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 ''#'' y termínelos con **tecla Intro**. La sintaxis general para comentar una línea es:
      
  <code bash>  <code bash>
Línea 1154: Línea 1154:
 ===El Documento Aquí=== ===El Documento Aquí===
  
-El Documento Aquí le permite redirigir líneas de entrada de un programa shell a un comando. El documento shell consiste en el símbolo de redirección ''<<''el delimitador que especifica el comienzo el final de las líneas de entrada. El delimitador puede ser un caracter o una cadena de caracteres. A menudo como delimitador se usa el ''!''En formato general del documento Aquí es:+El Documento ''Aquí'' le permite redirigir líneas de entrada incluidas en un programa de shell a un comando. El documento shell consiste en el símbolo de redirección ''<<''un //delimitador// que especifica tanto el comienzo como el final de las líneas de entrada. El delimitador puede ser un caracter o una cadena de caracteres. A menudo se define como delimitador el caracter ''!''La sintaxis general del documento ''Aquí'' es:
  
 <code bash> <code bash>
Línea 1162: Línea 1162:
 </code> </code>
  
-El documento Aqui puede usarse en un programa de shell, para redirigir líneas de entrada al comando **mail**. El programa ''fcumple'' que se indica a continuación envía un saludo genérico de cumpleaños con el comando **mail**.+El documento ''Aqui'' puede usarse en un programa de shell que redirija las líneas de entrada al comando **mail**. El programa ''fcumple'' indicado a continuación envía un saludo genérico de cumpleaños con el comando **mail**.
  
 <code bash> <code bash>
Línea 1186: Línea 1186:
 </code> </code>
  
-Para recibir su salutación, la usuaria maria ejecutaría el comando **mail**+Para recibir esta salutación, la usuaria maria ejecutaría el comando **mail**
  
 <code bash> <code bash>
-mail +mail 
-De fulana Lun May 14 14:31 CDT 1984+De fulana  Lun May 14 14:31 CDT 1984
 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
      comando1      comando1
-        " +        . 
-        " +        . 
-        "+        .
      ultimo comando      ultimo comando
 do do
      comando1      comando1
-        " +        . 
-        " +        . 
-        "+        .
      último comando      último comando
 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:
 </code> </code>
  
 +
 +=== 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 ''in'' debe comenzar las declaraciones de patrón con su secuencia de comandos. Debe cerrar cada patrón con un caracter de '')''. La secuencia de comandos para cada patrón se finaliza con '';;''. La construcción ''case'' debe cerrarse con ''esac'' (las letras de ''case'' invertidas). La sintaxis general para la construcción **case** es:
 +
 +
 +<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
 +</code>
 +
 +La construcción **case** intentará coincidir caracteres con el primer patrón. Si hay coincidencia, el programa ejecutará las líneas de comando para el primer patrón hasta llegar a la '';;''.
 +
 +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 ''esac''. el ''*'' usado como patrón al final de la lista de patrones le permite dar instrucciones a realizar si ninguno de los patrones tuvo coincidencias. El ''*'' significa "cualquier patrón", por lo que debe colocarse __al final__ de la lista de patrones si es que antes deben revisarse otros patrones de cualquier tipo.
 +
 +Si usted ha usado el editor [[vi]], ya sabe que debe asignar un valor a la variable ''TERM'' para que la shell conozca qué tipo de terminal utiliza para usar las funciones de edición de pantalla de **vi**. Un buen ejemplo de la construcción **case** sería un programa que establece la variable ''TERM'' por usted de acuerdo al tipo de terminal que utiliza para loguearse. De este modo, si se loguea con diferentes tipos de terminales, el programa ''set.term'' le será muy útil.
 +
 +''set.term'' le pedirá que ingrese el modelo de terminal, y luego configurará la variable de terminal según el código de terminal. Las líneas del mismo son:
 +
 +<code bash>
 +TERM=codigo de terminal
 +export TERM
 +</code>
 +
 +En este ejemplo de ''set.term'' la persona usa tanto un TELETYPE 4420, TELETYPE 5410 o un TELETYPE 5420.
 +
 +El programa ''set.term'' revisará primero si el valor de ''term'' es ''vt52''. Si lo es, entonces asignará el valor ''VT52'' a ''TERM'', y saldrá del programa. Si no es ''vt52'', revisará si es ''vt100'' y luego ''vt320''. Comenzará a ejecutar los comandos bajo el primer patrón que encuentre, y luego pasará al siguiente comando luego de ''esac''.
 +
 +Al final de los patrones para las terminales de la [[serie VT]] aparece el patrón ''*'' que significa todo lo demás, le advertirá que no tiene un patrón para esa terminal, y le permitirá abandonar la construcción **case**.
 +
 +<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
 +</code>
 +
 +¿Qué hubiese sucedido de haber puesto el patrón ''*'' al principio? el programa ''set.term'' nunca hubiese asignado un valor a ''TERM'' ya que siempre hubiese coincidido con el primer patrón ''*'', que significa "todo".
 +
 +Cuando lee la sección de modificar su ambiente de inicio de sesión, podría querer aprovechar el programa ''set.term'' en su directorio ''/bin'', y agregar la línea de comandos:
 +
 +<code bash>
 +set.term
 +</code>
 +
 +a su fichero ''~/.profile''.
 +
 +===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 ''done'', ''fi'', o ''esac''. Si no hay comandos luego de dicha declaración, el programa finaliza.
 +
 +En el ejemplo del programa ''set.term'', el comando **break** podría haberse utilizado en lugar del comando **echo**.
 +
 +<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
 +</code>
 +
 +En la medida que escriba mas programas de shell, podría querer usar dos otros comandos incondicionales, el comando **continue** y el comando **exit**. El comando **continue** hace que el programa vaya inmediatamente a la siguiente iteración de un bucle **do** o **for**, sin ejecutar los siguientes comandos que quedan en el bucle.
 +
 +Normalmente, un programa de shell termina al alcanzarse el final del fichero. Si desea que el programa finalice en cualquier otro momento, puede usar el comando **exit**.
 +
 +
 +====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 "bug" en su programa.
 +
 +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.
 +
 +|''sh -v'' |Presenta las líneas de ientrada de la shell en la medida que son leidas por el sistema |
 +|''sh -x'' |Presenta los comandos y sus argumentos en la medida que se ejecutan |
 +
 +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 ''bug''.
 +
 +<code bash>
 +$ cat bug
 +hoy='date'
 +persona=$1
 +mail $2
 +$persona
 +Cuando se desconecte, venga a mi oficina, por favor.
 +$hoy
 +MLH
 +$
 +</code>
 +
 +El mensaje de correo enviado a Tomás (''$1'') con el login //tomi// (''$2'') debe leerse como se muestra en la siguiente pantalla.
 +
 +<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:36:32  CST 1984
 +MLH
 +$
 +?
 +.
 +</code>
 +
 +Si intenta ejecutar ''bug'', tendrá que presionar la tecla BREAK o la tecla Del para finalizar el programa.
 +
 +Para depurar este programa, intente ''sh -v'', que presentará las líneas del fichero en la medida que son interpretadas por la shell.
 +
 +<code bash>
 +$ sh -v bug tomas tomi
 +hoy='date'
 +persona=$1
 +mail $2
 +</code>
 +
 +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 ''bug'', probemos con ''sh -x'', que nos imprime los comandos y sus argumentos en la medida que son leídos por la shell.
 +
 +<code bash>
 +sh -x bug tomas tomi
 ++date
 +hoy=Mie  Abr 10 11:07:23  CST  1984
 +persona=tomas
 ++mail tomi
 +</code>
 +
 +Una vez mas, el programa se detiene en el comando **mail**. Note que las sustituciones para las variables han sido establecidas, y se presentan.
 +
 +El programa ''bug'' corregido es el siguiente:
 +
 +<code bash>
 +$ cat bug
 +hoy='date'
 +persona=$1
 +mail $2 <<!
 +$persona
 +Cuando se desconecte, venga a mi oficina por favor.
 +$hoy
 +MLH
 +!
 +$
 +</code>
 +
 +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
 +</code>
 +
 +''fichero.guardado'' es el nombre del fichero en el que desea guardar la salida de **comando1**, para su conservación y/o estudio.
 +
 +Si queire revisar la salida del comando grep en la siguiente línea de comandos:
 +
 +<code bash>
 +who | grep $1 | cut -c1-9
 +</code>
 +
 +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
 +</code>
 +
 +el fichero ''revisar'' contiene una copia de la salida del comando **grep**
 +
 +<code bash>
 +$ who | grep mlhmo | tee revisar | cut -c1-9
 +$ mlhmo
 +$ cat revisar
 +mlhmo   tty61   Abr 10   11:30
 +$
 +</code>
 +
 +>Si escribe muchos programas de shell, querrás referirte a UNIX System Shell Commands and Programming, y aprender sobre los códigos de retorno de los comandos, y redirigir la salida de error estándar.
 +
 +==== 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 ''.profile'' es que puedes cambiar el //prompt//. Esto es divertido para experimentar. Prueba el siguiente ejemplo. Si deseas usar varias palabras, recuerda de citar la frase entre comillas. También su usas comillas puedes agregar un retorno de carro a tu prompt.
 +
 +Ingresa:
 +
 +<code bash>PS1="Sus deseos son órdenes<Tecla Intro>"</code>
 +
 +Y su prompt tendrá el siguiente aspecto:
 +
 +<code bash>
 +$ . .profile
 +Sus deseos son órdenes
 +</code>
 +
 +El mundano ''$'' desapareció, al menos hasta que borre la variable ''PS1'' de su ''.profile''.
 +
 +
 +====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, lee el //Manual de Referencia del Usuario del Sistema UNIX// en lo que refiere al comando **sh**, el //Comandos y Programación del la Shell del Sistema UNIX// o bien las manpages.

Este sitio web utiliza cookies para guardar datos esenciales de su actividad, como su autenticación. Al entrar acepta el uso de cookies.

Más información