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.

El intérprete de órdenes II






Recordemos lo que se mencionó en la última entrega. Un shell, básicamente, es un intérprete de órdenes en línea. Su trabajo consiste en leer las instrucciones que da el usuario, realizar una serie de funciones de análisis y pasar la instrucción interpretada al SO.
En los unnixlike, el mecanismo clásico de ejecución de una orden por parte del shell es llamar a un conjunto de operaciones llamadas “primitivas” o en inglés “system calls”. En la siguiente listas se dan las primitivas más conocidas.
El System Calls para el sub-sistema de manejo de archivos provee:
Acceso a archivos existentes: open, read, lseek, close.
Creación de nuevos archivos: create, mknod.
Manejo atraves del file system: chdir, chown, chmod.
Creación y borrado de links: link y unlink.
El System Calls para el subsitema de control de procesos prove:
Creación de proceso Hijo: Fork
Ejecución de proceso: Exec
Evío de señales: Kill y signal
El mecanismo clásico (ver figura), sin entrar en detalles profundos, de ejecución de una instrucción por parte del shell es llamar la primitiva “fork”(1) se crean dos procesos idénticos uno el proceso hijo y otro el padre. Se duplican las pilas y las tablas de datos en áreas de memoria incompatibles. El proceso shell padre se pone a dormir con la primitiva “wait” a espera que el shell hijo termine. El shell hijo ejecuta las instrucciones con la primitiva “exec”; una vez que finalice este le indica al shell padre que terminó con la primitiva “exit”. Además por un mecanismo de comunicación entre procesos (IPC) el hijo le comunica al padre los resultados de la ejecución de los comandos.
(1) No confundir con la primitiva “clone” que pertenece al POSIX 1001.
El shell tiene incorporado algunas órdenes dentro de sus propio código, es decir, no existe como programa ejecutable en ningún directorio. Estas son intrínsecas del shell como ser cd, pwd, echo, etc. Cuando se ejecuta una órden interna al shell no crea proceso hijo. Las funciones internas se puden ver con la instrucción “help” en BASH.
Un ejemplo de ejecución interna es:
hcaste@azul:~$ x=37
hcaste@azul:~$ cadena="hola"
hcaste@azul:~$ echo "$cadena $x"
hola 37
En la primera se le crea la variable con etiqueta “x” y se le asocia el contenido 37. En el segundo caso se crea la variable con etiqueta “cadena” se le asocia la cadena de caracteres (string en inglés) “hola”. Luego la instrucción interna echo muestra los contenidos de cada variable, observar el signo “$” que indica “contenido”. En cambio si hago:
hcaste@azul:~$ echo "cadena x"
cadena x
para saber que hace echo, basta con hacer “help echo”
hcaste@azul:~$ help echo
echo: echo [-neE] [arg ...]
Escribe argumentos en la salida estándar.
Muestra los argumentos en la salida estándar seguidos por un carácter
de fin de línea.
también se puede consultar al manual “man echo” pero este en general está en inglés…
ECHO(1) User Commands ECHO(1)
NAME
 echo - display a line of text
SYNOPSIS
 echo [SHORT-OPTION]... [STRING]...
 echo LONG-OPTION
DESCRIPTION
 Echo the STRING(s) to standard output.
-n do not output the trailing newline
-e enable interpretation of backslash escapes
En la próxima entrega se focalizará ya en el shell-scrypt.

El intérprete de órdenes I


En esta primera entrega haré una introducción para dar una cosmovisión sobre para que sirve y como se usa un “shell” asociado a sistemas operativos Linux, FreeBSD, Irix, etc.. conocidos como “Unixlike”
Cuando iniciamos una sesión en un sistema Unixlike respondiendo a lo que nos solicita el programa “login”
con nuestro nombre de usuario y contraseña correcta, el sistema ejecuta automáticamente un programa conocido en la jerga como “shell”, ó intérprete de órdenes, este queda esperando las órdenes de manera interactiva con una marca llamada “prompt”. El prompt por defecto, que se puede cambiar, el en interprete BASH es “$” para un usuario sin privilegios. Por ejemplo
hcaste@roja:~$
“hacaste” es el nombre del usuario y “roja” es el nombre de la máquina no su dominio. Esto permite al usuario saber de antemano donde está ubicado.
La traducción de “shell” sería caparazón en un viejo paradigma de los años 1960 donde se suponía que un sistema operativo seguía el modelo de la cebolla y el shell era lo que recubría a la cebolla, y este es la interfaz entre el usuario y el resto del sistema. Ahora lo mas correcto sería suponer que un sistema operativo fuera una almeja o un molusco bibalvo, pues lo que recubre a la cebolla es el la piel o “skin”… una de los interrogantes más del mundo misterioso que es la informática…
Muchas personas tienden a confundir los términos de intérprete de órdenes (IO) con sistema operativo (SO). Esto no es así, el IO es un programa más como lo puede ser un navegador web. La razón del mal entendido radica en que el IO actúa como interfaz entre el usuario y el SO. Más aún en los sistema Unixlike el usuario puede elegir que IO quiere, este está definido en el archivo /etc/passwd.
La zoología de IO existentes el basta pero los más conocidos son:

bash = Bourne again shell
sh = shell
csh = C shell
tcsh = Tenex C shell (not permite tab-completado)
tclsh = Tcl shell
ksh = Korn shell
ash = a shell
bsh = bourne shell (en muchos unixlike es un enlace a /bin/ash)
zsh = the Z shell

De todos mi explicaciones estarán enfocadas al estándar de facto el “BASH“.
Un shell, básicamente, es un IO en línea de comandos. Su tarea consiste en leer las instrucciones que le ingresa el usuario, a través de teclado, o a través de un archivo de texto ASCII conocido como script o guión; realiza una serie de operaciones de reducción a primitivas de sistemas y pasa la instrucción convertida a primitiva de sistema al SO.

lunes, 25 de marzo de 2013

REUNIÓN DEL LUGRo, VIERNES 29, 21 HORA


Este viernes 29 de Marzo a partir de las 21 horas se llevara a cabo la reunión del Grupo De Usuarios de Software Libre de Rosario en el bar Industria Argentina (Caferata entre Urquiza y Tucuman).

Están todos invitados.

miércoles, 13 de marzo de 2013

Estadística Marzo 2013



      9 Miguel de Icaza abandona Linux y se pasa a Mac
      7 Lugro-Mesh
      7 Direcciond eip estática
      4 Argentina presente en v3.9
      2 Charlas 2013




martes, 12 de marzo de 2013

REUNIÓN DEL LUGRo, VIERNES 15, 21 HORAS


Este viernes 15 de Marzo a partir de las 21 horas se llevara a cabo la reunión del Grupo De Usuarios de Software Libre de Rosario en el bar Industria Argentina (Caferata entre Urquiza y Tucuman).

Están todos invitados.