Difference: TWikiBarConversa011 (1 vs. 15)

Revision 1514 Feb 2012 - MarioSilva

Line: 1 to 1
 

Conversación de Bar parte XI


Line: 307 to 307
 

-- DanielRefosco - 3 Jan 2007

Added:
>
>

Revision 1424 Feb 2008 - CollonsTorre

Line: 1 to 1
 

Conversación de Bar parte XI



Changed:
<
<
     - Y ahí, como va amigo, todo bien?
>
>
     - Ei!, como va amigo, todo bien?
 
Changed:
<
<
     - Más o menos.. te acuerdas que me pediste que haga un programa que cuando el tamaño de la pantalla variase , en el centro apareciese dinamicamente y en video reverso, la cantidad de líneas y columnas, de la misma forma que el Linux hace normalmente?. Bueno, lo hice, pero en la apariencia no quedó igual.
>
>
     - Más o menos.. te acuerdas que me pediste que hiciera un programa que cuando el tamaño de la pantalla variase, en el centro apareciese dinamicamente y en vídeo inverso, la cantidad de líneas y columnas, de la misma forma que el Linux hace normalmente?. Bueno, lo hice, pero la apariencia no quedó igual.
 
Changed:
<
<
     - No estoy preocupado por la apariencia, lo que yo quería es que tu ejercitases lo que aprendimos. Déjame ver lo que hiciste.
>
>
     - No estoy preocupado por la apariencia, lo que yo quería es que ejercitases lo que aprendimos. Déjame ver lo que hiciste.
 
$ cat tamtela.sh #!/bin/bash #
Changed:
<
<
# Colocar en el centro de la pantalla, con video reverso,
>
>
# Colocar en el centro de la pantalla, con vídeo inverso,
 # una cantidad de columnas y lineas # cuando el tamaño de la pantalla es alterado. #
Line: 21 to 21
  # de la pantalla y Muda es la función que hace eso.

Bold=$(tput bold) # Negrita, modo de énfasis

Changed:
<
<
Rev=$(tput rev) # Modo de video reverso Norm=$(tput sgr0) # Restaura la pantalla al valor de default
>
>
Rev=$(tput rev) # Modo de vídeo inverso Norm=$(tput sgr0) # Restaura la pantalla al valor por defecto
  Muda () { clear Cols=$(tput cols) Lins=$(tput lines)
Changed:
<
<
tput cup $(($Lins / 2)) $(((Cols - 7) / 2)) # Centro de la pantlla
>
>
tput cup $(($Lins / 2)) $(((Cols - 7) / 2)) # Centro de la pantalla
  echo $Bold$Rev$Cols X $Lins$Norm }
Line: 37 to 37
 read -n1 -p "Cambie el tamaño de la pantalla o teclee algo para terminar"
Changed:
<
<
     - Perfecto ! , que se embrome la apariencia , despues te enseño otras formas de mejorarlo, lo que vale es el programa, está funcionando y esta todo optimizado.
>
>
     - Perfecto!, que se joda la apariencia, después te enseño otras formas de mejorarlo, lo que vale es el programa, está funcionando y esta todo optimizado.
 
Changed:
<
<
     - Pero perdí el mayor tiempo intentando descubrir como aumentar el tamaño de la fuente.- ...
>
>
     - Pero perdí la mayor parte del tiempo intentando descubrir como aumentar el tamaño de la fuente.- ...
       - Deja eso para otro día, hoy vamos a ver unas cosas bastante interesantes y útiles..
Line: 51 to 51
 prw-r-r-- 1 julio dipao 0 Jan 22 23:11 pipe1|
Changed:
<
<
La p en la columna del lado izquierdo indica que pipe1 es un named pipe. El resto de los bits de control de permisos, que se pueden leer o grabar al pipe, funcionan como un archivo normal. En los sistemas mas modernos una barra vertical (|) colocada al fin del nombre del archivo, es otra pista y en los sistemas LINUX, donde la opción de color esta habilitada, el nombre del archivo es escrito en rojo por defecto.
>
>
La p en la columna del lado izquierdo indica que pipe1 es un named pipe. El resto de los bits de control de permisos, que se pueden leer o grabar al pipe, funcionan como un archivo normal. En los sistemas mas modernos una barra vertical (|) colocada al final del nombre del archivo, es otra pista y en los sistemas LINUX, donde la opción de color esta habilitada, el nombre del archivo se escribe en rojo por defecto.
 
Changed:
<
<
En los sistemas mas antiguos, los named pipes son creados por un programa mknod, normalmente situado en el directorio /etc.
>
>
En los sistemas mas antiguos, los named pipes son creados por el programa mknod, normalmente situado en el directorio /etc.
 
Changed:
<
<
En los sistemas mas modernos, la misma tarea es hecha por mkfifo. EL programa mkfifo recibe uno o mas nombres como argumento y crea pipes con esos nombres. Por ejemplo , para crear un named pipe con nombre pipe1 haga:
>
>
En los sistemas mas modernos, la misma tarea es hecha por mkfifo. EL programa mkfifo recibe uno o mas nombres como argumento y crea pipes con esos nombres. Por ejemplo , para crear un named pipe con nombre pipe1 haz:
 
$ mkfifo pipe1
Changed:
<
<
Como siempre la mejor forma de mostrar que algo funciona es dando ejemplos. Suponga que hayamos creado el named pipe mostrado anteriormente. Vamos ahora a trabajar con dos secciones o dos consolas virtuales o una de cada una. En una de ellas haga:
>
>
Como siempre la mejor forma de mostrar que algo funciona es dando ejemplos. Suponga que hayamos creado el named pipe mostrado anteriormente. Vamos ahora a trabajar con dos secciones o dos consolas virtuales o una de cada una. En una de ellas haz:
 
$ ls -l > pipe1
Changed:
<
<
en otra haga:
>
>
en la otra haz:
 
$ cat < pipe1
Changed:
<
<
Voilá! La salida del comando ejecutado en la primera consola fué exibida en la segunda. Note que el orden en que los comandos ocurrieron no importa.
>
>
Voilá! La salida del comando ejecutado en la primera consola fue mostrada en la segunda. Fíjate que el orden en que los comandos ocurrieron no importa.
 
Changed:
<
<
Si prestaste atención, viste que el primer comando ejecutado parecía estar "colgado". Esto sucede por que la otra punta del pipe todavía no estaba conectada, y entonces el sistema operativo suspendió el primer proceso hasta que el segundo proceso "abriera" el pipe. Para que un processo que usa el _pipe no quede en modo wait, es necesario que en una punta del pipe tenga un proceso "que habla" y en el otro un proceso " que escucha" y en el ejemplo que dimos , el ls era el que hablaba y el cat era el que escuchaba.-
>
>
Si prestaste atención, viste que el primer comando ejecutado parecía estar "colgado". Esto sucede por que la otra punta del pipe todavía no estaba conectada, y entonces el sistema operativo suspendió el primer proceso hasta que el segundo proceso "abriera" el pipe. Para que un proceso que usa el _pipe no quede en modo wait, es necesario que en una punta del pipe tenga un proceso "que habla" y en el otro un proceso " que escucha" y en el ejemplo que dimos , el ls era el que hablaba y el cat era el que escuchaba.-
 
Changed:
<
<
Una aplicacion muy util de los named pipes es permitir que programas sin ninguna relación se puedan comunicar entre sí, los named pipes también son usados para sincronizar procesos, ya que en un determinado punto puedes colocar un proceso para "escuchar" o "hablar" en un determinado named pipe y él de allí solo saldrá, si otro proceso "habla" o "escucha" en aquel pipe.
>
>
Una aplicación muy útil de los named pipes es permitir que programas sin ninguna relación se puedan comunicar entre sí, los named pipes también son usados para sincronizar procesos, ya que en un determinado punto puedes colocar un proceso para "escuchar" o "hablar" en un determinado named pipe y solo saldrá de allí , si otro proceso "habla" o "escucha" en aquel pipe.
 
Changed:
<
<
Viste que el uso de esta herramienta es ideal para sincronizar los procesos y para hacer bloqueo de archivos de forma de evitar perdida / corrupción de información devido a actualizaciones simultáneas ( concurrencia). Veamos ejemplos para ilustrar estos casos.
>
>
Viste que el uso de esta herramienta es ideal para sincronizar los procesos y para bloquear archivos y poder evitar así perdida o corrupción de información debido a actualizaciones simultáneas (concurrencia). Veamos ejemplos para ilustrar estos casos.
 

Sincronización de procesos.

Changed:
<
<
Suponga que disparas paralelamente dos programas (procesos) cuyos diagramas de bloque de sus rutinas son como muestra la siguiente figura:
>
>
Imagina que lanzas paralelamente dos programas (procesos), los diagramas de bloque de sus rutinas son como muestra la siguiente figura:
 

Gráfico del Named Pipe
Changed:
<
<
Los dos procesos son disparados en paralelo y en el BLOCO1 del Programa1 las tres clasificaciones son disparadas de la siguiente manera:
>
>
Los dos procesos son lanzados en paralelo y en el BLOCO1 del Programa1 las tres clasificaciones son lanzadas de la siguiente manera:
 
    for Arq in BigFile1 BigFile2 BigFile3
Line: 113 to 113
  ...
Changed:
<
<
De esta forma, el comando if verifica cada clasificación que está siendo efectuada. En caso de que ocurra un problema, las clasificaciones siguientes serán abortadas, un mensaje conteniendo la cadena pare es enviada por el pipe1 y el programa1 es discontinuado con un fin anormal.
>
>
De esta forma, el comando if verifica cada clasificación que está siendo efectuada. En caso de que ocurra un problema, las clasificaciones siguientes serán abortadas, un mensaje conteniendo la cadena pare es enviada por el pipe1 y el programa1 es finalizado con un fin anormal.
 
Changed:
<
<
En cuanto el Programa1 ejecutava su primero bloque (las clasificaciones) el Programa2 ejecutaba su bloque BLOCO1, procesando sus rutinas de abertuta y menú paralelamente al Programa1, ganando de esta forma un buen intervalo de tiempo.
>
>
Mientras el Programa1 ejecutaba su primero bloque (las clasificaciones) el Programa2 ejecutaba su bloque BLOCO1, procesando sus rutinas de apertura y menú paralelamente al Programa1, ganando de esta forma un buen intervalo de tiempo.
 
Changed:
<
<
El fragmento del código del Programa2 que vemos a continuación, muestra la transición del BLOCO1 para el BLOCO2:
>
>
El fragmento del código del Programa2 que vemos a continuación, muestra la transición del BLOCO1 hacia el BLOCO2:
 
    OK=`cat pipe1`
Line: 131 to 131
  fi
Changed:
<
<
Despues de la ejecución del primer bloque , el Programa2 pasará a "escuchar" el pipe1, quedando parado hasta que las clasficaciones del Programa1 terminen, testando al seguir el mensaje pasado por el pipe1 para decidir si los archivos están íntegros para ser impresos , o si el programa debería ser discontinuado. De esta forma es posible disparar programas de forma sincronizada y no sincronizada cuando es necesario, ganando bastante tiempo de procesamiento.
>
>
Después de la ejecución del primer bloque , el Programa2 pasará a "escuchar" el pipe1, quedando parado hasta que las clasificaciones del Programa1 terminen, comprobando a continuación el mensaje pasado por el pipe1 para decidir si los archivos están preparados para ser impresos , o si el programa debería terminarse. De esta forma es posible lanzar programas de forma sincronizada y no sincronizada cuando es necesario, ganando bastante tiempo de procesamiento.
 

Bloqueo de archivos

Changed:
<
<
Supón que escribes una CGI (Common Gateway Interface) en Shell para contar cuantos hits recibe una determinada URL y la rutina de contar es la siguiente:
>
>
Supón que escribes una CGI (Common Gateway Interface) en Shell para contar cuantos hits recibe una determinada URL y la rutina del contador es la siguiente:
 
    Hits="$(cat page.hits 2> /dev/null)" || Hits=0
Line: 142 to 142
 

De esa forma si la página recibe dos o mas accesos concurrentes, uno o mas podrá(n) perderse, basta que el segundo acceso sea hecho después de una lectura del archivo page-hits y antes de su grabación, es decir, basta que el segundo acceso sea hecho después de que el primero haya ejecutado la primer línea del _script_y antes de ejecutar la segunda.

Changed:
<
<
Entoces que hacemos? Para resolver el problema de concurrencia vamos a utilizar un named pipe. Creamos el siguiente scritp que será el daemon que recibirá la pagina en nuestro site que necesita de un contador.
>
>
Entonces que hacemos? Para resolver el problema de concurrencia vamos a utilizar un named pipe. Creamos el siguiente scritp que será el daemon que recibirá la pagina en nuestro site que necesita de un contador.
 
$ cat contahits.sh
Line: 170 to 170
 done
Changed:
<
<
Como solamente este script altera los archivos, no existe problema de concurrencia
>
>
Como solamente este script modifica los archivos, no existe problema de concurrencia
 
Changed:
<
<
Este script será un daemon, esto es, correrá en background. Cuando una página sufre un acceso, el script escribirá su URL en el archivo del pipe. Para testar, ejecute este comando:
>
>
Este script será un daemon, esto es, correrá en background. Cuando una página sufre un acceso, el script escribirá su URL en el archivo del pipe. Para probarlo, ejecuta este comando:
 
    echo "test_pagina.html" > /tmp/pipe_contador 
Changed:
<
<
Para evitar errores, en cada página que quisieramos agregar el contador anexamos la siguiente linea:
>
>
Para evitar errores, en cada página que quisiéramos agregar el contador añadiriamos la siguiente linea:
 
    <!--#exec cmd="echo $REQUEST_URI > /tmp/pipe_contador"-->
Changed:
<
<
Note que la variable $REQUEST_URI contiene el nombre del archivo que el navegador
>
>
Observa que la variable $REQUEST_URI contiene el nombre del archivo que el navegador
 (browser)pidió. Este último ejemplo ,es fruto de una idea que intercambié con un amigo y maestro en Shell , Thobias Salazar Trevisan que escribió el script y lo colocó en su excelente URL.
Changed:
<
<
Aconsejo a todos que los que quieren aprender Shell que peguen una mirada (Dé una mirada e incluya en los favoritos).
>
>
Aconsejo a todos que los que quieren aprender Shell que le echen un vistazo y la incluyan en sus favoritos.
 
Changed:
<
<
Ahhh! Pensaste que el asunto sobre el named pipes estaba terminado? Estas engañado. Te voy a mostrar un uso diferente de él a seguir.
>
>
Aja! Pensaste que el asunto sobre los named pipes estaba terminado? Pues estabas engañado. A continuación te voy a mostrar un uso diferente de ellos.
 

Substitución de procesos

Changed:
<
<
Terminé de mostrar un montón de recetas sobre named pipes . Ahora voy a mostrar que el Shell también usa los named pipes de una manera bastante singular, que es la sustitución de procesos (process substitution).Una sustitución de procesos ocurre cuando pones un comando en un pipeline de comando entre paréntesis y un < o un > grudado en el frente del paréntesis en la izquierda. Por ejemplo, tecleando el comando:
>
>
Acabo de mostrarte un montón de recetas sobre los named pipes . Ahora te voy a mostrar que el Shell también usa los named pipes de una manera bastante singular, que es la sustitución de procesos (process substitution). Una sustitución de procesos ocurre cuando dentro de un pipeline de comando pones un comando entre paréntesis y un < o un > unido al paréntesis de la izquierda. Por ejemplo, tecleando el comando:
 

$ cat <(ls -l)
Changed:
<
<
Resultará en que el comando ls -l ejecutado en un subshell como es normal (por estar entre paréntisis), redireccionará la salida a un named pipe temporario, que el Shell crea, usa y luego remueve. Entonces el cat tendrá un nombre de archivo válido para leer (que será este named pipe y cuyo dispositivo lógico asociado es /dev/fd/63), y tendremos la misma salida que la generada por la del ls -l, pero dando uno o mas pasos que lo usual , y esto es mas costoso para el computador.
>
>
Resultará que el comando ls -l ejecutado en un subshell como es normal (por estar entre paréntesis), redireccionará la salida a un named pipe temporal, que el Shell crea, usa y luego elimina. Entonces el cat tendrá un nombre de archivo válido para leer (que será este named pipe y cuyo dispositivo lógico asociado es /dev/fd/63), y tendremos la misma salida que la generada por la del ls -l, pero dando uno o mas pasos de lo usual, y esto es mas costoso para el computador.
 
Changed:
<
<
Como podremos constatar esto? Facil .. Mirá el siguiente comando:
>
>
Como podremos constatar esto? Fácil .. Mira el siguiente comando:
 
$ ls -l >(cat)
Line: 212 to 212
  Y... Realmente es un named pipe.
Changed:
<
<
Tu deves estar pensando que esto es una locura nerd , no? Entonces supongamos que tenes 2 directorios: dir e dir.bkp , y deseas saber si los dos son iguales ( aquella vieja duda: será que mi backup está actualizado? ). Basta comparar los dos archivos de los directorios con el comando cmp, haciendo:
>
>
Debes estar pensando que esto es una locura nerd , no? Entonces supongamos que tenes 2 directorios: dir y dir.bkp , y deseas saber si los dos son iguales ( aquella vieja duda: estará mi backup actualizado? ). Basta comparar los dos archivos de los directorios con el comando cmp, haciendo:
 
$ cmp <(cat dir/*) <(cat dir.bkp/*) || echo backup desactualizado!
Changed:
<
<
o, mejor tovavía:
>
>
o, mejor todavía:
 
$ cmp <(cat dir/*) <(cat dir.bkp/*) >/dev/null || echo backup desactualizado!
Changed:
<
<
De la última forma,la comparación fué efectuada en todas las líneas de todos los archivos de ambos directorios. Para acelerar el proceso, podríamos comparar solamente el listado largo de ambos de los directorios, pues cualquier modificación que un archivo sufra, es mostrado como alteración de la data/hora y/o del tamaño del archivo. Mirá como quedaría:
>
>
De la última forma, la comparación fue efectuada en todas las líneas de todos los archivos de ambos directorios. Para acelerar el proceso, podríamos comparar solamente el listado largo de ambos en los directorios, pues cualquier modificación que un archivo sufra, es mostrado como alteración de la fecha/hora y/o del tamaño del archivo. Mira como quedaría:
 
$ cmp <(ls -l dir) <(ls -l dir.bkp) >/dev/null || echo backup desactualizado!
Line: 253 to 253
  echo "En el directório corriente (`pwd`) existen $i archivos"
Changed:
<
<
Cuando ejecutase el script, parecería que esta todo ok, sin embargo en el comando echo después del none, vas a ver que el valor de $i fué perdido. Esto se debe al hecho de que esta variable esta siendo incrementada en un subshell creado por el pipe (|) y que termina con el comando done, llevándose con él todas las variables creadas en su interior y las alteraciones hechas en todas la variables, inclusive las creadas externamente.
>
>
Cuando ejecutase el script, parecería que esta todo ok, sin embargo en el comando echo después del none, vas a ver que el valor de $i se perdió. Esto se debe al hecho de que esta variable esta siendo incrementada en un subshell creado por el pipe (|) y que termina con el comando done, llevándose con él todas las variables creadas en su interior y las alteraciones hechas en todas la variables, inclusive las creadas externamente.
 Solamente para mostrarte que una variable creada fuera del subshell y alterada en su interior, pierde las alteraciones hechas al final, ejecuta el script siguiente:
Line: 293 to 293
 $ rm -f /tmp/sort1 /tmp/sort2
Changed:
<
<
Gente.. nuesta Convesación llegó al fin, frown . Disfruté mucho aquí y recibí diversos elogios por los trabajos realizados a lo largo de 12 meses y, lo mejor de todo, hice muchas amistades y tomé muchos chopps gratis con los lectores que encontré por los congresos y charlas que ando haciendo por nuestro querido Brasíl. Lo que voy a escribir aquí no está arreglado ni sé si será publicado, pero como los editores de esta revista son dos locos hermosos (ambos Rafael), es capaz que lo dejen pasar. Es lo siguiente: si quieren que el Papo de Botequin continue, llenen la caja postal de la Linux Magazine pidiendo esto y desde ya escoja el próximo tema entre sed + expresiones regulares o lenguaje =awk.
>
>
Gente.. nuesta Convesación llegó a su fin, frown . Disfruté mucho aquí y recibí diversos elogios por los trabajos realizados a lo largo de 12 meses y, lo mejor de todo, hice muchas amistades y tomé muchos chopps gratis con los lectores que encontré por los congresos y charlas que ando haciendo por nuestro querido Brasíl. Lo que voy a escribir aquí no está arreglado ni sé si será publicado, pero como los editores de esta revista son dos locos hermosos (ambos Rafael), es posible que lo dejen pasar. Es lo siguiente: si quieren que el Papo de Botequin continue, llenen la caja postal de la Linux Magazine pidiendo esto y desde ya escoja el próximo tema entre sed + expresiones regulares o lenguaje awk.
  De cualquier forma, en caso de que no consigamos sensibilizar la dirección de la revista, me despido de todos mandando un abrazo a los barbudos y besos a las chicas y agradezco a los mas de 100 mails que recibí (todos elogiosos) y todos debidamente respondidos. A la salud de todos nosotros: Chin, chin

-Chico, cierra la cuenta que voy a cambiar de bar.

Changed:
<
<
Y no te olvides, cualquer duda o falta de compañia para tomar un chopp o hasta para hablar mal de los políticos lo único que tienes que hacer es mandarme un e-mail para julio.neves@gmail.com. Voy aprovechar tambiém para mandar mi aviso publicitario: puedes decirle a los amigos que quien quiera hacer un curso nota diez de programación en Shell que mande un e-mail para julio.neves@uniriotec.br para informarse.
>
>
Y no te olvides, cualquer duda o falta de compañia para tomar una cerveza o hasta para hablar mal de los políticos lo único que tienes que hacer es mandarme un e-mail para julio.neves@gmail.com. Voy aprovechar tambiém para mandar mi aviso publicitario: puedes decirle a los amigos que quien quiera hacer un curso nota diez de programación en Shell que mande un e-mail para julio.neves@uniriotec.br para informarse.
  Gracias y hasta la próxima!

Revision 1303 Feb 2008 - JulioNeves

Line: 1 to 1
Changed:
<
<

Conversa de Bar parte XI

>
>

Conversación de Bar parte XI

 


Revision 1217 Jan 2007 - JulioNeves

Line: 1 to 1
Changed:
<
<

Charla de Bar parte XI

>
>

Conversa de Bar parte XI

 


Line: 305 to 305
  Gracias y hasta la próxima!
Added:
>
>
-- DanielRefosco - 3 Jan 2007

Revision 1107 Jan 2007 - JulioNeves

Line: 1 to 1
 

Charla de Bar parte XI


Line: 188 to 188
 (browser)pidió. Este último ejemplo ,es fruto de una idea que intercambié con un amigo y maestro en Shell , Thobias Salazar Trevisan que escribió el script y lo colocó en su excelente URL.
Changed:
<
<
Aconsejo a todos que los que quieren aprender Shell que peguen una mirada (Dé una mirada e incluya en los favoritos).
>
>
Aconsejo a todos que los que quieren aprender Shell que peguen una mirada (Dé una mirada e incluya en los favoritos).
  Ahhh! Pensaste que el asunto sobre el named pipes estaba terminado? Estas engañado. Te voy a mostrar un uso diferente de él a seguir.

Revision 1004 Jan 2007 - Main.HumbertoPina

Line: 1 to 1
Changed:
<
<

Charla de Botiquín parte XI

>
>

Charla de Bar parte XI

 


Changed:
<
<
     - He como va viejo, todo bien?
>
>
     - Y ahí, como va amigo, todo bien?
 
Changed:
<
<
     - Chihe.. te acordas que me pediste que haga un programa que cuando el tamaño de la pantalla variase , en el centro apareciera dinamicamente, en video reverso la cantidad de líneas y columnas de la manera que el Linux hace normalmente?. Bueno hice , pero en la apariencia no quedó igual.
>
>
     - Más o menos.. te acuerdas que me pediste que haga un programa que cuando el tamaño de la pantalla variase , en el centro apareciese dinamicamente y en video reverso, la cantidad de líneas y columnas, de la misma forma que el Linux hace normalmente?. Bueno, lo hice , pero en la apariencia no quedó igual.
 
Changed:
<
<
     - No estoy ni ahì para la apariencia, lo que yo quería es que vos ejercitase lo que aprendimos. Dejame ver lo que hiciste.
>
>
     - No estoy preocupado por la apariencia, lo que yo quería es que tu ejercitases lo que aprendimos. Déjame ver lo que hiciste.
 
$ cat tamtela.sh #!/bin/bash #
Changed:
<
<
# Colocar en el centro del la pantalla, con video reverso,
>
>
# Colocar en el centro de la pantalla, con video reverso,
 # una cantidad de columnas y lineas # cuando el tamaño de la pantalla es alterado. # trap Muda 28 # 28 = señal generada por el cambio de tamaño # de la pantalla y Muda es la función que hace eso.
Changed:
<
<
Bold=$(tput bold) # Modo de enfase
>
>
Bold=$(tput bold) # Negrita, modo de énfasis
 Rev=$(tput rev) # Modo de video reverso Norm=$(tput sgr0) # Restaura la pantalla al valor de default
Line: 34 to 34
 }

clear

Changed:
<
<
read -n1 -p "Cambie eltamanio de la pantalla o teclee algo para terminar"
>
>
read -n1 -p "Cambie el tamaño de la pantalla o teclee algo para terminar"
 
Changed:
<
<
     - Perfecto ! , que se joda la apariencia , despues te enseño unos machetes para mejorar, lo que vale es el programa, está funcionando y esta todo optimizado.
>
>
     - Perfecto ! , que se embrome la apariencia , despues te enseño otras formas de mejorarlo, lo que vale es el programa, está funcionando y esta todo optimizado.
 
Changed:
<
<
     - Pucha perdí el mayor tiempo intentando descubrir como aumentar el tamaño de la fuente.- ...
>
>
     - Pero perdí el mayor tiempo intentando descubrir como aumentar el tamaño de la fuente.- ...
 
Changed:
<
<
     - Deja eso para otro día, hoy vamos a ver unas cosas bastante intersantes y utiles..
>
>
     - Deja eso para otro día, hoy vamos a ver unas cosas bastante interesantes y útiles..
 

Named Pipes

Changed:
<
<
Otro tipo de pipes es el "named pides", que tambien es llamdo por FIFO. FIFO es un acrónimo de First In First Out, que se refiere a la propiedad de que los bytes salen con el mismo orden que entran. El "name" en named pipe es en verdad el nombre de un archivo. Los archivos tipo named pipe son mostrados por el comando "ls" como cualquier otro, con pocas diferencias, mirá:
>
>
Otro tipo de pipes es el "named pipes", que también es llamado por FIFO. FIFO es un acrónimo de First In First Out, que se refiere a la propiedad de que los bytes salen con el mismo orden que entran. El "name" en named pipe es en verdad el nombre de un archivo. Los archivos tipo named pipe son mostrados por el comando "ls" como cualquier otro, con pocas diferencias, mira:
 
$ ls -l pipe1
Line: 61 to 61
 $ mkfifo pipe1
Changed:
<
<
Como siempre la mejor forma de mostrar que algo funciona es dando ejemplos. Suponga que hayamos creado el named pipe mostrado anteriormente. Vamos ahora a trabajar con dos seciones o dos consolas virtules o una de cada una. En una de ellas haga:
>
>
Como siempre la mejor forma de mostrar que algo funciona es dando ejemplos. Suponga que hayamos creado el named pipe mostrado anteriormente. Vamos ahora a trabajar con dos secciones o dos consolas virtuales o una de cada una. En una de ellas haga:
 
$ ls -l > pipe1
Line: 75 to 75
  Voilá! La salida del comando ejecutado en la primera consola fué exibida en la segunda. Note que el orden en que los comandos ocurrieron no importa.
Changed:
<
<
Si prestaste atención, viste que el primer comando ejecutado parecía estar "colgado". Esto sucede por que la otra punta del pipe todavía no estaba conectada, y enotonces el sistema operativo suspendió el primer procesa hasta que el segundo proceso "abriera" el pipe. Para que un processo que usa el _pipe no quede en modo wait, es necesario que en una punta del pipe tenga un proceso "que habla" y en el otro un proceso " que escuha" y en el ejemplo que dimos , el ls era el que hablaba y el cat era el que escuchaba.-
>
>
Si prestaste atención, viste que el primer comando ejecutado parecía estar "colgado". Esto sucede por que la otra punta del pipe todavía no estaba conectada, y entonces el sistema operativo suspendió el primer proceso hasta que el segundo proceso "abriera" el pipe. Para que un processo que usa el _pipe no quede en modo wait, es necesario que en una punta del pipe tenga un proceso "que habla" y en el otro un proceso " que escucha" y en el ejemplo que dimos , el ls era el que hablaba y el cat era el que escuchaba.-
 
Changed:
<
<
Una aplicacion muy util de los named pipes es permitir que programas sin ninguan relación se puedan comunicar entre si, los named pipes tambien son usados para sincronizar procesos, ya que en un determinado punto podes colocar un proceso para "escuchar" o "hablar" en un determinado named pipe y el de allí solo salirá, si otro proceso "habla" o "escucha" en aquel pipe.
>
>
Una aplicacion muy util de los named pipes es permitir que programas sin ninguna relación se puedan comunicar entre sí, los named pipes también son usados para sincronizar procesos, ya que en un determinado punto puedes colocar un proceso para "escuchar" o "hablar" en un determinado named pipe y él de allí solo saldrá, si otro proceso "habla" o "escucha" en aquel pipe.
  Viste que el uso de esta herramienta es ideal para sincronizar los procesos y para hacer bloqueo de archivos de forma de evitar
Changed:
<
<
perdida / corrupción de información devido a actualizaciones simultaneas ( concurrencia). Veamos ejemplos para ilustrar estos casos.
>
>
perdida / corrupción de información devido a actualizaciones simultáneas ( concurrencia). Veamos ejemplos para ilustrar estos casos.
 

Sincronización de procesos.

Changed:
<
<
Suponga que disparás paralelamente dos programas (procesos) cuyos diagramas de bloque de sus rutinas son como muestra la siguiente figura:
>
>
Suponga que disparas paralelamente dos programas (procesos) cuyos diagramas de bloque de sus rutinas son como muestra la siguiente figura:
 

Line: 107 to 107
  echo $Manda > pipe1 [ $Manda = pare ] && {
Changed:
<
<
echo Error durante a clasificacion de los archivos
>
>
echo Error durante la clasificación de los archivos
  exit 1 } ...
Changed:
<
<
Asi siendo, el comando if testeado cada clasificación que está siendo efectuada. En caso de que ocurra un problema, las clasificaciones siguientes serán abortadas, un mensaje conteniendo la cadena pare es enviada por el pipe1 y el programa1 es discontinuado con un fin anormal.
>
>
De esta forma, el comando if verifica cada clasificación que está siendo efectuada. En caso de que ocurra un problema, las clasificaciones siguientes serán abortadas, un mensaje conteniendo la cadena pare es enviada por el pipe1 y el programa1 es discontinuado con un fin anormal.
 
Changed:
<
<
En cuanto el Programa1 executava su primero bloque (las clasificaciones) el Programa2 ejecutaba su bloque BLOCO1, procesando sus rutinas de apertutay menu paralelamente al Programa1, ganando de esta forma un buen intervalo de tiempo.
>
>
En cuanto el Programa1 ejecutava su primero bloque (las clasificaciones) el Programa2 ejecutaba su bloque BLOCO1, procesando sus rutinas de abertuta y menú paralelamente al Programa1, ganando de esta forma un buen intervalo de tiempo.
  El fragmento del código del Programa2 que vemos a continuación, muestra la transición del BLOCO1 para el BLOCO2:
Line: 124 to 124
  if [ $OK = va ] then ...
Changed:
<
<
Rutina de impresiono
>
>
Rutina de impresión
  ...
Changed:
<
<
else # Recibi "pare" en OK
>
>
else # Recibí "pare" en OK
  exit 1 fi
Changed:
<
<
Despues de ejecución del primer blque , el Programa2 pasará a "escuchar" el pipe1, quedando parado hasta que las clasficaciones del Programa1 terminen, testando al seguir el mensaje pasado por el pipe1 para decidir si los archivos están íntegros para ser impresos , o si el programa debería ser discontinuado. De esta forma es posible disparar programas de forma asíncrona y sincrónica cuando es necesario ganando bastante tiempo de procesamiento.
>
>
Despues de la ejecución del primer bloque , el Programa2 pasará a "escuchar" el pipe1, quedando parado hasta que las clasficaciones del Programa1 terminen, testando al seguir el mensaje pasado por el pipe1 para decidir si los archivos están íntegros para ser impresos , o si el programa debería ser discontinuado. De esta forma es posible disparar programas de forma sincronizada y no sincronizada cuando es necesario, ganando bastante tiempo de procesamiento.
 

Bloqueo de archivos

Changed:
<
<
Suponé que escribis una CGI (Common Gateway Interface) en Shell para contar cuantos hits recibe una determinada UTL y la rutina de conteo es la siguiente:
>
>
Supón que escribes una CGI (Common Gateway Interface) en Shell para contar cuantos hits recibe una determinada URL y la rutina de contar es la siguiente:
 
    Hits="$(cat page.hits 2> /dev/null)" || Hits=0
    echo $((Hits=Hits++)) > page.hits
Changed:
<
<
De esa forma si la pagina recibe dos o mas accesos concurrentes, uno o mas podrá(n) perderse, basta que el segundo acceso sea hecho despues de una lectura del archivo page-hits y antes de su gravación, es decir, basta que el segundo acceso sea hecho despues de que el primero haya ejecutado la primer línea del _script_y antes de ejecutar la segunda.
>
>
De esa forma si la página recibe dos o mas accesos concurrentes, uno o mas podrá(n) perderse, basta que el segundo acceso sea hecho después de una lectura del archivo page-hits y antes de su grabación, es decir, basta que el segundo acceso sea hecho después de que el primero haya ejecutado la primer línea del _script_y antes de ejecutar la segunda.
 Entoces que hacemos? Para resolver el problema de concurrencia vamos a utilizar un named pipe. Creamos el siguiente scritp que será el daemon que recibirá la pagina en nuestro site que necesita de un contador.

Line: 149 to 149
 #!/bin/bash

PIPE="/tmp/pipe_contador" # archivo llamado pipe

Changed:
<
<
# dir donde seran colocados los archivos contadores de cada pagina
>
>
# dir donde serán colocados los archivos contadores de cada pagina
 DIR="/var/www/contador"

[ -p "$PIPE" ] || mkfifo "$PIPE"

Line: 159 to 159
  for URL in $(cat < $PIPE) do FILE="$DIR/$(echo $URL | sed 's,.*/,,')"
Changed:
<
<
# OBS1: no sed acima, como precisava procurar # uma barra,usamos vírgula como separador. # OBS2: quando rodar como daemon comente a proxima linha
>
>
# OBS1: en el sed arriba, como precisaba buscar # una barra,usamos coma como separador. # OBS2: cuando rodar como daemon comente la próxima línea
  echo "arquivo = $FILE"

n="$(cat $FILE 2> /dev/null)" || n=0

Line: 170 to 170
 done
Changed:
<
<
Como solo este script altera los archivos, no existe problema de concurrencia
>
>
Como solamente este script altera los archivos, no existe problema de concurrencia
 
Changed:
<
<
Este script será un daemon, esto es, corerá en background. Cuando una pagina sufre un acceso, ella escribirá su URL en el archivo del pipe. Para testear, ejecute este comando:
>
>
Este script será un daemon, esto es, correrá en background. Cuando una página sufre un acceso, el script escribirá su URL en el archivo del pipe. Para testar, ejecute este comando:
 
    echo "test_pagina.html" > /tmp/pipe_contador 
Changed:
<
<
Para evitar errores, en cada página que quisieramos adicionar el contado anexamos la siguiente linea:
>
>
Para evitar errores, en cada página que quisieramos agregar el contador anexamos la siguiente linea:
 
    <!--#exec cmd="echo $REQUEST_URI > /tmp/pipe_contador"-->

Note que la variable $REQUEST_URI contiene el nombre del archivo que el navegador

Changed:
<
<
(browser)requirió.
>
>
(browser)pidió.
 Este último ejemplo ,es fruto de una idea que intercambié con un amigo y maestro en Shell , Thobias Salazar Trevisan que escribió el script y lo colocó en su excelente URL.
Changed:
<
<
Aconsejo a todos que los que quieren aprender Shell que peguen una mirada (Dê una mirada e incluya en los favoritos).
>
>
Aconsejo a todos que los que quieren aprender Shell que peguen una mirada (Dé una mirada e incluya en los favoritos).
 
Changed:
<
<
Ahhh! Vos pensaste que el asunto sobre el named pipes estaba terminado? Estas engañado . Te voy a mostrar un uso diferente a partir de ahora.
>
>
Ahhh! Pensaste que el asunto sobre el named pipes estaba terminado? Estas engañado. Te voy a mostrar un uso diferente de él a seguir.
 

Substitución de procesos

Changed:
<
<
Terminé de mostrar un monton de recetas sobre named pipes . ahora voy a mostrar que el Shell también usa los named pipes de una manera bastante singular, que es la sustitución de procesos (process substitution).Una sustitución de procesos ocurre cuando pones un comando en un pipeline de comando entre parentesis y un < o un > grudado en el frente del parentesis en la izquierda. Por ejemplo, tecleando el comando:
>
>
Terminé de mostrar un montón de recetas sobre named pipes . Ahora voy a mostrar que el Shell también usa los named pipes de una manera bastante singular, que es la sustitución de procesos (process substitution).Una sustitución de procesos ocurre cuando pones un comando en un pipeline de comando entre paréntesis y un < o un > grudado en el frente del paréntesis en la izquierda. Por ejemplo, tecleando el comando:
 

$ cat <(ls -l)
Changed:
<
<
Resultará en el comando ls -l ejecutado en un subshell como es normal (por estar entre paréntisis), entonces redireccionará la salida a un named pipe temporario, que el Shell crea, usa y luego remueve. Entonces el cat tendrá un nombre de archivo válido para leer ( que será este named pipe y cuyo dispositivo lógico asociado es /dev/fd/63), y tendremos la misma salida que la generada por la del ls -l, pero dando uno o mas pasos que lo usual , y esto es mas oneroso para el computador.
>
>
Resultará en que el comando ls -l ejecutado en un subshell como es normal (por estar entre paréntisis), redireccionará la salida a un named pipe temporario, que el Shell crea, usa y luego remueve. Entonces el cat tendrá un nombre de archivo válido para leer (que será este named pipe y cuyo dispositivo lógico asociado es /dev/fd/63), y tendremos la misma salida que la generada por la del ls -l, pero dando uno o mas pasos que lo usual , y esto es mas costoso para el computador.
  Como podremos constatar esto? Facil .. Mirá el siguiente comando:
Line: 213 to 212
  Y... Realmente es un named pipe.
Changed:
<
<
Vos deves estar pensando que esto es una locura nerd , no? Entonces supongamos que tenes 2 directorios:
>
>
Tu deves estar pensando que esto es una locura nerd , no? Entonces supongamos que tenes 2 directorios:
 dir e dir.bkp , y deseas saber si los dos son iguales ( aquella vieja duda: será que mi backup está actualizado? ). Basta comparar los dos archivos de los directorios con el comando cmp, haciendo:

Changed:
<
<
$ cmp <(cat dir/*) <(cat dir.bkp/*) || echo backup furado
>
>
$ cmp <(cat dir/*) <(cat dir.bkp/*) || echo backup desactualizado!
 

o, mejor tovavía:

Changed:
<
<
$ cmp <(cat dir/*) <(cat dir.bkp/*) >/dev/null || echo backup furado
>
>
$ cmp <(cat dir/*) <(cat dir.bkp/*) >/dev/null || echo backup desactualizado!
 
Changed:
<
<
De la forma ultima la comparacion fué efectuada en todas las lineas de todos los archivos de ambos directorios. Para acelerar el proceso, podríamos compara solamente el listado largo de ambos de los directorios, pues cualquier modificación que un archivo sufra, es mostrado en alteración de la data/hora y/o del tamaño del archivo.
>
>
De la última forma,la comparación fué efectuada en todas las líneas de todos los archivos de ambos directorios. Para acelerar el proceso, podríamos comparar solamente el listado largo de ambos de los directorios, pues cualquier modificación que un archivo sufra, es mostrado como alteración de la data/hora y/o del tamaño del archivo.
 Mirá como quedaría:

Changed:
<
<
$ cmp <(ls -l dir) <(ls -l dir.bkp) >/dev/null || echo backup furado
>
>
$ cmp <(ls -l dir) <(ls -l dir.bkp) >/dev/null || echo backup desactualizado!
 
Changed:
<
<
Este es un ejemplo meramente didactico, pero son tantos los comando que producen mas de una línea de salida que sirve como guia para otros. Quiero generar una lunsta de mis archivos, numerados y al final dar el total de archivos del directorio actual:
>
>
Este es un ejemplo meramente didáctico, pues son tantos los comando que producen mas de una línea de salida que sirve como guia para otros. Quiero generar una lista de mis archivos, numerados y al final dar el total de archivos del directorio actual:
 
    while read arq
    do
Changed:
<
<
((i++)) # assim nao eh necessario inicializar i
>
>
((i++)) # así no es necesario inicializar i
  echo "$i: $arq" done < <(ls)
Changed:
<
<
echo "No diretorio corrente (`pwd`) existem $i arquivos"
>
>
echo "En el directório corriente (`pwd`) existen $i archivos"
 
Changed:
<
<
Está bien, yo se que existen otras formas de ejecutar la misma tarea. Usando el comando while. la forma mas común de resolver este problema sería:
>
>
Está bien, yo sé que existen otras formas de ejecutar la misma tarea. Usando el comando while. La forma mas común de resolver este problema sería:
 
    ls | while read arq
    do
Changed:
<
<
((i++)) # assim nao eh necessario inicializar i
>
>
((i++)) # así no es necesario inicializar i
  echo "$i: $arq" done
Changed:
<
<
echo "No diretorio corrente (`pwd`) existem $i arquivos"
>
>
echo "En el directório corriente (`pwd`) existen $i archivos"
 
Changed:
<
<
Cuando ejecutase el script, parecería que esta todo ok, pero el comando echo despuesd del none. vas a ver que el valor de $i fué perdido.Esto se debe al hecho de que esta variable esta siendo incrementada en un subshell creado por el pipe (|) y que termina con el comando done. llevandose con el todas las variables creadas en su interior y las alteraciones hechas en todas la variables, inclusive las creadas externamente. Solamente para mostrate que una variable creada fuera del subshell es alterada en su interior pierde las alteraciones hechas al final, ejecutá el script siguiente:
>
>
Cuando ejecutase el script, parecería que esta todo ok, sin embargo en el comando echo después del none, vas a ver que el valor de $i fué perdido. Esto se debe al hecho de que esta variable esta siendo incrementada en un subshell creado por el pipe (|) y que termina con el comando done, llevándose con él todas las variables creadas en su interior y las alteraciones hechas en todas la variables, inclusive las creadas externamente. Solamente para mostrarte que una variable creada fuera del subshell y alterada en su interior, pierde las alteraciones hechas al final, ejecuta el script siguiente:
 
    #!/bin/bash
Changed:
<
<
LIST="" # Criada no shell principal ls | while read FILE # Inicio do subshell
>
>
LIST="" # Creada en el shell principal ls | while read FILE # Inicio del subshell
  do
Changed:
<
<
LIST="$FILE $LIST" # Alterada dentro do subshell done # Fim do subshell
>
>
LIST="$FILE $LIST" # Alterada dentro del subshell done # Fin del subshell
  echo :$LIST:
Changed:
<
<
Al final de la ejecución vas a ver que aparecerán apenas dos puntos (::). Pero en el inicio de este ejemplo te dije que era meramente didáctico por que existen formas mejores de hacer la misma tarea. Mirá estas dos:
>
>
Al final de la ejecución vas a ver que aparecerán apenas dos puntos (::). Pero en el inicio de este ejemplo te dije que era meramente didáctico, ya que existen formas mejores de hacer la misma tarea. Mira estas dos:
 
$ ls | ln
Line: 279 to 278
 $ cat -n <(ls)
Changed:
<
<
Un última ejemlo: vos deseas comparar arq1 e arq2 usando el comando comm, pero este comando necesita que los archivos estén clasificados. Entonces la mejor forma de procedes es:
>
>
Un último ejemlo: tu deseas comparar arq1 y arq2 usando el comando comm, pero este comando necesita que los archivos estén clasificados. Entonces la mejor forma de proceder es:
 
$ comm <(sort arq1) <(sort arq2)
Changed:
<
<
Esta forma evita que vos tengas que hacer las siguientes operaciones:
>
>
Esta forma evita que tengas que hacer las siguientes operaciones:
 
$ sort arq1 > /tmp/sort1
Line: 294 to 293
 $ rm -f /tmp/sort1 /tmp/sort2
Changed:
<
<
Gente.. nuesta Convesación llegó al fín, frown . Curtí mucho aquí y recibí diversos elogios por los trabajos realizados a lo largo de 12 meses y, lo mejor de todo, hice muchas amistades y tomé muchos chops de arriba con los lectores que encotré por los congresos y charlas que ando haciendo por nuestro querido Brasíl. Lo que voy a escribir aquí no está arreglado ni sé si será publicado, pero como los editores de esta revista son dos locos hermosos (ambos Rafael), es capaz que lo dejen pasar. Es lo siguiente: si quieren que el Papo de Botequin continue, enthulhem la caja postal de la Linux Magazine pidiendo por esto y desde ya escoja el proximo tema entre sed + expresiones regulres o lenguajes =awk.
>
>
Gente.. nuesta Convesación llegó al fin, frown . Disfruté mucho aquí y recibí diversos elogios por los trabajos realizados a lo largo de 12 meses y, lo mejor de todo, hice muchas amistades y tomé muchos chopps gratis con los lectores que encontré por los congresos y charlas que ando haciendo por nuestro querido Brasíl. Lo que voy a escribir aquí no está arreglado ni sé si será publicado, pero como los editores de esta revista son dos locos hermosos (ambos Rafael), es capaz que lo dejen pasar. Es lo siguiente: si quieren que el Papo de Botequin continue, llenen la caja postal de la Linux Magazine pidiendo esto y desde ya escoja el próximo tema entre sed + expresiones regulares o lenguaje =awk.
 
Changed:
<
<
De cualquier forma, en caso de que no consigamos sencibilizar la dirección de la revista, me despido de todos mandando un abrazo a los barbudos y besos a las chicas y agradezco a los mas de 100 mails que recibí (todos elogiosos) y todos debidamente respondidos.
>
>
De cualquier forma, en caso de que no consigamos sensibilizar la dirección de la revista, me despido de todos mandando un abrazo a los barbudos y besos a las chicas y agradezco a los mas de 100 mails que recibí (todos elogiosos) y todos debidamente respondidos.
 A la salud de todos nosotros: Chin, chin
Changed:
<
<
-Muchacho , cerra la cuenta que voy a cambiar de botiquin . No se olvide, cualquier duda o falta de compañia para un chop o hasta para hablar mal de los politicos es solo mandar un mail para julio.neves@gmail.com. Voy a aprovechar también para mandar mi jabá:decile a los amigos que quien esté con ganas de hacer un curso porreta de programación en Shell que mande un mail a julio.neves@uniriotec.br para informarse
>
>
-Chico, cierra la cuenta que voy a cambiar de bar.

Y no te olvides, cualquer duda o falta de compañia para tomar un chopp o hasta para hablar mal de los políticos lo único que tienes que hacer es mandarme un e-mail para julio.neves@gmail.com. Voy aprovechar tambiém para mandar mi aviso publicitario: puedes decirle a los amigos que quien quiera hacer un curso nota diez de programación en Shell que mande un e-mail para julio.neves@uniriotec.br para informarse.

Gracias y hasta la próxima!

 
Deleted:
<
<
Valió !!

Revision 924 Dec 2006 - DanielRefosco

Line: 1 to 1
 

Charla de Botiquín parte XI


Line: 107 to 107
  echo $Manda > pipe1 [ $Manda = pare ] && {
Changed:
<
<
echo Error durante a clasificion de los archivos
>
>
echo Error durante a clasificacion de los archivos
  exit 1 } ...
Line: 115 to 115
  Asi siendo, el comando if testeado cada clasificación que está siendo efectuada. En caso de que ocurra un problema, las clasificaciones siguientes serán abortadas, un mensaje conteniendo la cadena pare es enviada por el pipe1 y el programa1 es discontinuado con un fin anormal.
Changed:
<
<
En cuanto el Programa1 executava o seu primeiro bloco (as classificações) o Programa2 executava o seu BLOCO1, processando as suas rotinas de abertura e menu paralelamente ao Programa1, ganhando desta forma um bom intervalo de tempo.
>
>
En cuanto el Programa1 executava su primero bloque (las clasificaciones) el Programa2 ejecutaba su bloque BLOCO1, procesando sus rutinas de apertutay menu paralelamente al Programa1, ganando de esta forma un buen intervalo de tiempo.
 
Changed:
<
<
El fragmento del código del Programa2 que vemos a continución, muestra la transición del BLOCO1 para el BLOCO2:
>
>
El fragmento del código del Programa2 que vemos a continuación, muestra la transición del BLOCO1 para el BLOCO2:
 
    OK=`cat pipe1`
Line: 178 to 178
  echo "test_pagina.html" > /tmp/pipe_contador
Changed:
<
<
Para evitar errores, en cada página que quisieramos adicionar el contado anexamos la siguiente liña:
>
>
Para evitar errores, en cada página que quisieramos adicionar el contado anexamos la siguiente linea:
 
    <!--#exec cmd="echo $REQUEST_URI > /tmp/pipe_contador"-->
Line: 186 to 186
  Note que la variable $REQUEST_URI contiene el nombre del archivo que el navegador (browser)requirió.
Changed:
<
<
Este último ejemlpo ,es fruto de una idea que intercambié con un amigo y maestro en Shell
>
>
Este último ejemplo ,es fruto de una idea que intercambié con un amigo y maestro en Shell
 , Thobias Salazar Trevisan que escribió el script y lo colocó en su excelente URL. Aconsejo a todos que los que quieren aprender Shell que peguen una mirada (Dê una mirada e incluya en los favoritos).
Line: 195 to 195
 

Substitución de procesos

Changed:
<
<
Terminé de mostrar un monton de recetas sobre named pipes . ahora voy a mostrar que el Shell también usa los named pipes de una manera bastante singular, que es la sustitución de procesos (process substitution).Una sustitución de procesos ocurre cuando pones un comando en un pipeline de comando entre parentesis y un < o un > ?¿?¿ grudado en el frente del parentesis en la izquierda. Por ejemplo, tecleando el comando:
>
>
Terminé de mostrar un monton de recetas sobre named pipes . ahora voy a mostrar que el Shell también usa los named pipes de una manera bastante singular, que es la sustitución de procesos (process substitution).Una sustitución de procesos ocurre cuando pones un comando en un pipeline de comando entre parentesis y un < o un > grudado en el frente del parentesis en la izquierda. Por ejemplo, tecleando el comando:
 

$ cat <(ls -l)
Changed:
<
<
Resultará no comando ls -l executado em um subshell como é normal (por estar entre parênteses), porém redirecionará a saída para um named pipe temporário, que o Shell cria, nomeia e depois remove. Então o cat terá um nome de arquivo válido para ler (que será este named pipe e cujo dispositivo lógico associado é /dev/fd/63), e teremos a mesma saída que a gerada pela listagem do ls -l, porém dando um ou mais passos que o usual, isto é, mais onerosa para o computador.
>
>
Resultará en el comando ls -l ejecutado en un subshell como es normal (por estar entre paréntisis), entonces redireccionará la salida a un named pipe temporario, que el Shell crea, usa y luego remueve. Entonces el cat tendrá un nombre de archivo válido para leer ( que será este named pipe y cuyo dispositivo lógico asociado es /dev/fd/63), y tendremos la misma salida que la generada por la del ls -l, pero dando uno o mas pasos que lo usual , y esto es mas oneroso para el computador.
 
Changed:
<
<
Como poderemos constatar isso? Fácil... Veja o comando a seguir:
>
>
Como podremos constatar esto? Facil .. Mirá el siguiente comando:
 
$ ls -l >(cat) l-wx------ 1 jneves jneves 64 Aug 27 12:26 /dev/fd/63 -> pipe:[7050]
Changed:
<
<
É... Realmente é um named pipe.
>
>
Y... Realmente es un named pipe.
 
Changed:
<
<
Você deve estar pensando que isto é uma maluquice de nerd, né? Então suponha que você tenha 2 diretórios: dir e dir.bkp e deseja saber se os dois estão iguais (aquela velha dúvida: será que meu backup está atualizado?). Basta comparar os dados dos arquivos dos diretórios com o comando cmp, fazendo:
>
>
Vos deves estar pensando que esto es una locura nerd , no? Entonces supongamos que tenes 2 directorios: dir e dir.bkp , y deseas saber si los dos son iguales ( aquella vieja duda: será que mi backup está actualizado? ). Basta comparar los dos archivos de los directorios con el comando cmp, haciendo:
 
$ cmp <(cat dir/*) <(cat dir.bkp/*) || echo backup furado
Changed:
<
<
ou, melhor ainda:
>
>
o, mejor tovavía:
 
$ cmp <(cat dir/*) <(cat dir.bkp/*) >/dev/null || echo backup furado
Changed:
<
<
Da forma acima, a comparação foi efetuada em todas as linhas de todos os arquivos de ambos os diretórios. Para acelerar o processo, poderíamos compara somente a listagem longa de ambos os diretórios, pois qualquer modificação que um arquivo sofra, é mostrada na data/hora de alteração e/ou no tamanho do arquivo. Veja como ficaria:
>
>
De la forma ultima la comparacion fué efectuada en todas las lineas de todos los archivos de ambos directorios. Para acelerar el proceso, podríamos compara solamente el listado largo de ambos de los directorios, pues cualquier modificación que un archivo sufra, es mostrado en alteración de la data/hora y/o del tamaño del archivo. Mirá como quedaría:
 
$ cmp <(ls -l dir) <(ls -l dir.bkp) >/dev/null || echo backup furado
Changed:
<
<
Este é um exemplo meramente didático, mas são tantos os comandos que produzem mais de uma linha de saída, que serve como guia para outros. Eu quero gerar uma listagem dos meus arquivos, numerando-os e ao final dar o total de arquivos do diretório corrente:
>
>
Este es un ejemplo meramente didactico, pero son tantos los comando que producen mas de una línea de salida que sirve como guia para otros. Quiero generar una lunsta de mis archivos, numerados y al final dar el total de archivos del directorio actual:
 
    while read arq
Line: 242 to 244
  echo "No diretorio corrente (`pwd`) existem $i arquivos"
Changed:
<
<
Tá legal, eu sei que existem outras formas de executar a mesma tarefa. Usando o comando while, a forma mais comum de resolver esse problema seria:
>
>
Está bien, yo se que existen otras formas de ejecutar la misma tarea. Usando el comando while. la forma mas común de resolver este problema sería:
 
    ls | while read arq
    do
Line: 253 to 254
  echo "No diretorio corrente (`pwd`) existem $i arquivos"
Changed:
<
<
Quando executasse o script, pareceria estar tudo certo, porém no comando echo após o done, você verá que o valor de $i foi perdido. Isso deve-se ao fato desta variável estar sendo incrementada em um subshell criado pelo pipe (|) e que terminou no comando done, levando com ele todas as variáveis criadas no seu interior e as alterações feitas em todas as variáveis, inclusive as criadas externamente.

Somente para te mostrar que uma variável criada fora do subshell e alterada em seu interior perde as alterações feitas ao seu final, execute o script a seguir:

>
>
Cuando ejecutase el script, parecería que esta todo ok, pero el comando echo despuesd del none. vas a ver que el valor de $i fué perdido.Esto se debe al hecho de que esta variable esta siendo incrementada en un subshell creado por el pipe (|) y que termina con el comando done. llevandose con el todas las variables creadas en su interior y las alteraciones hechas en todas la variables, inclusive las creadas externamente. Solamente para mostrate que una variable creada fuera del subshell es alterada en su interior pierde las alteraciones hechas al final, ejecutá el script siguiente:
 
    #!/bin/bash
Line: 267 to 267
  echo :$LIST:
Changed:
<
<
Ao final da execução você verá que aperecerão apenas dois dois-pontos (::). Mas no início deste exemplo eu disse que era meramente didático porque existem formas melhores de fazer a mesma tarefa. Veja só estas duas:
>
>
Al final de la ejecución vas a ver que aparecerán apenas dos puntos (::). Pero en el inicio de este ejemplo te dije que era meramente didáctico por que existen formas mejores de hacer la misma tarea. Mirá estas dos:
 
$ ls | ln
Changed:
<
<
ou então, usando a própria substituição de processos:
>
>
o entonces ,usando la propia substitución de procesos:
 
$ cat -n <(ls)
Changed:
<
<
Um último exemplo: você deseja comparar arq1 e arq2 usando o comando comm, mas este comando necessita que os arquivos estejam classificados. Então a melhor forma de proceder é:
>
>
Un última ejemlo: vos deseas comparar arq1 e arq2 usando el comando comm, pero este comando necesita que los archivos estén clasificados. Entonces la mejor forma de procedes es:
 
$ comm <(sort arq1) <(sort arq2)
Changed:
<
<
Esta forma evita que você faça as seguintes operações:
>
>
Esta forma evita que vos tengas que hacer las siguientes operaciones:
 
$ sort arq1 > /tmp/sort1
Line: 294 to 294
 $ rm -f /tmp/sort1 /tmp/sort2
Changed:
<
<
Pessoal, o nosso Papo de Botequim chegou ao fim frown . Curti muito aqui e recebi diversos elogios pelo trabalho desenvolvido ao longo de doze meses e, o melhor de tudo, fiz muitas amizades e tomei muitos chopes de graça com os leitores que encontrei pelos congressos e palestras que ando fazendo pelo nosso querido Brasil.

O que vou escrever aqui não está combinado nem sei se será publicado, mas como os editores desta revista são dois malucos beleza (ambos Rafael), é bem capaz de deixarem passar. É o seguinte: se quiserem que o Papo de Botequim continue, entulhem a caixa postal da Linux Magazine pedindo por isso e desde já escolham o próximo tema entre sed + expressões regulares ou linguagem awk.

De qualquer forma, caso não consigamos sensibilizar a direção da revista, me despeço de todos mandando um grande abraço aos barbudos e beijos às meninas e agradeçendo os mais de 100 e-mails que recebi (todos elogiosos) e todos devidamente respondidos.

À saúde de todos nós: Tim, Tim.

>
>
Gente.. nuesta Convesación llegó al fín, frown . Curtí mucho aquí y recibí diversos elogios por los trabajos realizados a lo largo de 12 meses y, lo mejor de todo, hice muchas amistades y tomé muchos chops de arriba con los lectores que encotré por los congresos y charlas que ando haciendo por nuestro querido Brasíl. Lo que voy a escribir aquí no está arreglado ni sé si será publicado, pero como los editores de esta revista son dos locos hermosos (ambos Rafael), es capaz que lo dejen pasar. Es lo siguiente: si quieren que el Papo de Botequin continue, enthulhem la caja postal de la Linux Magazine pidiendo por esto y desde ya escoja el proximo tema entre sed + expresiones regulres o lenguajes =awk.
 
Changed:
<
<
- Chico, fecha a minha conta porque vou mudar de botequim.
>
>
De cualquier forma, en caso de que no consigamos sencibilizar la dirección de la revista, me despido de todos mandando un abrazo a los barbudos y besos a las chicas y agradezco a los mas de 100 mails que recibí (todos elogiosos) y todos debidamente respondidos. A la salud de todos nosotros: Chin, chin
 
Changed:
<
<
Não se esqueça, qualquer dúvida ou falta de companhia para um chope ou até para falar mal dos políticos é só mandar um e-mail para julio.neves@gmail.com. Vou aproveitar também para mandar o meu jabá: diga para os amigos que quem estiver afim de fazer um curso porreta de programação em Shell que mande um e-mail para julio.neves@uniriotec.br para informar-se.
>
>
-Muchacho , cerra la cuenta que voy a cambiar de botiquin . No se olvide, cualquier duda o falta de compañia para un chop o hasta para hablar mal de los politicos es solo mandar un mail para julio.neves@gmail.com. Voy a aprovechar también para mandar mi jabá:decile a los amigos que quien esté con ganas de hacer un curso porreta de programación en Shell que mande un mail a julio.neves@uniriotec.br para informarse
 
Changed:
<
<
Valeu!
>
>
Valió !!

Revision 813 Dec 2006 - DanielRefosco

Line: 1 to 1
 

Charla de Botiquín parte XI


Line: 170 to 170
 done
Changed:
<
<
Commo solo este script altera los archivos, no existe problema de concurrencia
>
>
Como solo este script altera los archivos, no existe problema de concurrencia
 
Changed:
<
<
Este script será um daemon, isto é, rodará em background. Quando uma página sofrer um acesso, ela escreverá a sua URL no arquivo de pipe. Para testar, execute este comando:
>
>
Este script será un daemon, esto es, corerá en background. Cuando una pagina sufre un acceso, ella escribirá su URL en el archivo del pipe. Para testear, ejecute este comando:
 
Changed:
<
<
echo "teste_pagina.html" > /tmp/pipe_contador
>
>
echo "test_pagina.html" > /tmp/pipe_contador
 
Changed:
<
<
Para evitar erros, em cada página que quisermos adicionar o contador acrescentamos a seguinte linha:
>
>
Para evitar errores, en cada página que quisieramos adicionar el contado anexamos la siguiente liña:
 
    <!--#exec cmd="echo $REQUEST_URI > /tmp/pipe_contador"-->
Changed:
<
<
Note que a variável $REQUEST_URI contém o nome do arquivo que o navegador (browser) requisitou.
>
>
Note que la variable $REQUEST_URI contiene el nombre del archivo que el navegador (browser)requirió. Este último ejemlpo ,es fruto de una idea que intercambié con un amigo y maestro en Shell , Thobias Salazar Trevisan que escribió el script y lo colocó en su excelente URL. Aconsejo a todos que los que quieren aprender Shell que peguen una mirada (Dê una mirada e incluya en los favoritos).
 
Changed:
<
<
Este último exemplo, é fruto de uma idéia que troquei com o amigo e mestre em Shell, Thobias Salazar Trevisan que escreveu o script e colocou-o em sua excelente URL. Aconselho a todos que querem aprender Shell a dar uma olhada nela (Dê uma olhada e inclua-a nos favoritos).
>
>
Ahhh! Vos pensaste que el asunto sobre el named pipes estaba terminado? Estas engañado . Te voy a mostrar un uso diferente a partir de ahora.
 
Changed:
<
<
Ahhh! Você pensa que o assunto sobre named pipes está esgotado? Enganou-se. Vou mostrar um uso diferente a partir de agora.
>
>

Substitución de procesos

 
Changed:
<
<

Substituição de processos

>
>
Terminé de mostrar un monton de recetas sobre named pipes . ahora voy a mostrar que el Shell también usa los named pipes de una manera bastante singular, que es la sustitución de procesos (process substitution).Una sustitución de procesos ocurre cuando pones un comando en un pipeline de comando entre parentesis y un < o un > ?¿?¿ grudado en el frente del parentesis en la izquierda. Por ejemplo, tecleando el comando:
 
Deleted:
<
<
Acabei de mostrar um monte de dicas sobre named pipes, agora vou mostrar que o Shell também usa os named pipes de uma maneira bastante singular, que é a substituição de processos (process substitution). Uma substituição de processos ocorre quando você põe um comando ou um pipeline de comandos entre parênteses e um < ou um > grudado na frente do parêntese da esquerda. Por exemplo, teclando-se o comando:
 
$ cat <(ls -l)

Revision 712 Dec 2006 - DanielRefosco

Line: 1 to 1
 

Charla de Botiquín parte XI


Line: 148 to 148
 $ cat contahits.sh #!/bin/bash

Changed:
<
<
PIPE="/tmp/pipe_contador" # arquivo named pipe # dir onde serao colocados os arquivos contadores de cada pagina
>
>
PIPE="/tmp/pipe_contador" # archivo llamado pipe # dir donde seran colocados los archivos contadores de cada pagina
 DIR="/var/www/contador"

[ -p "$PIPE" ] || mkfifo "$PIPE"

Line: 170 to 170
 done
Changed:
<
<
Como só este script altera os arquivos, não existe problema de concorrência.
>
>
Commo solo este script altera los archivos, no existe problema de concurrencia
  Este script será um daemon, isto é, rodará em background. Quando uma página sofrer um acesso, ela escreverá a sua URL no arquivo de pipe. Para testar, execute este comando:

Revision 603 Dec 2006 - DanielRefosco

Line: 1 to 1
Changed:
<
<

Papo de botequim parte XI

>
>

Charla de Botiquín parte XI

 


Line: 133 to 133
  Despues de ejecución del primer blque , el Programa2 pasará a "escuchar" el pipe1, quedando parado hasta que las clasficaciones del Programa1 terminen, testando al seguir el mensaje pasado por el pipe1 para decidir si los archivos están íntegros para ser impresos , o si el programa debería ser discontinuado. De esta forma es posible disparar programas de forma asíncrona y sincrónica cuando es necesario ganando bastante tiempo de procesamiento.
Changed:
<
<

Bloqueio de arquivos

Suponha que você escreveu uma CGI (Common Gateway Interface) em Shell para contar quantos hits recebe uma determinada URL e a rotina de contagem está da seguinte maneira:

>
>

Bloqueo de archivos

Suponé que escribis una CGI (Common Gateway Interface) en Shell para contar cuantos hits recibe una determinada UTL y la rutina de conteo es la siguiente:
 
    Hits="$(cat page.hits 2> /dev/null)" || Hits=0
    echo $((Hits=Hits++)) > page.hits
Changed:
<
<
Desta forma se a página receber dois ou mais acessos concorrentes, um ou mais poderá(ão) ser perdido(s), basta que o segundo acesso seja feito após a leitura da arquivo page.hits e antes da sua gravação, isto é, basta que o segundo acesso seja feito após o primeiro ter executado a primeira linha do script e antes de executar a segunda.

Então o que fazer? Para resolver o problema de concorrência vamos utilizar um named pipe. Criamos o seguinte script que será o daemon que receberá todos os pedidos para incrementar o contador. Note que ele vai ser usado por qualquer página no nosso site que precise de um contador.

>
>
De esa forma si la pagina recibe dos o mas accesos concurrentes, uno o mas podrá(n) perderse, basta que el segundo acceso sea hecho despues de una lectura del archivo page-hits y antes de su gravación, es decir, basta que el segundo acceso sea hecho despues de que el primero haya ejecutado la primer línea del _script_y antes de ejecutar la segunda. Entoces que hacemos? Para resolver el problema de concurrencia vamos a utilizar un named pipe. Creamos el siguiente scritp que será el daemon que recibirá la pagina en nuestro site que necesita de un contador.
 
$ cat contahits.sh

Revision 528 Nov 2006 - DanielRefosco

Line: 1 to 1
 

Papo de botequim parte XI


Line: 117 to 117
  En cuanto el Programa1 executava o seu primeiro bloco (as classificações) o Programa2 executava o seu BLOCO1, processando as suas rotinas de abertura e menu paralelamente ao Programa1, ganhando desta forma um bom intervalo de tempo.
Changed:
<
<
O fragmento de código do Programa2 a seguir, mostra a transição do seu BLOCO1 para o BLOCO2:
>
>
El fragmento del código del Programa2 que vemos a continución, muestra la transición del BLOCO1 para el BLOCO2:
 
    OK=`cat pipe1`
    if  [ $OK = va ]
    then
        ...
Changed:
<
<
Rotina de impressão
>
>
Rutina de impresiono
  ...
Changed:
<
<
else # Recebeu "pare" em OK
>
>
else # Recibi "pare" en OK
  exit 1 fi
Changed:
<
<
Após a execução de seu primeiro bloco, o Programa2 passará a "ouvir" o pipe1, ficando parado até que as classificações do Programa1 terminem, testando a seguir a mensagem passada pelo pipe1 para decidir se os arquivos estão íntegros para serem impressos, ou se o programa deverá ser descontinuado. Desta forma é possível disparar programas de forma assíncrona e sincronizá-los quando necessário, ganhando bastante tempo de processamento.
>
>
Despues de ejecución del primer blque , el Programa2 pasará a "escuchar" el pipe1, quedando parado hasta que las clasficaciones del Programa1 terminen, testando al seguir el mensaje pasado por el pipe1 para decidir si los archivos están íntegros para ser impresos , o si el programa debería ser discontinuado. De esta forma es posible disparar programas de forma asíncrona y sincrónica cuando es necesario ganando bastante tiempo de procesamiento.
 

Bloqueio de arquivos

Revision 425 Nov 2006 - DanielRefosco

Line: 1 to 1
 

Papo de botequim parte XI


Line: 37 to 37
 read -n1 -p "Cambie eltamanio de la pantalla o teclee algo para terminar"
Changed:
<
<
     - Perfecto ! , que se joda la apariencia , despues te enseño unos machetes para mejorar, lo que vale es el programa, está funcionando y esta todo en enxuto***???***.
>
>
     - Perfecto ! , que se joda la apariencia , despues te enseño unos machetes para mejorar, lo que vale es el programa, está funcionando y esta todo optimizado.
       - Pucha perdí el mayor tiempo intentando descubrir como aumentar el tamaño de la fuente.- ...
Line: 84 to 84
 

Sincronización de procesos.

Changed:
<
<
Suponha que você dispare paralelamente dois programas (processos) cujos diagramas de blocos de suas rotinas são como a figura a seguir:
>
>
Suponga que disparás paralelamente dos programas (procesos) cuyos diagramas de bloque de sus rutinas son como muestra la siguiente figura:
 
Changed:
<
<
Gráfico do Named Pipe
>
>
Gráfico del Named Pipe
 
Changed:
<
<
Os dois processos são disparados em paralelo e no BLOCO1 do Programa1 as três classificações são disparadas da seguinte maneira:
>
>
Los dos procesos son disparados en paralelo y en el BLOCO1 del Programa1 las tres clasificaciones son disparadas de la siguiente manera:
 
    for Arq in BigFile1 BigFile2 BigFile3
Line: 106 to 107
  echo $Manda > pipe1 [ $Manda = pare ] && {
Changed:
<
<
echo Erro durante a classificação dos arquivos
>
>
echo Error durante a clasificion de los archivos
  exit 1 } ...
Changed:
<
<
Assim sendo, o comando if testa cada classificação que está sendo efetuada. Caso ocorra qualquer problema, as classificações seguintes serão abortadas, uma mensagem contendo a cadeia pare é enviada pelo pipe1 e programa1 é descontinuado com um fim anormal.
>
>
Asi siendo, el comando if testeado cada clasificación que está siendo efectuada. En caso de que ocurra un problema, las clasificaciones siguientes serán abortadas, un mensaje conteniendo la cadena pare es enviada por el pipe1 y el programa1 es discontinuado con un fin anormal.
 
Changed:
<
<
Enquanto o Programa1 executava o seu primeiro bloco (as classificações) o Programa2 executava o seu BLOCO1, processando as suas rotinas de abertura e menu paralelamente ao Programa1, ganhando desta forma um bom intervalo de tempo.
>
>
En cuanto el Programa1 executava o seu primeiro bloco (as classificações) o Programa2 executava o seu BLOCO1, processando as suas rotinas de abertura e menu paralelamente ao Programa1, ganhando desta forma um bom intervalo de tempo.
  O fragmento de código do Programa2 a seguir, mostra a transição do seu BLOCO1 para o BLOCO2:

Revision 323 Nov 2006 - DanielRefosco

Line: 1 to 1
 

Papo de botequim parte XI



     - He como va viejo, todo bien?
Changed:
<
<
     - Chihe.. te acordas que me pediste que haga un programa que cuando el tamaño de la pantalla variase , en el centro apaeciera dinamicamente, en video reverso la cantidad de líneas y columnas de la manera que el Linux hace normnalmente?. Bueno hice , pero en la apariencia no quedó igual.
>
>
     - Chihe.. te acordas que me pediste que haga un programa que cuando el tamaño de la pantalla variase , en el centro apareciera dinamicamente, en video reverso la cantidad de líneas y columnas de la manera que el Linux hace normalmente?. Bueno hice , pero en la apariencia no quedó igual.
       - No estoy ni ahì para la apariencia, lo que yo quería es que vos ejercitase lo que aprendimos. Dejame ver lo que hiciste.
Line: 79 to 79
  Una aplicacion muy util de los named pipes es permitir que programas sin ninguan relación se puedan comunicar entre si, los named pipes tambien son usados para sincronizar procesos, ya que en un determinado punto podes colocar un proceso para "escuchar" o "hablar" en un determinado named pipe y el de allí solo salirá, si otro proceso "habla" o "escucha" en aquel pipe.
Changed:
<
<

>foca
>
>
Viste que el uso de esta herramienta es ideal para sincronizar los procesos y para hacer bloqueo de archivos de forma de evitar perdida / corrupción de información devido a actualizaciones simultaneas ( concurrencia). Veamos ejemplos para ilustrar estos casos.
 
Changed:
<
<
Você já viu que o uso desta ferramenta é ótimo para sincronizar processos e para fazer bloqueio em arquivos de forma a evitar perda/corrupção de informações devido a atualizações simultâneas (concorrência). Vejamos exemplos para ilustrar estes casos.

Sincronização de processos.

>
>

Sincronización de procesos.

  Suponha que você dispare paralelamente dois programas (processos) cujos diagramas de blocos de suas rotinas são como a figura a seguir:

Revision 221 Nov 2006 - DanielRefosco

Line: 1 to 1
Changed:
<
<

Título deste tópico


>
>

Papo de botequim parte XI


 
Changed:
<
<

Título de Nível 1

Título de Nível 2

Título de Nível 3

>
>

     - He como va viejo, todo bien?
 
Changed:
<
<

>
>
     - Chihe.. te acordas que me pediste que haga un programa que cuando el tamaño de la pantalla variase , en el centro apaeciera dinamicamente, en video reverso la cantidad de líneas y columnas de la manera que el Linux hace normnalmente?. Bueno hice , pero en la apariencia no quedó igual.
 
Changed:
<
<
Veja abaixo algumas dicas de formatação especiais (SUBSTITUA ESSE CONTEÚDO PELO QUE DESEJAR)
>
>
     - No estoy ni ahì para la apariencia, lo que yo quería es que vos ejercitase lo que aprendimos. Dejame ver lo que hiciste.
 
Changed:
<
<

>
>
$ cat tamtela.sh #!/bin/bash # # Colocar en el centro del la pantalla, con video reverso, # una cantidad de columnas y lineas # cuando el tamaño de la pantalla es alterado. # trap Muda 28 # 28 = señal generada por el cambio de tamaño # de la pantalla y Muda es la función que hace eso.

Bold=$(tput bold) # Modo de enfase Rev=$(tput rev) # Modo de video reverso Norm=$(tput sgr0) # Restaura la pantalla al valor de default

Muda () { clear Cols=$(tput cols) Lins=$(tput lines) tput cup $(($Lins / 2)) $(((Cols - 7) / 2)) # Centro de la pantlla echo $Bold$Rev$Cols X $Lins$Norm }

clear read -n1 -p "Cambie eltamanio de la pantalla o teclee algo para terminar"

     - Perfecto ! , que se joda la apariencia , despues te enseño unos machetes para mejorar, lo que vale es el programa, está funcionando y esta todo en enxuto***???***.

     - Pucha perdí el mayor tiempo intentando descubrir como aumentar el tamaño de la fuente.- ...

     - Deja eso para otro día, hoy vamos a ver unas cosas bastante intersantes y utiles..

Named Pipes

Otro tipo de pipes es el "named pides", que tambien es llamdo por FIFO. FIFO es un acrónimo de First In First Out, que se refiere a la propiedad de que los bytes salen con el mismo orden que entran. El "name" en named pipe es en verdad el nombre de un archivo. Los archivos tipo named pipe son mostrados por el comando "ls" como cualquier otro, con pocas diferencias, mirá:

$ ls -l pipe1 prw-r-r-- 1 julio dipao 0 Jan 22 23:11 pipe1|

La p en la columna del lado izquierdo indica que pipe1 es un named pipe. El resto de los bits de control de permisos, que se pueden leer o grabar al pipe, funcionan como un archivo normal. En los sistemas mas modernos una barra vertical (|) colocada al fin del nombre del archivo, es otra pista y en los sistemas LINUX, donde la opción de color esta habilitada, el nombre del archivo es escrito en rojo por defecto.

En los sistemas mas antiguos, los named pipes son creados por un programa mknod, normalmente situado en el directorio /etc.

En los sistemas mas modernos, la misma tarea es hecha por mkfifo. EL programa mkfifo recibe uno o mas nombres como argumento y crea pipes con esos nombres. Por ejemplo , para crear un named pipe con nombre pipe1 haga:

$ mkfifo pipe1

Como siempre la mejor forma de mostrar que algo funciona es dando ejemplos. Suponga que hayamos creado el named pipe mostrado anteriormente. Vamos ahora a trabajar con dos seciones o dos consolas virtules o una de cada una. En una de ellas haga:

$ ls -l > pipe1

en otra haga:

 
Changed:
<
<
album 1^Artista1~Musica1:Artista2~Musica2
>
>
$ cat < pipe1
 
Changed:
<
<
Pinguim com placa de atenção (em espanhol) Texto a ser mostrado para chamar atenção
>
>
Voilá! La salida del comando ejecutado en la primera consola fué exibida en la segunda. Note que el orden en que los comandos ocurrieron no importa.

Si prestaste atención, viste que el primer comando ejecutado parecía estar "colgado". Esto sucede por que la otra punta del pipe todavía no estaba conectada, y enotonces el sistema operativo suspendió el primer procesa hasta que el segundo proceso "abriera" el pipe. Para que un processo que usa el _pipe no quede en modo wait, es necesario que en una punta del pipe tenga un proceso "que habla" y en el otro un proceso " que escuha" y en el ejemplo que dimos , el ls era el que hablaba y el cat era el que escuchaba.-

Una aplicacion muy util de los named pipes es permitir que programas sin ninguan relación se puedan comunicar entre si, los named pipes tambien son usados para sincronizar procesos, ya que en un determinado punto podes colocar un proceso para "escuchar" o "hablar" en un determinado named pipe y el de allí solo salirá, si otro proceso "habla" o "escucha" en aquel pipe.


>foca

Você já viu que o uso desta ferramenta é ótimo para sincronizar processos e para fazer bloqueio em arquivos de forma a evitar perda/corrupção de informações devido a atualizações simultâneas (concorrência). Vejamos exemplos para ilustrar estes casos.

Sincronização de processos.

Suponha que você dispare paralelamente dois programas (processos) cujos diagramas de blocos de suas rotinas são como a figura a seguir:

Gráfico do Named Pipe

Os dois processos são disparados em paralelo e no BLOCO1 do Programa1 as três classificações são disparadas da seguinte maneira:

    for Arq in BigFile1 BigFile2 BigFile3
    do
        if  sort $Arq 
        then
            Manda=va
        else
            Manda=pare
            break
        fi
    done
    echo $Manda > pipe1
    [ $Manda = pare ] &&
        {
        echo Erro durante a classificação dos arquivos
        exit 1
        }
    ...

Assim sendo, o comando if testa cada classificação que está sendo efetuada. Caso ocorra qualquer problema, as classificações seguintes serão abortadas, uma mensagem contendo a cadeia pare é enviada pelo pipe1 e programa1 é descontinuado com um fim anormal.

Enquanto o Programa1 executava o seu primeiro bloco (as classificações) o Programa2 executava o seu BLOCO1, processando as suas rotinas de abertura e menu paralelamente ao Programa1, ganhando desta forma um bom intervalo de tempo.

O fragmento de código do Programa2 a seguir, mostra a transição do seu BLOCO1 para o BLOCO2:

    OK=`cat pipe1`
    if  [ $OK = va ]
    then
        ...
        Rotina de impressão
        ...
    else    #  Recebeu "pare" em OK
        exit 1
    fi

Após a execução de seu primeiro bloco, o Programa2 passará a "ouvir" o pipe1, ficando parado até que as classificações do Programa1 terminem, testando a seguir a mensagem passada pelo pipe1 para decidir se os arquivos estão íntegros para serem impressos, ou se o programa deverá ser descontinuado. Desta forma é possível disparar programas de forma assíncrona e sincronizá-los quando necessário, ganhando bastante tempo de processamento.

Bloqueio de arquivos

Suponha que você escreveu uma CGI (Common Gateway Interface) em Shell para contar quantos hits recebe uma determinada URL e a rotina de contagem está da seguinte maneira:

    Hits="$(cat page.hits 2> /dev/null)" || Hits=0
    echo $((Hits=Hits++)) > page.hits

Desta forma se a página receber dois ou mais acessos concorrentes, um ou mais poderá(ão) ser perdido(s), basta que o segundo acesso seja feito após a leitura da arquivo page.hits e antes da sua gravação, isto é, basta que o segundo acesso seja feito após o primeiro ter executado a primeira linha do script e antes de executar a segunda.

Então o que fazer? Para resolver o problema de concorrência vamos utilizar um named pipe. Criamos o seguinte script que será o daemon que receberá todos os pedidos para incrementar o contador. Note que ele vai ser usado por qualquer página no nosso site que precise de um contador.

$ cat contahits.sh #!/bin/bash

PIPE="/tmp/pipe_contador" # arquivo named pipe # dir onde serao colocados os arquivos contadores de cada pagina DIR="/var/www/contador"

[ -p "$PIPE" ] || mkfifo "$PIPE"

while : do for URL in $(cat < $PIPE) do FILE="$DIR/$(echo $URL | sed 's,.*/,,')" # OBS1: no sed acima, como precisava procurar # uma barra,usamos vírgula como separador. # OBS2: quando rodar como daemon comente a proxima linha echo "arquivo = $FILE"

n="$(cat $FILE 2> /dev/null)" || n=0 echo $((n=n+1)) > "$FILE" done done

Como só este script altera os arquivos, não existe problema de concorrência.

Este script será um daemon, isto é, rodará em background. Quando uma página sofrer um acesso, ela escreverá a sua URL no arquivo de pipe. Para testar, execute este comando:

    echo "teste_pagina.html" > /tmp/pipe_contador 

Para evitar erros, em cada página que quisermos adicionar o contador acrescentamos a seguinte linha:

    <!--#exec cmd="echo $REQUEST_URI > /tmp/pipe_contador"-->

Note que a variável $REQUEST_URI contém o nome do arquivo que o navegador (browser) requisitou.

Este último exemplo, é fruto de uma idéia que troquei com o amigo e mestre em Shell, Thobias Salazar Trevisan que escreveu o script e colocou-o em sua excelente URL. Aconselho a todos que querem aprender Shell a dar uma olhada nela (Dê uma olhada e inclua-a nos favoritos).

Ahhh! Você pensa que o assunto sobre named pipes está esgotado? Enganou-se. Vou mostrar um uso diferente a partir de agora.

Substituição de processos

Acabei de mostrar um monte de dicas sobre named pipes, agora vou mostrar que o Shell também usa os named pipes de uma maneira bastante singular, que é a substituição de processos (process substitution). Uma substituição de processos ocorre quando você põe um comando ou um pipeline de comandos entre parênteses e um < ou um > grudado na frente do parêntese da esquerda. Por exemplo, teclando-se o comando:

$ cat <(ls -l)

Resultará no comando ls -l executado em um subshell como é normal (por estar entre parênteses), porém redirecionará a saída para um named pipe temporário, que o Shell cria, nomeia e depois remove. Então o cat terá um nome de arquivo válido para ler (que será este named pipe e cujo dispositivo lógico associado é /dev/fd/63), e teremos a mesma saída que a gerada pela listagem do ls -l, porém dando um ou mais passos que o usual, isto é, mais onerosa para o computador.

Como poderemos constatar isso? Fácil... Veja o comando a seguir:

$ ls -l >(cat) l-wx------ 1 jneves jneves 64 Aug 27 12:26 /dev/fd/63 -> pipe:[7050]

É... Realmente é um named pipe.

Você deve estar pensando que isto é uma maluquice de nerd, né? Então suponha que você tenha 2 diretórios: dir e dir.bkp e deseja saber se os dois estão iguais (aquela velha dúvida: será que meu backup está atualizado?). Basta comparar os dados dos arquivos dos diretórios com o comando cmp, fazendo:

$ cmp <(cat dir/*) <(cat dir.bkp/*) || echo backup furado

ou, melhor ainda:

$ cmp <(cat dir/*) <(cat dir.bkp/*) >/dev/null || echo backup furado

Da forma acima, a comparação foi efetuada em todas as linhas de todos os arquivos de ambos os diretórios. Para acelerar o processo, poderíamos compara somente a listagem longa de ambos os diretórios, pois qualquer modificação que um arquivo sofra, é mostrada na data/hora de alteração e/ou no tamanho do arquivo. Veja como ficaria:

$ cmp <(ls -l dir) <(ls -l dir.bkp) >/dev/null || echo backup furado

Este é um exemplo meramente didático, mas são tantos os comandos que produzem mais de uma linha de saída, que serve como guia para outros. Eu quero gerar uma listagem dos meus arquivos, numerando-os e ao final dar o total de arquivos do diretório corrente:

    while read arq
    do
        ((i++)) # assim nao eh necessario inicializar i
        echo "$i: $arq"
    done < <(ls)
    echo "No diretorio corrente (`pwd`) existem $i arquivos"

Tá legal, eu sei que existem outras formas de executar a mesma tarefa. Usando o comando while, a forma mais comum de resolver esse problema seria:

    ls | while read arq
    do
        ((i++)) # assim nao eh necessario inicializar i
        echo "$i: $arq"
    done
    echo "No diretorio corrente (`pwd`) existem $i arquivos"

Quando executasse o script, pareceria estar tudo certo, porém no comando echo após o done, você verá que o valor de $i foi perdido. Isso deve-se ao fato desta variável estar sendo incrementada em um subshell criado pelo pipe (|) e que terminou no comando done, levando com ele todas as variáveis criadas no seu interior e as alterações feitas em todas as variáveis, inclusive as criadas externamente.

Somente para te mostrar que uma variável criada fora do subshell e alterada em seu interior perde as alterações feitas ao seu final, execute o script a seguir:

    #!/bin/bash
    LIST=""                  # Criada no shell principal
    ls | while read FILE     # Inicio do subshell
    do
        LIST="$FILE $LIST"   # Alterada dentro do subshell
    done                     # Fim do subshell
    echo :$LIST:

Ao final da execução você verá que aperecerão apenas dois dois-pontos (::). Mas no início deste exemplo eu disse que era meramente didático porque existem formas melhores de fazer a mesma tarefa. Veja só estas duas:

$ ls | ln

ou então, usando a própria substituição de processos:

$ cat -n <(ls)

Um último exemplo: você deseja comparar arq1 e arq2 usando o comando comm, mas este comando necessita que os arquivos estejam classificados. Então a melhor forma de proceder é:

$ comm <(sort arq1) <(sort arq2)

Esta forma evita que você faça as seguintes operações:

$ sort arq1 > /tmp/sort1 $ sort arq2 > /tmp/sort2 $ comm /tmp/sort1 /tmp/sort2 $ rm -f /tmp/sort1 /tmp/sort2

Pessoal, o nosso Papo de Botequim chegou ao fim frown . Curti muito aqui e recebi diversos elogios pelo trabalho desenvolvido ao longo de doze meses e, o melhor de tudo, fiz muitas amizades e tomei muitos chopes de graça com os leitores que encontrei pelos congressos e palestras que ando fazendo pelo nosso querido Brasil.

O que vou escrever aqui não está combinado nem sei se será publicado, mas como os editores desta revista são dois malucos beleza (ambos Rafael), é bem capaz de deixarem passar. É o seguinte: se quiserem que o Papo de Botequim continue, entulhem a caixa postal da Linux Magazine pedindo por isso e desde já escolham o próximo tema entre sed + expressões regulares ou linguagem awk.

De qualquer forma, caso não consigamos sensibilizar a direção da revista, me despeço de todos mandando um grande abraço aos barbudos e beijos às meninas e agradeçendo os mais de 100 e-mails que recebi (todos elogiosos) e todos devidamente respondidos.

À saúde de todos nós: Tim, Tim.

- Chico, fecha a minha conta porque vou mudar de botequim.

Não se esqueça, qualquer dúvida ou falta de companhia para um chope ou até para falar mal dos políticos é só mandar um e-mail para julio.neves@gmail.com. Vou aproveitar também para mandar o meu jabá: diga para os amigos que quem estiver afim de fazer um curso porreta de programação em Shell que mande um e-mail para julio.neves@uniriotec.br para informar-se.

 
Changed:
<
<
-- JulioNeves - 20 Nov 2006
>
>
Valeu!

Revision 120 Nov 2006 - JulioNeves

Line: 1 to 1
Added:
>
>

Título deste tópico



Título de Nível 1

Título de Nível 2

Título de Nível 3


Veja abaixo algumas dicas de formatação especiais (SUBSTITUA ESSE CONTEÚDO PELO QUE DESEJAR)


album 1^Artista1~Musica1:Artista2~Musica2

Pinguim com placa de atenção (em espanhol) Texto a ser mostrado para chamar atenção

-- JulioNeves - 20 Nov 2006

 
This site is powered by FoswikiCopyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding Wiki-SL? Send feedback