| Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa |
| tutorial_de_csh [2024/07/18 22:33] – peron | tutorial_de_csh [2026/04/21 16:09] (actual) – editor externo 127.0.0.1 |
|---|
| Junto a este documento, querrás consultar una copia del [[https://texto-plano.xyz/~peron/inst/unix/unixv7_principiantes.html|Manual del programador de UNIX]]. La documentación de csh en el manual ofrece descripción completa de todas las características de la shell y oficia de referencia para todas las interrogantes sobre la misma. Muchas palabras de este documento aparecen en //cursiva//; son palabras importantes como nombres de órdenes, y palabras que tienen un significado especial al hablar de la shell y UNIX. Muchas de las palabras están definidas en un [[#glosario|glosario]] al final de este documento. Si no sabes lo que significa una palabra, consulta el glosario. | Junto a este documento, querrás consultar una copia del [[https://texto-plano.xyz/~peron/inst/unix/unixv7_principiantes.html|Manual del programador de UNIX]]. La documentación de csh en el manual ofrece descripción completa de todas las características de la shell y oficia de referencia para todas las interrogantes sobre la misma. Muchas palabras de este documento aparecen en //cursiva//; son palabras importantes como nombres de órdenes, y palabras que tienen un significado especial al hablar de la shell y UNIX. Muchas de las palabras están definidas en un [[#glosario|glosario]] al final de este documento. Si no sabes lo que significa una palabra, consulta el glosario. |
| |
| =====Reconocimientos===== | |
| |
| ===== 1. Uso de C shell en la Terminal ===== | ===== 1. Uso de C shell en la Terminal ===== |
| >De ahora en más... la notación "''^x''" debe leerse "**Ctrl+x**" y representa presionar la **tecla x** mientras se mantiene presionada la **tecla Ctrl**. | >De ahora en más... la notación "''^x''" debe leerse "**Ctrl+x**" y representa presionar la **tecla x** mientras se mantiene presionada la **tecla Ctrl**. |
| |
| A consecuencia, el programa de correo hizo eco de los caracteres "EOT" y remitió nuestro mensaje. Los caracteres ''% '' antes y después del comando de correo fueron impresos por la C shell para indicar una solicitud de entrada. | A consecuencia, el programa de correo hizo eco del [[caracteres de control|caracter de control]] "EOT" y remitió nuestro mensaje. Los caracteres ''% '' antes y después del comando de correo fueron impresos por la C shell para indicar una solicitud de entrada. |
| |
| Tras presentar el mensaje ''% '', la shell leerá la entrada de órdenes desde nuestra terminal. Escribimos un comando completo ''mail bill''. Luego, la shell ejecutó el programa de correo //mail// con el argumento ''bill'' y permaneció inactiva a la espera de su cumplimiento. A continuación, el programa de correo leyó la entrada de nuestra terminal hasta que le indicamos //fin del fichero// mecanografiando un **^D**, tras lo cual la shell notó que el correo se había completado y nos indicó que se encontraba presta para leer nuevamente desde la terminal, presentando inmediatamente otro ''% ''. | Tras presentar el mensaje ''% '', la shell leerá la entrada de órdenes desde nuestra terminal. Escribimos un comando completo ''mail bill''. Luego, la shell ejecutó el programa de correo //mail// con el argumento ''bill'' y permaneció inactiva a la espera de su cumplimiento. A continuación, el programa de correo leyó la entrada de nuestra terminal hasta que le indicamos //fin del fichero// mecanografiando un **^D**, tras lo cual la shell notó que el correo se había completado y nos indicó que se encontraba presta para leer nuevamente desde la terminal, presentando inmediatamente otro ''% ''. |
| |
| En este ejemplo, un usuario está redactando una pieza de correo a haroldo pero olvida el nombre de un fichero que quería mencionarle. Suspende el comando //mail// ingresando **^Z**. Una vez que la shell nota la suspensión del programa de correo, presenta ''Stopped'' y le ofrece un prompt, aguardando un nuevo comando. Acto seguido el individuo ingresa el comando //ls// para recordar el nombre del fichero en cuestión. Usa el comando //jobs// para descubrir cuál comando se encuentra suspendido, y consecuentemente ingresa el comando //fg// para continuar la ejecución del único programa detenido, el //mail// a haroldo. Luego continua dando entrada a //mail//, y una vez concluida la redacción, la finalizó con **^D**, que denota el final del mensaje, ante lo cual el programa //mail// presenta ''EOT'' de //fin-de-transmisión//. | En este ejemplo, un usuario está redactando una pieza de correo a haroldo pero olvida el nombre de un fichero que quería mencionarle. Suspende el comando //mail// ingresando **^Z**. Una vez que la shell nota la suspensión del programa de correo, presenta ''Stopped'' y le ofrece un prompt, aguardando un nuevo comando. Acto seguido el individuo ingresa el comando //ls// para recordar el nombre del fichero en cuestión. Usa el comando //jobs// para descubrir cuál comando se encuentra suspendido, y consecuentemente ingresa el comando //fg// para continuar la ejecución del único programa detenido, el //mail// a haroldo. Luego continua dando entrada a //mail//, y una vez concluida la redacción, la finalizó con **^D**, que denota el final del mensaje, ante lo cual el programa //mail// presenta ''EOT'' de //fin-de-transmisión//. |
| | ===jobs=== |
| El comando //jobs// presenta un listado de los comandos se encuentran suspendidos. La orden **^Z** __solo debería mecanografiarse al comienzo de línea__, pues de enviarse dicha señal desde el teclado en cualquier otro lugar diferente al comienzo de línea, la shell descarta ("borra") toda la línea. Esto mismo sucede con las señales INTERRUPT y QUIT. Se ofrece mayor información sobre suspender trabajos y controlarlos se ofrece en la [[#trabajossegundo_plano_primer_plano_o_suspendido|seccion 2.6]]. | El comando //jobs// presenta un listado de los comandos se encuentran suspendidos. La orden **^Z** __solo debería mecanografiarse al comienzo de línea__, pues de enviarse dicha señal desde el teclado en cualquier otro lugar diferente al comienzo de línea, la shell descarta ("borra") toda la línea. Esto mismo sucede con las señales INTERRUPT y QUIT. Se ofrece mayor información sobre suspender trabajos y controlarlos se ofrece en la [[#trabajossegundo_plano_primer_plano_o_suspendido|seccion 2.6]]. |
| |
| |
| Si corre comandos en //segundo plano// (según lo explicado en la [[#trabajossegundo_plano_primer_plano_o_suspendido|seccion 2.6]]), entonces dichos comandos ignorarán las señales INTERRUPT y QUIT del terminal. Para detenerlas debe utilizar el comando //kill//. | Si corre comandos en //segundo plano// (según lo explicado en la [[#trabajossegundo_plano_primer_plano_o_suspendido|seccion 2.6]]), entonces dichos comandos ignorarán las señales INTERRUPT y QUIT del terminal. Para detenerlas debe utilizar el comando //kill//. |
| | ===more=== |
| Si desea examinar detenidamente la salida de un comando sin hacer que el mismo desaparezca de la pantalla (como cuando recurrimos a interrumpir la salida del comando //cat /etc/passwd//), podrá usar el comando | Si desea examinar detenidamente la salida de un comando sin hacer que el mismo desaparezca de la pantalla (como cuando recurrimos a interrumpir la salida del comando //cat /etc/passwd//), podrá usar el comando |
| |
| ==== Inicio de la shell y terminación ==== | ==== Inicio de la shell y terminación ==== |
| |
| Cuando inicie sesión en el sistema, éste iniciará una shell, que ingresará a su directorio //home// y comenzará por leer los comandos de un fichero llamado ''.cshrc'' localizado en dicho directorio. Todas las C shells que eventualmente inicie durante su sesión de terminal leerán este fichero. Mas adelante veremos qué tipos de comandos es útil colocar allí, por ahora no es necesario contar con este fichero, y la C shell no se quejará por su ausencia. | Al iniciar sesión en el sistema, éste comenzará la ejecución de una shell. Esta ingresará a su directorio //home// y comenzará por leer los comandos de un fichero llamado ''.cshrc'' localizado en dicho directorio. Todas las C shells que eventualmente inicie anidadas durante su sesión de terminal leerán este fichero también. Mas adelante veremos qué tipos de comandos es útil colocar allí, por ahora no es necesario contar con este fichero, y la C shell no se quejará por su ausencia. |
| |
| Una //shell de login//, ejecutada tras el inicio de su sesión al sistema - tras leer los comandos contenidos en ''.cshrc'' - leerá comandos contenidos en un fichero ''.login'' (también en su directorio //home//). Este fichero contiene aquellos comandos los cuales usted desea ejecutar cada vez que inicie sesión en el sistema UNIX. Mi fichero ''.login'' tiene el siguiente aspecto: | La //shell de login// - aquella que se ejecuta tras su inicio de sesión al sistema leerá los comandos contenidos en el fichero ''.cshrc'' ya mencionado - tras lo cual leerá comandos contenidos en un fichero ''.login'' (también en su directorio //home//). Este fichero contiene comandos que usted desea ejecutar cada vez que inicie una sesión del sistema UNIX. Mi fichero ''.login'' contiene lo siguiente: |
| |
| |
| echo "${prompt}users" ; users | echo "${prompt}users" ; users |
| alias ts \ | alias ts \ |
| 'set noglob ; eval `tset -s -m dialup:cl00rv4pna -m plugboard:?hp2621nl *`'; | 'set noglob ; eval `tset -s -m dialup:vt100 -m plugboard:?hp2621nl *`'; |
| ts; stty intr ^C kill ^U crt | ts; stty intr ^C kill ^U crt |
| set time=15 history=10 | set time=15 history=10 |
| msgs -f | msgs -f |
| if (-e $mail) then | if (-e $mail) then |
| echo "${prompt}maiI" | echo "Tiene correo! ${prompt}" |
| mail | mail |
| endif | endif |
| shell /bin/csh | shell /bin/csh |
| status 0 | status 0 |
| term cl00rv4pna | term vt100 |
| user bill | user bill |
| % | % |
| </code> | </code> |
| |
| para refrescar que la shell, lo que recalculará su tabla interna de locaciones de comandos, utilizada en la búsqueda de los comandos agregados recientemente. Ya que toda vez que ejecuta un comando, la shell pesquisa en el directorio actual ''.'', establecerlo en la //path// al principio de la especificación opera por lo general de forma equivalente, lo que reduce el tiempo de espera. | para refrescar que la shell, recalculando su tabla interna de locaciones de comandos, que se utiliza en la búsqueda de los comandos agregados recientemente. Ya que toda vez que ejecuta un comando, la shell pesquisa en el directorio actual ''.'', establecerlo en la //path// al principio de la especificación opera por lo general de forma equivalente, reduciendo los tiempos de espera. |
| |
| Otras variables incorporadas útiles consisten en las variables ''home'', que muestra su directorio //home//, ''cwd'' que contiene su directorio de trabajo actual, y la variable ''ignoreeof'' (la cual puede ser establecida mediante su fichero ''.login'' que dice a la shell que no se desligue al recibir un caracter //fin de fichero// desde un terminal (como se mencionó anteriormente). La variable ''ignoreeof'' es una de aquellas en las que la shell no le importa su valor asignado, sólo hace caso si dice ''set'' o ''unset'' denotando si está establecida o no, respectivamente. Por lo tanto, para establecer esta variable se indica simplemente | Otras variables incorporadas útiles consisten en las variables ''home'', que muestra su directorio //home//, ''cwd'' que contiene su directorio de trabajo actual, y la variable ''ignoreeof'' (que dice a la shell que no se desligue al recibir un caracter //fin de fichero// desde un terminal (como se mencionó anteriormente, lo cual puede establecerse en su fichero ''.login''). La variable ''ignoreeof'' es una de aquellas en las que la shell hace caso omiso de su valor asignado, sólo analiza si dice ''set'' o ''unset'' denotando si está establecida o no, respectivamente. Por lo tanto, para establecer esta variable se indica simplemente |
| |
| <code bash> | <code bash> |
| </code> | </code> |
| |
| Estos comandos no otorgan valor alguno a la variable ''ignoreeof'', pues no los requiere ni los desea en lo absoluto. | >Los comandos anteriores no otorgan valor alguno a la variable ''ignoreeof'', pues ésta no los requiere ni los desea en lo absoluto. |
| |
| Finalmente, algunas de las otras variables incorporadas de la shell en uso son las variables ''noclobber'' y ''mail''. | Finalmente, algunas de las otras variables incorporadas de la shell en uso son las variables ''noclobber'' y ''mail''. |
| </code> | </code> |
| |
| Aquí el ''>&'' le dice a la C shell que redirija tanto la salida de diagnóstico como la salida estándar a ''fichero''. | Aquí el ''>&'' le solicita a la C shell que redirija tanto la //salida de diagnóstico// como la //salida estándar// a ''fichero''. |
| |
| De manera similar, puede dar la orden comando | De manera similar, puede dar la orden comando |
| </code> | </code> |
| |
| Esta se usa cuando la [[#variables de la shell|variable noclobber]] está activada y ''fichero'' ya existe. Si ''noclobber'' está activada, entonces resultaría en error si ''fichero no existe''. De otro modo la shell creará ''fichero'' si este no existe. La forma | Esta se usa cuando la [[#variables de la shell|variable noclobber]] está activada y ''fichero'' ya existe. Sstri ''noclobber'' se encuentra activada, da como resultado un error ''fichero no existe''. De otro modo la shell creará ''fichero'' si este no existe. La forma |
| |
| <code bash> | <code bash> |
| </code> | </code> |
| |
| hará que no dé error si ''fichero'' es inexistente y la variable de shell ''noclobber'' se encuentra establecida (activada). | hará no dará error si ''fichero'' es inexistente y la variable de shell ''noclobber'' se encuentra establecida (activada). |
| |
| ==== Trabajos; Segundo Plano, Primer Plano, o Suspendido ==== | ==== Trabajos; Segundo Plano, Primer Plano, o Suspendido ==== |
| |
| Al introducir uno o más comandos juntos siguiendo la forma de //cañería// (separados por ''|'') o //secuencia de comandos// (separados por punto y coma '';''), la shell genera un único //trabajo// ("job"), que consiste en dichos comandos unificados. Un comando aislado sin ''|'' o '';'' genera un trabajo mas simple. Usualmente, cada línea mecanografiada a la shell genera un trabajo. Algunas de las líneas que generan trabajos (uno por línea) son | Al introducir uno o más comandos juntos siguiendo la forma de //cañería// (separados por ''|'') o //secuencia de comandos// (separados por punto y coma '';''), la shell genera un único //trabajo// ("job"), que consiste en dichos comandos unificados. Un comando aislado (sin ''|'' o '';'' genera) un trabajo simple. Por lo general, cada línea mecanografiada a la shell genera un trabajo. Algunas de las órdenes que generaron trabajos (uno por línea) fueron |
| |
| <code> | <code> |
| </code> | </code> |
| |
| Si al final de los comandos se mecanografía el metacaracter ''&'', entonces el trabajo correspondiente se inicia como un //trabajo en segundo plano//. Esto significa que la shell no aguardará su finalización, sino que quedará lista y a la espera de otro comando inmediato. Tal trabajo se ejecutará //en el segundo plano//, al mismo tiempo que los trabajos normales - llamados //trabajos en primer plano// - siguen siendo leídos y ejecutados por la shell de uno a la vez. Por lo tanto | Toda vez que al final de la orden se mecanografíe el metacaracter ''&'', entonces la misma se iniciará en la forma de //trabajo en segundo plano//. Esto significa que la shell no aguardará su cumplimiento, sino que quedará inmediatamente a la espera de otro comando. Dicho trabajo se ejecutará //en segundo plano//. Esto guarda diferencia con aquellos trabajos normales - llamados //trabajos en primer plano// - que siguen siendo leídos y ejecutados por la shell de uno a la vez. Por lo tanto |
| |
| |
| </code> | </code> |
| |
| correrá el programa //du//, encargado de reportar el uso de disco de su directorio de trabajo (así como el de cualquier directorio por debajo de él), poner la salida en el fichero ''uso_de_disco'' y retornar inmediatamente con un prompt para eventual disposición de un comando ulterior (sin esperar a que //du// finalice). El programa //du// continuará su ejecución en el segundo plano hasta completarse, incluso aunque usted mientras tanto mecanografie y solicite ejecución de otros comandos. Justo antes del siguiente prompt, la shell presentará un mensaje cuando termine un trabajo en segundo plano, informando tal cosa. En el siguiente ejemplo, el trabajo //du// finalizó en cierto momento durante la ejecución del comando //mail//, y su finalización fue reportada justo antes de que el trabajo //mail// fuese finalizado. | corre el programa //du//, encargado de reportar el uso de disco de su directorio de trabajo (así como el de cualquier directorio por debajo de él), coloca su salida en el fichero ''uso_de_disco'' y vuelve inmediatamente la atención a usted indicando un prompt para eventual disposición de un ulterior comando nuevo (sin aguardar la finalización de //du//). Mientras tanto el programa //du// continuará su ejecución en segundo plano hasta finalizar, incluso aunque usted mecanografíe y solicite cumplimiento de otros comandos. Al finalizar un trabajo en segundo plano, la shell presentará un mensaje informando tal cosa justo antes de su prompt siguiente. |
| | |
| | En el siguiente ejemplo, el trabajo //du// finalizó en cierto momento durante la ejecución del comando //mail//, y su finalización se reportó justo antes de que el trabajo //mail// finalizase. |
| |
| <code bash> | <code bash> |
| % du > uso_de_disco & | % du > uso_de_disco & |
| [1] 503 | [1] 503 |
| | |
| % mail bill | % mail bill |
| ¿Cómo es posible saber cuando un trabajo en segundo plano ha finalizado? | ¿Cómo es posible saber cuando un trabajo en segundo plano ha finalizado? |
| EOT | EOT |
| [1] - Done du > uso_de_disco | [1] - Done du > uso_de_disco |
| | |
| % | % |
| </code> | </code> |
| |
| Ante una finalización anormal del trabajo, el mensaje ''Done'' podría verse reemplazado por algo distinto, como ''Killed''. Si desea que le sean reportadas las finalizaciones de programas en segundo plano al mismo momento de ocurrir (posiblemente interrumpiendo la salida de terminal de otros trabajos en primer plano), puede establecer la variable ''notify''. En el ejemplo anterior, esto podría implicar que el mensaje ''Done'' podría aparecer directamente en el medio de la redacción del correo a Bill. Los trabajos en segundo plano no resultan afectados por ninguna señal del teclado tales como las señales STOP, INTERRUPT, o QUIT mencionadas anteriormente. | Ante una finalización anormal de un trabajo, el mensaje ''Done'' podría intercambiarse por otro diferente, tal como ''Killed''. Si usted desea que se le reporten aquellas finalizaciones de programas en segundo plano al mismo momento en que se producen - eventualmente incluso interrumpiendo la salida de terminal de otros trabajos que pudiese tener en primer plano - puede establecer la variable ''notify''. Siguiendo el ejemplo anterior, podría implicar que el mensaje ''Done'' eventualmente aparezca directamente en medio de la redacción del correo a Bill. |
| |
| La C shell registra los trabajos en una //tabla de trabajos// incorporada hasta su finalización. La shell toma nota de los nombres de comando, argumentos y el //número de proceso// de todos los comandos en el listado de trabajos, así como el directorio de trabajo donde se inició el trabajo. Cada trabajo de la tabla puede estar ejecutándose //en primer plano// (con la shell aguardando su finalización), corriendo //en segundo plano//, o //suspendido//. Sólo puede correr en el primer plano un trabajo a la vez, pero es posible contar con varios trabajos suspendidos o corriendo en segundo plano a la vez. Los números de trabajo siguen siendo los mismos hasta que el trabajo finalice, y luego son reutilizados. | >Los trabajos en segundo plano no resultan afectados por ninguna señal del teclado tales como las señales STOP, INTERRUPT, o QUIT mencionadas anteriormente. |
| |
| Al iniciar la ejecución un trabajo en segundo plano por medio del sufijo ''&'', antes que la shell le presente un prompt para ingresar un nuevo comando, le informará el número de trabajo - así como los números de proceso de todos sus comandos de nivel superior - . Por ejemplo, | La C shell inicia el alta los trabajos en una //tabla de trabajos// incorporada, y finaliza su baja con su cumplimiento. En esta tabla de trabajos la C shell tabula el nombre de comando, argumentos, //número de identificador proceso// (PID) de todos los comandos, así como el directorio de trabajo donde se inició cada trabajo. Cada trabajo tabulado puede estar |
| | |
| | * En ejecución //en primer plano// (la C shell aguarda su finalización), |
| | * En ejecución //en segundo plano//, |
| | * //suspendido//. |
| | |
| | Sólo puede estar en ejecución en primer plano un trabajo por vez, pero es posible contar con varios trabajos suspendidos o corriendo en segundo plano a la vez. Los números de trabajo siguen siendo los mismos hasta que el trabajo finalice, y luego son reutilizados. |
| | |
| | Al ordenar ejecución de un trabajo en segundo plano por medio del sufijo ''&'', antes que la shell le presente un prompt para ingresar un nuevo comando le informará el //número de cola de trabajos// - así como los números de identificador de proceso de todos sus comandos de nivel superior - . Por ejemplo, |
| |
| |
| </code> | </code> |
| |
| ejecuta el programa //ls// con la opción ''-s'', entuba la salida resultante al programa //sort// con la opción ''-n'' que pone dicha salida en el fichero ''uso_de_disco''. Debido a que el ''&'' aparece como sufijo al final de la línea, ambos programas se iniciaron conjuntamente en la forma de un //trabajo en segundo plano//. Tras iniciar el trabajo, la shell presentó el //número de trabajo// entre corchetes - ''[2]'' en este caso - seguido por el //número de proceso// de cada programa iniciado en el trabajo. Inmediatamente después la shell presenta un prompt para ingresar un eventual nuevo comando, dejando al trabajo ejecutándose en simultáneo. | ejecuta el programa //ls// con la opción ''-s'', entuba su salida al programa //sort// con la opción ''-n'', y coloca la salida resultante en el fichero ''uso_de_disco''. Debido al sufijo ''&'' al final de la línea ambos programas se iniciaron conjuntamente en la forma de un //trabajo en segundo plano//. Una vez iniciado el trabajo, la shell presentó el //número de cola de trabajos// entre corchetes - ''[2]'' en este caso - seguido por el //número de proceso// de cada programa iniciado en el trabajo en cuestión. Inmediatamente después, la shell ofrece un prompt para ingresar eventualmente una nueva orden, dejando al trabajo en ejecución concurrente (en simultáneo). |
| |
| Como se mencionó en la [[#finalizando comandos|sección 1.8]], los trabajos en primer plano se suspenden mecanografiando **^Z**, lo cual envía una señal STOP al trabajo en ejecución en primer plano. Un trabajo en segundo plano puede ser suspendido utilizando el comando //stop// descripto adelante. Cuando los trabajos resultan suspendidos, su ejecución se detiene hasta ser iniciados nuevamente - ya sea en el primer o en el segundo plano. La shell nota cuando un trabajo se suspende e informa del hecho de manera bastante similar a los informes de finalización de trabajo en segundo plano. En el caso del trabajo en primer plano, esto guarda una apariencia similar a | Como se mencionó en la [[#finalizando comandos|sección 1.8]], los trabajos en //primer plano// se suspenden mecanografiando **^Z**, lo cual envía una señal STOP al trabajo en ejecución en primer plano. Puede suspender un trabajo en ejecución en segundo plano mediante comando //stop// que se describirá mas adelante. Una vez que los trabajos se suspenden, su ejecución se detiene hasta ser iniciados nuevamente - ya sea en el primer o en el segundo plano. La shell toma nota de la suspensión de un trabajo, e informa el hecho de manera bastante similar a los informes de finalización de trabajo en segundo plano. En el caso del trabajo en primer plano, esto guarda una apariencia similar a |
| |
| <code bash> | <code bash> |
| ^Z | ^Z |
| Stopped | Stopped |
| | |
| % | % |
| </code> | </code> |
| |
| cuando la shell nota que el programa //du// se ha detenido, presenta el mensaje ''Stopped''. Cuando usamos el comando //stop// para detener los trabajos en segundo plano, se presenta | en donde la shell presenta el mensaje ''Stopped'' al notar que el programa //du// se ha suspendido. Al usar el comando //stop// para detener los trabajos en segundo plano, se presenta |
| |
| <code bash> | <code bash> |
| % sort uso_de_disco & | % sort uso_de_disco & |
| [1] 2345 | [1] 2345 |
| | |
| % stop %1 | % stop %1 |
| [1] + Stopped (signal) sort uso_de_disco | [1] + Stopped (signal) sort uso_de_disco |
| | |
| % | % |
| </code> | </code> |
| |
| Si necesitamos temporalmente conmutar entre lo que estábamos haciendo, puede sernos útil detener los trabajos en primer plano, ejecutar otros comandos, y retornar al trabajo suspendido. Asimismo, es posible detener los trabajos en primer plano y continuar su ejecución en la forma de trabajos en segundo plano por medio del comando //bg//. Esto le permitirá continuar un trabajo distinto, poniéndo el segundo plano en espera hasta que el trabajo en primer plano finalice. Por tanto | De necesitar alternar temporalmente entre lo que estamos haciendo, puede ser útil suspender los trabajos en primer plano, ejecutar otros comandos, y retornar al trabajo suspendido. Asimismo, es posible suspender los trabajos en primer plano y continuar su ejecución en la forma de trabajos en segundo plano por medio del comando //bg//. Esto permite __continuar un trabajo distinto__, poniendo el segundo plano en espera hasta que el trabajo en primer plano finalice. Por tanto |
| |
| |
| ^Z | ^Z |
| Stopped | Stopped |
| | |
| % bg | % bg |
| [1] + uso_de_disco & | [1] + uso_de_disco & |
| | |
| % | % |
| </code> | </code> |
| |
| inicia //du// en el primer plano, lo detiene antes de finalizar, luego lo continúa en segundo plano permitiendo la ejecución en primer plano de eventuales nuevos comandos. Esto se presenta especialmente útil cuando un trabajo en primer plano demanda más tiempo de ejecución que el previsto, por lo que usted hubiese deseado iniciarlo en segundo plano desde un principio. | inicia //du// en el primer plano, lo detiene antes de finalizar, usa //bg// para pasarlo a ejecución en segundo plano, permitiendo así eventuales nuevos comandos de ejecución en primer plano. Esto se presenta especialmente útil cuando un trabajo en primer plano demanda un tiempo de ejecución mayor que el previsto, por lo que usted hubiese deseado iniciarlo en segundo plano desde un principio. |
| |
| Todos los //comandos de control de trabajos// pueden recibir un argumento que identifica el trabajo particular. Todos los //argumentos de nombre de trabajo// comienzan con el caracter ''%'', si bien alguno de los comandos de control del trabajo también aceptan números de proceso (presentados por el comando //ps//). El trabajo por defecto (si no se le proveen argumentos) es llamado //trabajo actual// y es identificado por un ''+'' in la salida del comando //jobs//, el cual muestra cuáles son los trabajos que tiene. Cuando sólo hay un trabajo en ejecución o detenido en el segundo plano (el caso usual) este siempre será el //trabajo actual//, y por tanto no necesita argumentos. Si un trabajo ha sido detenido en el primer plano, se transforma en el //trabajo actual// y el trabajo actual existente se convierte en el trabajo //previo//. Cuando es dado, el argumento es tanto ''%-'' (que denota //trabajo previo//; ''%#'' donde el ''#'' es el número de trabajo; ''%pref'' (donde pref es algún prefijo único del nombre de comando y argumentos de uno de los trabajos; o ''?%'' seguido por alguna cadena encontrada en solo uno de los trabajos. | ===Comandos de control de trabajos=== |
| |
| Los tipos de comandos de trabajos de la tabla de trabajos, dando el número de trabajo, comandos, y status (''Stopped'' o ''Running'') de cada trabajo en segundo plano o trabajo suspendido. Con la opción ''-l'' los números de proceso también son presentados. | ^ Comando de Control de Trabajos ^ Resultado ^ |
| | | jobs | Presenta la cola de trabajos | |
| | | fg | | Trae un trabajo en ejecución en segundo plano o suspendido a ejecución en primer plano | |
| | | bg | Pasa un trabajo suspendido a segundo plano | |
| | | stop, Ctrl+Z | Suspende un trabajo en ejecución en segundo plano | |
| | | kill | termina un trabajo suspendido o en segundo plano o | |
| | | notify | notifica inmediatamente cuando finalizan los comandos | |
| | |
| | Todos los //comandos de control de trabajos// de la C shell pueden recibir un argumento que identifica el trabajo particular. Los //argumentos de nombre de trabajo// deben indicarse con el caracter ''%'', si bien alguno de los comandos de control del trabajo también aceptan números de identificador de proceso PID (presentados por el comando //ps//). El trabajo por defecto (si no se le proveen argumentos) es llamado //trabajo actual// y es identificado por un ''+'' in la salida del comando //jobs//, el cual muestra cuáles son los trabajos que tiene. Cuando sólo existe un trabajo en ejecución o detenido en el segundo plano (el caso usual), el mismo siempre será el //trabajo actual//, y por tanto no necesita argumentos. Si un trabajo ha sido detenido en el primer plano, se transforma en el //trabajo actual// y el trabajo actual existente se convierte en el trabajo //previo//. Cuando es dado, el argumento es tanto ''%-'' (que denota //trabajo previo//; ''%#'' donde el ''#'' es el número de trabajo; ''%pref'' (donde pref es algún prefijo único del nombre de comando y argumentos de uno de los trabajos; o ''?%'' seguido por alguna cadena encontrada en solo uno de los trabajos, presenta la tabla de trabajos con los tipos de comandos de trabajos, los comandos, el número de trabajo, y estado de status (''Stopped'' o ''Running'') de cada trabajo en segundo plano o trabajo suspendido. Sumando la opción ''-l'' también presenta los números de identificador de proceso PID. |
| |
| <code> | <code> |
| |
| % ls | % ls |
| 15 -s | sort -n > mifichero | ls -s | sort -n > mifichero |
| |
| % more mifichero | % more mifichero |
| </code> | </code> |
| |
| El comando //fg// ejecuta un trabajo suspendido o en segundo plano en el primer plano. Se usa para reiniciar un trabajo previamente suspendido, o cambiar un trabajo suspendido para que corra en el primer plano (permitiendo señales o entrada desde la terminal). En el caso anterior usamos //fg// para cambiar el trabajo //ls// desde el segundo plano al primer plano, desde que queríamos esperar a que terminara antes de mirar su fichero de salida. El comando //bg// corre un trabajo suspendido en el segundo plano. Usualmente se utiliza luego de detener el trabajo actual en ejecución en el primer plano con la señal STOP. La combinación de la señal STOP y el comando //bg// cambian el trabajo en primer plano a un trabajo en segundo plano. El comando //stop// suspende un trabajo en segundo plano. | El comando //fg// pasa un trabajo suspendido o en segundo plano a ejecución en primer plano. Se utiliza para reiniciar un trabajo previamente suspendido, o cambiar un trabajo suspendido para que corra en el primer plano (permitiendo el arribo de señales o entrada desde el terminal). En el caso anterior, se utilizó //fg// para pasar el trabajo //ls// desde el segundo plano al primer plano pues se deseaba aguardar su finalización antes de estudiar su fichero de salida. El comando //bg// reinicia ejecución de un trabajo suspendido en el segundo plano. Usualmente se utiliza tras suspender con la señal STOP el actual trabajo en ejecución en primer plano (combinar la señal STOP con el comando //bg// conmuta un trabajo de ejecución en primer plano a un trabajo en ejecución en segundo plano). El comando //stop// suspende un trabajo en segundo plano. |
| |
| El comando //kill// termina inmediatamente un trabajo en segundo plano o trabajo suspendido. Además de los trabajos, puede recibir como argumento números de procesos, tal como son presentados por //ps//. Por tanto, en el ejemplo anterior, al correr el comando //du// podría haber sido terminado por el comando | El comando //kill// ''%nro_de_cola'' extermina inmediatamente un trabajo en segundo plano o trabajo suspendido. Además de los trabajos, puede recibir como argumento números de procesos, tal como son presentados por //ps//. Por tanto, en el ejemplo anterior, al correr el comando //du// podría haber sido terminado por el comando |
| |
| <code bash> | <code bash> |
| </code> | </code> |
| |
| El comando //notify// (no es la variable ''notify'' mencionada anteriormente) indica que la terminación de un trabajo específico debe informarse inmediatamente al finalizar, en lugar de aguardar el siguiente prompt. | El comando //notify// (no es la variable ''notify'' mencionada anteriormente) indica que debe informar inmediatamente el cumplimiento y finalización de un trabajo específico inmediatamente (en lugar de aguardar el siguiente prompt). |
| |
| Si un trabajo que corre en segundo plano intenta leer entrada del terminal, resulta detenido automáticamente. Posteriormente, al pasar dicho trabajo a primer plano, podrá recibir entrada. Si se lo desea, es posible enviar nuevamente el trabajo al segundo plano hasta que éste solicite nuevamente entrada. Dicho procedimiento se ilustra en la siguiente secuencia de sesión, donde el comando ''s'' del editor de texto puede requerir un tiempo para cumplir. | Si un trabajo en ejecución en segundo plano intenta leer entrada del terminal, resulta detenido automáticamente. Posteriormente, al pasar dicho trabajo a primer plano, podrá recibir entrada. Si se lo desea, es posible enviar nuevamente el trabajo al segundo plano hasta que éste solicite nuevamente entrada. Dicho procedimiento se ilustra en la siguiente secuencia de sesión, donde el comando ''s'' del editor de texto puede requerir un tiempo para cumplir. |
| |
| |
| wc ficherogigante | wc ficherogigante |
| 13371 30123 302577 | 13371 30123 302577 |
| | |
| % stty - tostop | % stty - tostop |
| </code> | </code> |
| ==== Directorios de Trabajo ==== | ==== Directorios de Trabajo ==== |
| |
| Como se mencionó en [[#nombres de ficheros|sección 1.6]], la shell siempre está en un //directorio de trabajo// particular. El comando de "cambio de directorio" //chdir// (también puede usarse su abreviatura //cd//) cambia el directorio de trabajo de la shell - esto es, cambia el directorio en el cual usted se encuentra actualmente. | Como se mencionó en [[#nombres de ficheros|sección 1.6]], la shell siempre se encuentra activa en un //directorio de trabajo// particular. El comando de "cambio de directorio" //chdir// (también puede usarse su abreviatura //cd//) modifica el directorio de trabajo de la shell - esto es, cambia el directorio en el cual usted se encuentra actualmente. |
| |
| Es útil hacer un directorio para cada proyecto en el que desea trabajar, y poner todos los ficheros relacionados a ese protecto en dicho directorio. El comando "hacer directorio" //mkdir// crea un nuevo directorio. El comando //pwd// ("imprimir directorio de trabajo") informa la ruta de directorio absoluta del directorio de trabajo de la shell - esto es, el directorio en el cual se encuentra actualmente. Por lo tanto, en el siguiente ejemplo | Es útil crear un directorio para cada proyecto en el que desea trabajar, y disponer en él todos los ficheros relacionados a dicho proyecto. El comando "crear directorio" //mkdir// genera un directorio nuevo. El comando //pwd// ("imprimir directorio de trabajo") informa la ruta absoluta de directorio del directorio de trabajo de la shell - esto es, el directorio en el cual se encuentra actualmente. Por lo tanto, en el siguiente ejemplo |
| |
| <code bash> | <code bash> |
| %pwd | %pwd |
| /usr/bill | /usr/bill |
| | |
| % mkdir periodico | % mkdir periodico |
| | |
| % chdir periodico | % chdir periodico |
| | |
| %pwd | %pwd |
| /usr/bill/periodico | /usr/bill/periodico |
| | |
| % | % |
| </code> | </code> |
| |
| el usuario ha creado y se ha posicionado en el directorio ''periodico'', donde, por ejemplo, podría colocar un grupo de ficheros relacionados. Sin importar donde se ha movido en la jerarquía de directorios, siempre podrá volver a su directorio ''home'' de inicio de sesión, simplemente ingresando | el usuario ha creado y se ha posicionado en el directorio ''periodico'', donde - por ejemplo - podría colocar un grupo de ficheros relacionados. Siempre podrá volver a su directorio ''home'' de inicio de sesión - sin importar donde se ha movido en la jerarquía de directorios - simplemente ingresando |
| |
| <code bash> | <code bash> |
| </code> | </code> |
| |
| sin mas argumentos. El nombre ''..'' siempre significa "el directorio por encima de la jerarquía del actual", por lo tanto | sin mas argumentos. El nombre ''..'' siempre significa "el directorio por encima de la jerarquía del directorio actual", por lo tanto |
| |
| <code bash> | <code bash> |
| </code> | </code> |
| |
| significa cambiar al directorio ''programas'' contenido en el directorio por encima del directorio actual. Si tiene varios directorios para diferentes proyectos por debajo, digamos, de su directorio ''home'', esta notación abreviada le permitirá cambiar rápidamente entre ellos. | significa cambiar al directorio ''programas'' contenido en el directorio por encima del directorio actual. Si tiene varios directorios para diferentes proyectos - por debajo, por tomar de ejemplo, de su directorio ''home'' - esta notación abreviada le permitirá cambiar rápidamente entre ellos. |
| |
| La shell siempre recuerda el nombre de ruta del directorio de trabajo actual por medio de la variable ''cwd''. La shell también puede ser requerida de recordar el directorio previo, al cambiar a un nuevo directorio de trabajo. Si el comando "empujar directorio" //pushd// se usa en lugar del comando //cd//, la shell guardará el nombre del directorio de trabajo actual en una pila de directorios antes de cambiar al nuevo. Podrá ver esta lista en cualquier momento ingresando el comando "directorios", //dirs//. | La shell siempre recuerda el nombre de ruta de directorio de trabajo actual a través de suvariable ''cwd''. La shell también puede ser requerida de recordar el directorio previo, al cambiar a un nuevo directorio de trabajo. Si en lugar del comando //cd// se utiliza el comando "empujar directorio" //pushd//, la shell guardará el nombre del directorio de trabajo actual en un listado de //pila directorios de uso previo// al cambio de directorio actual. Podrá consultar dicho listado en cualquier momento ingresando el comando "directorios", //dirs//. |
| |
| |
| |
| % pushd /usr/lib/tmac | % pushd /usr/lib/tmac |
| /usr/lib/tmac -/periodico/referencias - | /usr/lib/tmac ~/periodico/referencias ~ |
| |
| % dirs | % dirs |
| /usr/lib/tmac -/periodico/referencias - | /usr/lib/tmac ~/periodico/referencias ~ |
| |
| % popd | % popd |
| -/periodicos/referencias - | ~/periodicos/referencias ~ |
| |
| %.popd | %.popd |
| </code> | </code> |
| |
| La lista se imprime en una línea horizontal, que se lee de izquierda a derecha, con un tilde (''~'') como abreviatura de su directorio ''home'', en este caso ''/usr/bill''. La pila de directorio se imprime toda vez que hay mas de una entrada en ella, y se vea alterada. También es impresa por un comando //dirs//. Generalmente Dirs es más rápido e informativo que //pwd// ya que muestra el directorio de trabajo actual, así como cualquier otro directorio registrado en la pila de directorios | El listado de la pila de directorios de uso previo resultará impreso en una línea horizontal, que se lee de izquierda a derecha, con una abreviatura de su directorio ''home'' (en este caso ''/usr/bill'') en forma de tilde (''~''). La pila de directorio se imprime toda vez que hay mas de una entrada en ella, y se ve alterada. También es impresa por un comando //dirs//. Generalmente //dirs// resulta más rápido e informativo que //pwd// ya que junto al directorio de trabajo actual, muestra como cualquier otro directorio registrado en la pila de directorios de uso previo. |
| |
| El comando //pushd// sin argumentos alterna el directorio actual, con el primer directorio en la lista. El comando "traer directorio" //popd// sin argumento lo devuelve al directorio donde se encontraba con anterioridad al actual, descartando el directorio de trabajo previo de la pila de directorios (descartándolo). Si ingresa ''popd'' varias veces en una serie, lo hará retroceder a través de los directorios que ha estado navegando (cambiando hacia) por el comando //pushd//. Existen otras opciones a //pushd// y //popd// para manipular los contenidos de la pila de directorios y cambiar a directorios que no se encue3ntran del superior de la pila; para mas detalles consulte las manpages de Csh. | El comando //pushd// sin argumentos alterna el directorio actual, con el primer directorio en la pila de directorios de uso previo. El comando "traer directorio" //popd// sin argumento lo devuelve al directorio donde se encontraba con anterioridad al actual, descartando el directorio de trabajo previo de la pila de directorios. Si ingresa ''popd'' varias veces en serie, retrocederá entre los directorios que ha estado navegando (caminando hacia atrás) por el comando //pushd//. Existen otras opciones a //pushd// y //popd// para manipular los contenidos de la pila de directorios de uso previo, y cambiar a directorios que no se encuentran en la parte superior de la pila; para mas detalles consulte las manpages de Csh. |
| |
| Como la shell recuerda el directorio de trabajo en el cual ha comenzado cada trabajo, prácticamente le advierte cuando podría confundirse al reiniciar un trabajo en el primer plano que tiene un directorio de trabajo diferentes que el directorio de trabajo actual de la shell. Por lo tanto, si inicia un trabajo en segundo plano, entonces cambia el directorio de trabajo de la shell y luego causar que el trabajo en segundo plano corra en el primer plano, la shell le advierte que el directorio de trabajo del trabajo corriendo actualmente en primer plano es diferente que el que indica la shell. | Como la shell recuerda el directorio de trabajo en el cual ha comenzado cada trabajo, le advertirá de manera práctica cuando podría confundirse al reiniciar un trabajo en el primer plano que tiene un directorio de trabajo diferentes que el directorio de trabajo actual de la shell. Por lo tanto, al iniciar un trabajo en segundo plano, esta cambiará entonces el directorio de trabajo de la shell y luego conmutará a ejecución en primer plano el trabajo que se encontraba en segundo plano. La shell advertirá entonces que el directorio de trabajo del trabajo en actual ejecución en primer plano es diferente al tabulado en la tabla de trabajos de la C shell. |
| |
| <code bash> | <code bash> |
| % dirs -I | % dirs -l |
| /mnt/bill | /mnt/bill |
| | |
| % cd miproyecto | % cd miproyecto |
| | |
| % dirs | % dirs |
| -/miproyecto | ~/miproyecto |
| % ed prog.c | % ed prog.c |
| 1143 | 1143 |
| ^Z | ^Z |
| Stopped | Stopped |
| | |
| % cd .. | % cd .. |
| | |
| % ls | % ls |
| miproyecto | miproyecto |
| fichero_texto | fichero_texto |
| | |
| % fg | % fg |
| ed prog.c (wd: -/miproyecto) | ed prog.c (wd: ~/miproyecto) |
| </code> | </code> |
| |
| De esta forma la shell le advierte cuando hay un cambio implicado de directorio de trabajo, inlcuso aunque no se envió un comando //cd//. En el ejemplo anterior, el trabajo ''ed'' aún se encontraba en ''/mnt/bill/proyectos'', incluso aunque la shell se había cambiado a ''mnt/bill''. Una advertencia similar se da cuando tal trabajo de primer plano termina o es suspendido (usando la señal STOP), desde el retorno a la shell nuevamente implica un cambio de directorio de trabajos. | De esta forma la shell le advierte con ''wd: directorio'' en el momento que exista discrepancia por un cambio de directorio de trabajo, incluso aunque no se haya utilizado un comando //cd//. En el ejemplo anterior, el trabajo suspendido ''ed'' aún se encontraba en ''/mnt/bill/proyectos'', incluso aunque la shell se había cambiado a ''mnt/bill''. Una advertencia similar se ofrece cuando tal trabajo en primer plano finaliza o resulta suspendido (usando la señal STOP). Retornar nuevamente a la shell implica cambiar de directorio de trabajo nuevamente, indicado por ''wd now: directorio''. |
| |
| <code bash> | <code bash> |
| q | q |
| (wd now: ~) | (wd now: ~) |
| | |
| % | % |
| </code> | </code> |
| |
| Estos mensajes son algo confusos si usted usa programas que cambian sus propios directorios de trabajo. Como la shell sólo recuerda desde cuál directorio un trabajo es iniciado, y asume que permanecerá allí. La opción ''-l'' de //jobs// presentará el directorio de trabajo de trabajos suspendidos o en segundo plano cuando es diferente desde el directorio de trabajo actual de la shell. | Estos mensajes resultan algo confusos si usted usa programas que cambian sus propios directorios de trabajo, pues C shell sólo recuerda desde cuál directorio un trabajo se ha iniciado, y asume su permanencia allí. La opción ''-l'' de //jobs// presentará el directorio de trabajo de los trabajos suspendidos o en segundo plano cuando discrepan del directorio de trabajo actual de la shell. |
| | |
| | > Presentar un prompt con el directorio actual de trabajo en la shell - como es usanza en los BSD modernos - solventa en gran medida estas problemáticas. En los 80s se evitaba pues el comando cwd requería un par de segundos en los lentos discos de la VAX, y enlentecía todo el sistema multiusuario [N.d.T.]. |
| |
| ==== Comandos Incorporados útiles ==== | ==== Comandos Incorporados útiles ==== |
| |
| <code bash> | <code bash> |
| echo Sargv | echo $argv |
| </code> | </code> |
| |
| # | # |
| set noglob | set noglob |
| foreach i (Sargv) | foreach i ($argv) |
| if ($i !* *.c) continue # no es un fichero .c de modo que no hace nada | if ($i !* *.c) continue # no es un fichero .c de modo que no hace nada |
| if (! -r ~/respaldo/Si:t) then | if (! -r ~/respaldo/Si:t) then |
| % cat deblanqueador.sh | % cat deblanqueador.sh |
| # deblanqueador.sh - Quita los caracteres en blanco al inicio de una línea | # deblanqueador.sh - Quita los caracteres en blanco al inicio de una línea |
| foreach i (Sargv) | foreach i ($argv) |
| ed - Si << 'EOF' | ed - Si << 'EOF' |
| 1,$s/^[ ]*// | 1,$s/^[ ]*// |
| |
| ==== ¿Qué mas? ==== | ==== ¿Qué mas? ==== |
| | |
| | Existen otras funcionalidades de la shell útiles a quienes escriben procedimientos de shell. las opciones ''verbose'' y ''echo'' y sus respectivas opciones de línea de comandos relacionadas ''-l'' y ''-x'', pueden usarse para asistir en al rastreo de acciones de shell. La opción ''-n'' hace que la shell sólo lea comandos __sin ejecutarlos__, y en ocasiones puede resultar de suma utilidad. |
| | |
| | Es importante notar que csh no ejecuta guiones de shell que no comiencen con el caracter ''#'' - lo que significa que los guiones de C shell comienzan con un comentario. De forma similar, el ''/bin/sh'' de su sistema podría bien diferir del ''csh'' en la interpretacion de guiones de shell que comiencen con ''#''. |
| | |
| | Esto es lo que permite que tanto los guiones de shell y la C shell vivan en armonía. |
| | |
| | También existe otro mecanismo de citado que usa ''"'', que permiten que se ejecuten sólo algunos mecanismos de expansión que hemos discutido hasta el momento en la cadena citada, y sirve para hacer que esta cadena se convierta en una palabra única, como lo hace ''<nowiki>'</nowiki>''. |
| | |
| |
| ===== 4. Otras funcionalidades de la shell menos utilizadas ===== | ===== 4. Otras funcionalidades de la shell menos utilizadas ===== |
| |
| ==== Bucles en la terminal; variables como vectores ==== | ==== Bucles en la terminal; variables como vectores ==== |
| | |
| | En ocasiones es útil usar la estructura de control //foreach// en el terminal para asistir en la realización de iteraciones de comandos similares. Por ejemplo, en el sistema Cory UNIX en Cory Hall hubo en un momento tres shells en uso: ''/bin/sh'', ''/bin/nsh'', y ''/bin/csh''. Para contar la cantidad de personas que usaban cada shell, uno podría haber enviado los comandos |
| | |
| | |
| | |
| | <code bash> |
| | % grep -c csh$ /etc/passwd |
| | 27 |
| | |
| | % grep -c nsh$ /etc/passwd |
| | 128 |
| | |
| | % grep -c -v sh$ /etc/passwd |
| | 430 |
| | |
| | % |
| | </code> |
| | |
| | Ya que estos comandos son muy similares, podremos usar un //foreach// para simplificar. |
| | |
| | <code bash> |
| | % foreach i ('sh$' 'csh$' -v 'sh$') |
| | ? grep -c $i /etc/passwd |
| | ? end |
| | 27 |
| | 128 |
| | 430 |
| | |
| | % |
| | </code> |
| | |
| | Tenga aquí presente que al leer desde el cuerpo de un bucle, la shell le solicita entrada con un ''?''. Las variables son de utilidad en los bucles, pues puede asignarle listas de nombres de ficheros u otras palabras. Por ejemplo, podría hacer |
| | |
| | <code bash> |
| | % set a=('ls') |
| | |
| | % echo $a |
| | csh.n csh.rm |
| | |
| | % ls |
| | csh.n |
| | csh.rm |
| | |
| | % echo $#a |
| | 2 |
| | |
| | % |
| | </code> |
| | |
| | Aquí el comando //set// da a las variables de una lista ''a'' cuyo valor es todos los nombres de fichero del directorio actual. Podemos luego iterar sobre dichos nombres para realizar cualquier función que escojamos. |
| | |
| | La salida de un comando apostrofado entre caracteres ''<nowiki>'</nowiki>'' es convertida por la shell a una lista de palabras. También puede entrecomillar la cadena citada entre caracteres ''"'' para considerar cada línea __no vacía__ como un componente de variable (impidiendo que las líneas resulten divididas como palabras a lo largo de sus caracteres de espacio en blanco o tabuladores. Existe un modificador ''-x'' que puede ser utilizado luego para expandir cada componente de variable en otra variable, dividiéndola en palabras separadas a lo largo de sus caracteres de espacio en blanco o tabuladores. |
| | |
| | |
| | |
| | |
| |
| ==== Llaves {...} en expansión de argumentos ==== | ==== Llaves {...} en expansión de argumentos ==== |
| | |
| | Otra forma de expansión de nombre de fichero aludida anteriormente involucra el uso de caracteres de lave abierta ''{'' y llave cerrada ''}''. Dichos caracteres especifican que la cadena contenida entre llaves, separada por comas '','', debe ser sustituida consecutivamente en los caracteres contenidos entre llaves, y los resultados, expandidos de izquierda a derecha. Por lo tanto |
| | |
| | <code bash> |
| | A{cad1,cad2... stm}B |
| | </code> |
| | |
| | se expande a |
| | |
| | Acad1B Acad2B... AstmB |
| | |
| | Esta expansión ocurre antes que otras expansiones de nombre de fichero, y puede aplicarse recursivamente (si se encuentra anidada). Los resultados de cada cadena expandida se ordenan por separado, preservándose el orden de izquierda a derecha. No se requiere que existan los nombres de fichero resultante si no se emplean mecanismos de expansión ulteriores. Esto significa que este mecanismo puede utilizarse para generar argumentos que no sean nombres de fichero, pero que tengan partes en común. |
| | |
| | Un uso típico de esto sería |
| | |
| | <code bash> |
| | mkdir ~/{hdrs,retrofit,csh} |
| | </code> |
| | |
| | que crea los subdirectorios ''hdrs'', ''retrofit'' y ''csh'' en su directorio ''home''. Este mecanismo es más útil cuando el prefijo común es más largo que el dado en este ejemplo, por ejemplo: |
| | |
| | <code bash> |
| | chown root /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}} |
| | </code> |
| | |
| | ==== Sustitución de Comandos ==== |
| | |
| | Un comando encerrado en caracteres '''' resulta reemplazado justo antes de que se expandan los nombres de cihero, por la salida de dicho comando. Por lo tanto, es posible hacer |
| | |
| | <code bash> |
| | set pwd='pwd' |
| | </code> |
| | |
| | para salvar el directorio actual en la variable ''pwd'', o bien hacer |
| | |
| | <code bash> |
| | ex 'grep -l TRACE *.c' |
| | </code> |
| | |
| | para ejecutar el editor ex proveyéndolo de aquellos ficheros cuyos nombres finalicen en ''.c'' y que contengan la cadena ''TRACE'' como argumento. |
| | |
| | |
| | > La expansión de comandos también ocurre en la entrada redirigida con ''<<''y dentro de citado entrecomillado con ''<nowiki>""</nowiki>''. Refiérase al manual de la shell para los detalles completos |
| | |
| |
| ==== Otros detalles no cubiertos==== | ==== Otros detalles no cubiertos==== |
| | |
| | En circunstancias particulares puede ser necesario conocer la naturaleza y orden exacto de las diferentes sustituciones desarrolladas por la shell. El significado exacto de ciertas combinaciones de citas es importante ocasionalmente. Estas se detallan al completo en su repsectiva sección del manual. La shell tiene una cantidad de opciones //flags// que se emplean mayoritariamente para escribir programas de UNIX, y depurar guiones de shell. Consulte la sección de manual de la shell para obtener un listado de dichas opciones. |
| |
| |