martes, 26 de marzo de 2013

El intérprete de órdenes III


Para poder continuar, es necesario comprender un poco mejor lo que es un comando y como es interpretado por el shell. El comando más simple es una palabra aislada, que evoca por lo general a un archivo con permisos de ejecución por parte del usuario. Por ejemplo:
hcaste@azul:~$ who
hcaste   pts/1        2013-03-20 11:35 (:3)
hcaste   tty7         2013-03-20 07:12
un comando se ingresa con una nueva-linea o retorno, pero “;” también es un terminador de comando para poder hacer concatenación secuencial. Por ejemplo:
hcaste@azul:~$ date; who
mié mar 20 11:38:45 ART 2013
hcaste   pts/1        2013-03-20 11:35 (:3)
hcaste   tty7         2013-03-20 07:12
Uno de los mecanismos IPC (Inter Process Comunication) mas usados a nivel de shell son los “pipes” o ñocas para los amigos… yo usaré indistinto el término “pipe” o caño para referirme a dicho IPC. El mecanismo de caño es redireccionar la salida estándar de un comando a la entrada estándar de otro, por ejemplo:
hcaste@azul:~$ date; who|wc
mié mar 20 11:42:16 ART 2013
      2       9      83
aquí solo la salida estándar comando “who” se dirigió a la entrada estándar del “wc” esto se debe a un hecho conocido como “precedencia”, la precedencia de “|” es mayor que la de “;”. Pero el “( )” tiene mayor precedencia aún, entonces:
hcaste@azul:~$ (date; who)|wc
      3      15     113
Otro terminador de comando es “&” este le indica al shell que no espere a que el comando finalice, esto se lo conoce como ejecución en segundo plano o “background”, esto permite la ejecución de comandos de manera paralela. Un ejemplo:
hcaste@azul:~$ (sleep 5; date) & date
[1] 17067
mié mar 20 11:49:20 ART 2013
hcaste@azul:~$ mié mar 20 11:49:25 ART 2013

[1]+  Hecho                   ( sleep 5; date )
En este caso lo que estaba entre () se ejecuta en paralelo con el siguiente, “&” devuelve el PID (Identificador de proceso).
Nota: En Unix-like todos los procesos se los identifican con números, para saber los procesos de usuario que corren en la terminal basta con ingresar el comando “ps”.
hcaste@nubehoracio:~$ ps x
  PID TTY      STAT   TIME COMMAND
25968 ?        S      0:00 sshd: hcaste@pts/0
25969 pts/0    Ss     0:00 -bash
26000 pts/0    R+     0:00 ps x
Aquí el pid del shell bash es “25969″. El campo TTY identifica el tipo de terminal, el campo STAT identifica el estado, en general es R=corriendo, S=”durmiendo”, D=”bloqueado”, Z=”sombi”. TIME es el tiempo de ejecución virtual y COMMAND es el nombre de comando.
Los caracteres reservados para el shell son: “<”, “>”, “|”, “;”, “.”, “..”, “/” y “&”.
Su significado es:
">" desvío de la salida estándar con sustitución, ">>" con concatenación.
"<" desvío de la entrada estándar
"|" caño
";" terminador de comando
"." directorio actual
".." directorio padre o superior
"/" separador de directorio o constructor de camino (PATH)
"&" terminador de comando con ejecución en segundo plano.