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_csh [2024/07/19 16:25] perontutorial_de_csh [2026/04/21 16:09] (actual) – editor externo 127.0.0.1
Línea 10: Línea 10:
 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 =====
Línea 55: Línea 54:
 >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 ''% ''.
Línea 353: Línea 352:
  
 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]].
  
Línea 365: Línea 364:
  
 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
  
Línea 409: Línea 408:
 echo "${prompt}users" ; users echo "${prompt}users" ; users
 alias ts \ alias ts \
-         'set noglob ; eval `tset -s -m dialup:vt220 -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
Línea 706: Línea 705:
 </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>
Línea 712: Línea 711:
 </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 '';'' generaun 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>
Línea 724: Línea 723:
 </code> </code>
  
-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á lista e inmediatamente a la espera de otro comando. Dicho trabajo se ejecutará //en segundo plano//, - a diferencia de 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+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
  
  
Línea 731: Línea 730:
 </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), colocar la salida en el fichero ''uso_de_disco''volver inmediatamente la atención a usted con un prompt para eventual disposición de un ulterior nuevo comando (sin aguardar la finalización de //du//). El programa //du// continuará mientras tanto su ejecución en segundo plano hasta completarse, incluso aunque usted mecanografíe y solicite cumplimiento de otros comandos. Justo antes del siguiente prompt, la shell presentará un mensaje al finalizar 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// finalizase.+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''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 de un trabajo, el mensaje ''Done'' podría corresponderse por otro diferente, como ''Killed''. Si desea que le sean reportadas las finalizaciones de programas en segundo plano al mismo momento en que ocurran - eventualmente incluso interrumpiendo la salida de terminal de otros trabajos en primer plano - puede establecer la variable ''notify''En el ejemplo anterior, eventualmente podría implicar que el mensaje ''Done'' aparezca directamente en medio de la redacción del correo a Bill. +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. 
  
 >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. >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.
  
-La C shell da de alta los trabajos en una //tabla de trabajos// incorporada,los da de baja su finalizaciónLa 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ó cada 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 un trabajo por vez puede correr en el primer plano, 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.+La C shell inicia el alta los trabajos en una //tabla de trabajos// incorporada,finaliza su baja con su cumplimientoEn 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 
  
-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 comandole informará el número de trabajo - así como los números de proceso de todos sus comandos de nivel superior - . Por ejemplo,+  * 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,
  
  
Línea 758: Línea 767:
 </code> </code>
  
-ejecuta el programa //ls// con la opción ''-s'', entuba la salida resultante al programa //sort// con la opción ''-n'', y coloca la salida resultante en el fichero ''uso_de_disco''. Debido a que el sufijo ''&'' al final de la líneaambos programas se iniciaron conjuntamente en la forma de un //trabajo en segundo plano//Tras iniciar el trabajo, la shell presentó el //número de lista 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 eventualmente un nuevo comando, dejando al trabajo en ejecución concurrente (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ésla 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 al trabajo en ejecución en primer plano una señal STOPUn 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 trabajoe 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>
Línea 766: Línea 775:
 ^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 suspendidoAl 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, poniendo 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
  
  
Línea 786: Línea 798:
 ^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 planopermitiendo 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 trabajospresenta 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>
Línea 816: Línea 838:
  
 % ls % ls
-15 -s | sort -n > mifichero+ls -s | sort -n > mifichero
  
 % more mifichero % more mifichero
 </code> </code>
  
-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 planopues se deseaba aguardar su finalización antes de estudiar su fichero de salida. El comando //bg// corre un trabajo suspendido en el segundo plano. Usualmente se utiliza tras detener con la señal STOP el trabajo actual en ejecución en primer plano. La combinación de la señal STOP 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 anteriorse 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>
Línea 831: Línea 853:
 </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 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. 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.
Línea 884: Línea 906:
 wc ficherogigante wc ficherogigante
 13371 30123 302577 13371 30123 302577
 +
 % stty - tostop % stty - tostop
 </code> </code>
Línea 893: Línea 916:
 ==== 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'', dondepor ejemplopodrí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ónsimplemente 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>
Línea 913: Línea 940:
 </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>
Línea 925: Línea 952:
 </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//.
  
  
Línea 935: Línea 962:
  
 % 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
Línea 947: Línea 974:
 </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 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 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 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>
Línea 979: Línea 1012:
 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 ====
Línea 1124: Línea 1160:
  
 <code bash> <code bash>
-echo Sargv+echo $argv
 </code> </code>
  
Línea 1260: Línea 1296:
 # #
 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
Línea 1422: Línea 1458:
 % 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/^[ ]*//
Línea 1458: Línea 1494:
  
 ==== ¿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.
  
  

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