Curso VzAIX - Manual
Curso VzAIX - Manual
i x U i
Curso VzAIX01
n n
UNIX/AIX Basics for Operators
U U
n i x n i x n
ix U i x U i x U
n Un Un
n ix n i x n i x
U ix U ix U i
Ramn Barrios Lascar
2007
n
U ix U ix U n n
Le dedico este libro y todo mi trabajo a la mujer
que ha soportado que pase horas y horas frente a
un jugando con computadoras que parecen
primitivas.
Oh Estefana!
Marcas registradas
En este documento aparecen una cantidad de trminos que son marcas registradas o marcas comerciales de IBM u otras compaas.
IBM es una marca registrada de International Business Machines Corporation.
Las siguientes sin marcas registradas de International Business Machines Corporation en los Estados Unidos de Amrica y otros pases:
AIX DB2 DB2 UDB
POWER PowerPC SP
POWERparallel eServer pSeries
Intel es una marca registrada de Intel Corporation en los Estados Unidos de Amrica y otros pases.
UNIX es una marca registrada de The Open Group en los Estados Unidos de Amrica y otros pases.
Sun y Sun Solaris son unas marca registrada por Sun Microsystems Corporation en los Estados Unidos de Amrica y otros pases.
Linux es una marca registrada de Linus Torvalds en los Estados Unidos de Amrica y otros pases.
Microsoft Windows es una marca registrada de Microsoft Corporation en los Estados Unidos de Amrica y otros pases.
Edicin de agosto de 2007. Ramn Barrios Lascar 2003, 2007. Todos los derechos reservados. Este documento no puede ser
reproducido sin el permiso y consentimiento expreso de Ramn Barrios Lascar.
Objetivos
El presente curso pretende, mostrar, explicar y poner en prctica una serie de comandos y
tcnicas que permiten a un individuo trabajar con sistemas UNIX, Linux, POSIX y parecidos.
La idea del mismo es dar los conocimientos suficientes a un usuario u operador para poder
trabajar cmoda y eficientemente a travs del uso de una cuenta de acceso a un sistema
multiusuario como los mencionados en modo texto; es decir a travs del uso de comandos y
toda la sintaxis de un intrprete de comandos estilo Bourne.
Al tomar este curso y aprender lo que aqu se pretende, el estudiante logra los
conocimientos necesarios para trabajar en sistemas como Sun Solaris, Hewlett-Packard HP-
UX, Digital/Compaq/HP UNIX /Tru64, SCO OpenServer/OpenDesktop, SCO UnixWare, QNX y
QNX Centrino, FreeBSD/NetBSD/OpenBSD, prcticamente todas las distribuciones de Linux,
y muy especialmente, IBM AIX. Adicionalmente los comando son usables tambin en la
interfaz de texto del sistema Mac OS X.
Audiencia
El concepto general
Para cerrar el crculo, los servidores POWER han sido diseados para tener un
ancho de banda amplio a los sistemas de almacenamiento, por ello estos mismos son o SCSI
de ltima generacin (actualmente UltraSCSI 320) o de canal de fibra de ltima generacin
(Fiber Channel de hasta 4Gb/s). Mientras que todo sistema de almacenamiento por bus SCSI
es visto como una data store local, con deteccin y configuracin automtica de los
En 1985, IBM adquiri acceso a, y derechos sobre el cdigo fuente de UNIX, directamente del
propietario original, es decir los laboratorios Bell de AT&T (American Telephone &
Telegraph). A partir del mismo cre una versin que corriese sobre un hardware que
planeaba lanzar al mercado. Posteriormente adquiri el acceso a software originado en la
Universidad de California, Captulo Berkeley (UCB), el software en mencin, llamado
Distribucin de Software de Berkeley (BSD) era una variante de UNIX con
caractersticas interesantes, entre ellas la integracin con redes IP. Al Esta breve histor
ia
de AIX invalida cu del origen
integrar los dos, y derivar la versin para el hardware POWER, IBM logr legal alquier
que le pueda ge duda
su excelente variante de UNIX denominada Advanced Interactive cliente el usar nerar al
este sistema
Executive o AIX. Este sistema operativo ha ido evolucionando con el operativo.
'())*+, -.&
/)0*+, 1.$
23)4*+, 1.$
*+,56*)(7)8)95+:;0<=()5,>?0(>@A0>:4B
*>885K:9
F>4>I L.$
T4C()<5+.5S=4)4@=AH
D4>I5S>H)5+Q=(>4U5+9?0)H56*)885R=@?B !$
V)45SQ:H3?:45N5,)44>?5P>0GQ>)
WXNDJ56W)<8)00NX=G7=(CB !!
TYJ56Y*FB Z.L
D4>I[=()56/:E)88\D4>E)8\+M2B #.!
Y(>I56+>8>G:45O(=3Q>G?B -.Z
Los sistemas UNIX (oficialmente UNIX) tienen una muy larga historia, siendo desarrollados
inicialmente en las dcadas de 1960s y 1970s, por un grupo de empleados de la compaa
norteamericana AT&T, entre los que se destacan Ken Thompson, Dennis C. Ritchie y
Douglas McIlroy. Los sistemas UNIX se han ido derivando en diversas ramas, desarrolladas a
travs del tiempo tanto por AT&T como por numerosas otras compaas El le
nguaje C fue de
comerciales. Desde comienzos de la dcada de 1990, tambin se han por Brian Ke sarrollado
rn
desarrollado variantes libres, creadas por grupos no muy unidos de Dennis C. Ritchi ighan y
e. El sistema
UNIX fue desarrol
desarrolladores diseminados a lo ancho del planeta. lado por Ken
Thompson y
Dennis C.
El mismo! Ritchie.
Durante los finales de la dcada de 1970 y durante la dcada de 1980, la
influencia de UNIX en los mbitos acadmicos llev a una la adopcin en gran
escala de UNIX en empresas incipientes (en especial de la variante BSD originada en la
Universidad de California, sede Berkeley), de las cuales la ms notable es Sun Microsystems.
Hoy en da, adicionalmente a las variantes comerciales certificadas de UNIX (como IBM AIX)
se han popularizado ambientes estilo UNIX como Linux, Mac OS X y las versiones BSD libres.
!""#$%&%$'
15)##* 789*
()*
1$*2)3&4/)4!.%5$6&/'
+,%#)'
/.$6).
:&.;
-&./0&.)
Los sistemas UNIX modernos son muy modulares, permitiendo combinarse, descombinarse o
recombinarse los mdulos segn sean las necesidades de la implementacin. La mayora
consta de los siguientes mdulos:
Ncleo del sistema o kernel
Sistema de archivado o file system
Intrprete de comandos o shell
Ambiente grfico de escritorio o GUI
Editores de texto
Lenguajes de programacin
Sistemas de control
Numerosas utilidades
Teniendo esta mentalidad, por ejemplo, la empresa canadiense QNX ofrece y vende una
solucin para instalar en sistemas de control de automviles que es una versin de UNIX sin
intrprete de comandos ni ambientes de escritorio, constando slo del ncleo del sistema,
del sistema de archivado y los sistemas de control; pero tambin vende una solucin del
mismo UNIX que incluye el resto de los mdulos aqu mencionados, ofrecido como una
solucin integral para estaciones de desarrollo; y adems vende otra solucin del mismo que
!""#$%&%$'
15)##* 789*
()*
1$*2)3&4/)4!.%5$6&/'
+,%#)'
/.$6).
2&.:)2&
-&./0&.)
!""#$%&%$'
12)##* 345*
()*
1$*7)9&:/):!.%2$6&/'
+,%#)'
/.$6).
7&.8)7&
-&./0&.)
!""#$%&%$'
15)##* 789*
()*
1$*2)3&4/)4!.%5$6&/'
+,%#)'
/.$6).
2&.:)2&
-&./0&.)
Un intrprete de comandos es una aplicacin que ejecuta como cualquier otra en el sistema
operativo, pero que tiene una finalidad: presenta un indicador donde los usuarios pueden
escribir instrucciones para que el sistema las ejecute. Lo especial del intrprete de comandos
de UNIX es que desde siempre (casi cuarenta aos) ha sido programada por desarrolladores
para programadores, por lo que siempre se ha contado en UNIX con un mtodo de
programacin fcil. De hecho todos los intrpretes de comandos de UNIX disponibles son e
implementan un lenguaje de programacin bastante completo todo el tiempo. Como cada
uno de los intrpretes de comandos de UNIX implementa un lenguaje y como lo dice el
nombre interpretado, no compilado- pueden en todo momento hacerse programas, an si
no se guardan en un archivo si no que se digitan directamente en el indicador.
Intrprete de comandos original: sh
El intrprete de comandos estndar original de UNIX fue desarrollado por El indicador
de man
Stephen Bourne, un empleado de AT&T en 1977. Este intrprete de DOS (y de MS W datos de
indows) est
ligeramente
comandos no es muy cmodo de trabajar de manera interactiva porque no pa mo
recido a los int d e l a d o
tiene manejo avanzado del teclado (menos de las teclas de cursor) y un comandos de U rpretes de
NIX, pero
manejo difcil del histrico de comandos previos. Sin embargo, como se lolesngua jes de programac los
in de
intrpretes de
desarroll pensando en que fuera una herramienta de programacin completos, a di U NIX son
fe
lenguaje disponib rencia del
tiene muy buenas facilidades en su lenguaje, como variables, redireccin, le en DOS.
estructuras de control, funciones, y manejo de cadenas de texto slo
limitadas por la memoria. Este intrprete de comandos es tan funcional que fue
!""#$%&%$'
15)##* 89:*
()*
1$*2)3&4/)4!.%5$6&/'
+,%#)'
/.$6).
2&.7)2&
-&./0&.)
Los UNIX modernos pueden usarse interactiva y grficamente, es ms, unos de los primeros
sistemas operativos en contar con una interfaz grfica fueron los UNIX, con la aparicin del
sistema X Window System, desarrollado en el MIT (Massachussets Institute of Technology) en
1984; y una variante, NeXTSTEP fue completamente grfica desde el lanzamiento en 1989
(realmente desde las vistas previas en 1986). El esquema y protocolo actual llamado X11 es la
base de los entornos grficos de casi todos los UNIX (hay otros, como Photon en QNX
Neutrino y Aqua en Mac OS X, pero ambos incluyen y soportan tambin X11).
Ahora, X11 no implementa un ambiente grfico si no un esquema para la especificacin de
pixeles, coordenadas, colores, y eventos de teclado y Mouse entre otros, por lo que encima
de X11 se desarrollan los verdaderos ambientes de escritorio grfico. Ahora, como X11 es
tambin un protocolo de red, las aplicaciones grficos desarrolladas con base en X11 pueden
y de hecho funcionan a travs de una red.
Con base en X11 se han desarrollado mltiples ambientes de escritorio grfico, siendo los
ms conocidos:
Gnome es un proyecto internacional de cdigo fuente abierto que produce dos ambientes:
el ambiente de escritorio grfico Gnome y el ambiente de desarrollo Gnome.
La idea del ambiente grfico Gnome es la de implementar un ambiente de escritorio grfico
con ideas comunes a los otros ambientes populares, que sea fcil de usar, que sea completo
y que se pueda traducir a todos los idiomas necesarios.
El proyecto Gnome fue iniciado por Miguel de Icaza y Federico Mena en agosto de 1997.
Gnome es actualmente el ambiente grfico predeterminado de las distribuciones de Linux
ms conocidas (Red Hat Enterprise Linux y Ubuntu Linux) y de Sun Solaris 10. Est
disponible en diversas plataformas de cdigo abierto y comerciales como OpenBSD,
FreeBSD, numerosos Linux, IBM AIX y hasta Apple Mac OS X. El patrocinador principal de
Gnome es la compaa Red Hat.
En AIX est incluido en el CD BonusPak, en Solaris el ambiente grfico predeterminado (Sun
Java Desktop) es una variante de Gnome.
KDE es un proyecto internacional iniciado en 1996 por Matthias Ettrich para hacer un
ambiente de escritorio grfico basado en tecnologas de cdigo abierto. KDE est basado en
un juego de bibliotecas de funciones que a su vez se basan en Qt, un juego de bibliotecas de
funciones desarrolladas en C++ por la compaa noruega Trolltech. KDE incluye adems
del ambiente de escritorio grfico un juego de funcionalidades que permiten incluir
numerosas aplicaciones en el proyecto: aplicaciones de ofimtica, de multimedia, cientficas
y dems. KDE se centra todo alrededor de la integracin de objetos, y as funciona muy bien:
integrado. KDE es adems transparente a la red, permitiendo que las aplicaciones hechas
con KDE trabajen archivos locales y remotos que se acceden a travs de los protocolos que
el escritorio actual implementa, siendo tpicamente ms de una docena.
KDE tuvo un inicio muy lento, los desarrolladores iniciales se centraron en crear las
bibliotecas de objetos y de funciones ms necesarias y ltimamente se han concentrado ms
en las aplicaciones. Con esto ltimo, el desarrollo de todo el ambiente se ha acelerado y han
logrado ms y mejor compatibilidad y desempeo ptimo en ms ambientes. Las ideas de
KDE hacen que, con el reuso de clases y objetos el ambiente como un todo consuma menos
recursos.
KDE es actualmente el entorno grfico predeterminado de las distribuciones de Linux ms
conocidas en Europa (SuSE Linux y Mandriva). Est disponible en numerosas plataformas de
cdigo abierto y comerciales como OpenBSD, FreeBSD, numerosos Linux, IBM AIX y hasta
Apple Mac OS X. El patrocinador principal de KDE es la compaa SuSE.
!""#$%&%$'
15)##* 789*
()*
1$*2)3&4/)4!.%5$6&/'
+,%#)'
/.$6).
2&.:)2&
-&./0&.)
Originalmente UNIX fue creado para desarrollar manuales tcnicos es decir texto-, y como
el sistema apenas se estaba creando, haba de desarrollar y programar las utilidades, a partir
de cdigo fuente para compilar es decir texto-; por todo ello, las herramientas ms
centrales de los sistemas UNIX son las que procesan texto puro, y de ellas las ms
importantes son los editores de texto (a diferencia de otras plataformas donde el editor de
texto es algo muy bsico y casi despreciable). En UNIX siempre ha habido al menos un editor
de texto poderoso, pero obvio, esto como todo ha ido evolucionando con el tiempo.
En un sistema UNIX moderno pueden encontrarse hoy en da editores de texto como:
ed
ex
vi
Emacs
inED
nano
Gedit
Kate
Como muchas cosas en UNIX, algunos de los editores arriba mencionados son estndares y
otros no. En especial, de arriba, ed, ex, vi estn estandarizados (en POSIX), y adems son
requeridos para que un UNIX pueda llamarse UNIX.
guardndolo en prog.c, donde el primer comando confirma que se crear el nuevo archivo
prog.c, y que se le agregar texto con el comando a (append), se termina de entrar texto
en el comando a con un punto solo en una lnea, se guarda el archivo con el comando w
(write) y se sale del editor con el comando q (quit).
Aunque es muy til, y se pueden hacer macros con ed, ya no es muy usado, estando los
usuarios ms acostumbrados a trabajar con editores de texto que tienen no comandos, si no
interfaces. Pero, ed sigue siendo til para desarrollar macros.
Editor vi
El editor vi (se supone que es Visual Editor) es un editor de texto modal estandarizado
completamente en POSIX, incluido en IEEE Spec 1170. Es un editor de texto muy
poderoso, pero por ser modal es un poco difcil de usar en un comienzo, Aprender
emos usar vi
pero dar los primeros pasos en l no es demasiado complicado. Aunque todo un captuloa de di ca
en
mismo do al
haya disponibles en todos los UNIX ms editores de texto (tal vez de
modo grfico como dtpad, gedit, kate y ms), este editor est incluido
en el estndar UNIX03 como obligatorio, por lo que todos los UNIX lo incluyen y vale
la pena aprender a usarlo. vi es usable en los ambientes ms inhspitos (editar un archivo de
configuracin no es fcil a travs de un acceso remoto de comandos a 9600bps). Los
sistemas UNIX tienen vi disponible hasta en el modo de recuperacin cuando el sistema no
sube completo.
!""#$%&%$'
15)##* 789*
()*
1$*2)3&4/)4!.%5$6&/'
+,%#)'
/.$6).
2&.:)2&
-&./0&.)
Como el diseo original del sistema UNIX en AT&T se debi a la necesidad de que unos
desarrolladores desarrollaran documentacin tcnica (realmente manuales de desarrollo)
que no haba como imprimir adecuadamente en el momento, el sistema UNIX original inclua
las herramientas de desarrollo de manera estndar. Tambin, cuando comenz a
popularizarse ms UNIX fue cuando entr en la academia, donde la Universidad de
California sede Berkeley (UCB) mejor an ms las facilidades para los desarrolladores.
Por todo ello, UNIX tradicionalmente ha sido un ambiente de programadores para
programadores, por lo que ha habido la fcil manera de hacer desarrollo en estos sistemas.
Mientras un UNIX de cdigo libre (open source) incluye todas las herramientas de desarrollo
en los medios de instalacin, es comn que un UNIX comercial tpico (como Sun Solaris o
IBM AIX) NO incluya el ambiente de desarrollo para los lenguajes C y C++. De todas
maneras lo comn para el desarrollo en UNIX es:
Editor de texto sensible al contexto de desarrollo (o que al menos maneja la
sintaxis). FreeBSD y OpenBSD ponen a disposicin del administrador ambientes
completos de desarrollo de cdigo abierto como KDevelop. Apple incluye XCode
en los medios originales de instalacin, siendo ste es el ambiente integrado de
desarrollo basado en GCC con el que se desarrolla todo el sistema operativo al
interior de dicha compaa.
Facilidades para el manejo de versiones de cdigo: CVS o al menos RCS. CVS es
Concurrent Versions System y RCS es Revisions Control System. Es de notar que
Los sistemas UNIX han sido casi desde el comienzo sistemas multiusuario, por lo que para
trabajar con ellos no se necesita nicamente el hardware y el software, si no adems un perfil
de usuario.
Un perfil de usuario ms comnmente llamada una cuenta de usuario- es una definicin
junto con un nombre y un mtodo de acceso y de control de acceso- que permiten
conectarse, identificarse y autenticarse con un sistema UNIX para iniciar y ejecutar tareas y
aplicaciones.
Cuando se hace la instalacin predeterminada estn creados en un sistema UNIX numerosos
perfiles de usuario y de perfiles de usuario, pero la mayora de estas cuentas de usuario son
para uso interno de los procesos del sistema operativo, no para el uso interactivo de los
usuarios. En un sistema UNIX tradicional slo una cuenta de usuario permite el uso
interactivo, y esta cuenta lleva por nombre usuario root. Como esta cuenta de usuario
trabaja con el identificador interno nmero cero (0) el sistema operativo no le forza
controles de seguridad, por lo que tpicamente puede ejecutar toda tarea sin limitaciones
por permisos o controles de seguridad.
Los sistemas UNIX ms modernos en especial los basados en cdigo fuente abierto-
adicionalmente solicitan la creacin de al menos un perfil de usuario adicional para bloquear
el acceso directo a la cuenta de usuario ilimitada root entre estos tenemos FreeBSD y Mac
OS X-.
Como cualquiera que sepa cmo es el nombre de la cuenta podra usarla en especial root
siempre existe y est disponible en algunas variantes de UNIX como Solaris y AIX-, los
sistemas multiusuario implementan alguna manera de autenticacin, siendo la tpica una
contrasea. Teniendo ambos, el nombre de la cuenta y la contrasea correspondiente, hay ya
como conectarse y trabajar con UNIX. Una manera tpica si el ambiente es pequeo estacin
de trabajo- es directamente en la consola, que comnmente muestra un ambiente grfico de
entrada XDM en AIX, GDM en Solaris y window_login en Mac OS X-. La otra manera
tpica si el ambiente es grande servidor- es conectarse desde un cliente usando TELNET
en AIX y Solaris- o SSH en OpenBSD, FreeBSD y Mac OS X-. Como este curso est
orientado al uso remoto de servidores, el estudiante debe buscar la manera de obtener
acceso a un indicador de comandos, que se obtiene localmente ejecutando la aplicacin
Terminal en Mac OS X, Gnome Terminal en Solaris y DtTerm en AIX.
Note que aunque Solaris, AIX y OpenBSD no obliguen a crear una cuenta de usuario no-
root para el trabajo diario, es mejor crear una lo ms pronto y trabajar directamente con sta
siempre.
Como se mencion antes, las primeras acciones de un usuario UNIX para trabajar en un
sistema son conectarse, identificarse y autenticarse. Adems debera conocer unos
comandos mnimos, comandos que conoceremos a continuacin.
Entrar al sistema
Para entrar al sistema primero hay que conectarse, comnmente usando TELNET o SSH. El
sistema preguntar un nombre de cuenta de usuario y luego de entrarse (y presionando
ENTER) preguntar comnmente una contrasea. Esto se llama identificarse (informar quin
soy) y autenticarse (demostrar que s soy). Note que es muy comn que al escribir la
contrasea no se vea nada:
Hay dos usuarios conectados, pero un usuario (root) tiene dos sesiones. Como se observa el
comando muestra:
El nombre de cada usuario por sesin. En este caso son root y e.
Cmo se llama el archivo que representa la ventana o conexin. En este caso son
pts/X.
FreeBSD preconfigura a los usuarios para que sus sesiones de texto sean
con /usr/bin/bash (el Bourne Again Shell), y /usr/bin/sh (Bourne Shell
original) para el usuario root.
OpenBSD preconfigura a los usuarios para que inicien con /usr/bin/ksh (el
Korn Shell 93), incluso para el usuario root.
Aunque los UNIX no tienen un estndar que deban seguir todos los
Los UNIX no tiene
comandos, s hay un estndar de hecho que siguen casi todos los de todos los com
n un estndar
andos, pero s
comandos: cumplen obligat
oriamente un
es t nd ar co m
an
comando opciones argumentos comando para la do po r
mayora de
los comandos.
Bsicamente lo que hay que observar es que primero se escribe el
comando, segundo posiblemente- se escriben las opciones, y de ltimo los
argumentos.
Note que los sistemas UNIX son muy precisos en llevar la hora exacta, pero slo si se
mantienen encendidos, y que, adicionalmente, en UNIX se inventaron un protocolo para el
mantenimiento de una hora sincronizada con una central a travs de la red hace un par de
dcadas.
Non-authoritative answer:
Name: www.interfacelift.com
Address: 209.85.64.50
real 0m0.21s
user 0m0.01s
sys 0m0.01s
e@abe:e/>
Calendario: cal
Como los seres humanos contamos ms los das, las semanas y los meses que los minutos y
los segundos, todos los sistemas UNIX incluyen el comando cal, que sirve para ver o revisar
de manera sencilla un calendario. El comando tiene tres posibles maneras de uso:
El comando slo, sin opciones ni argumentos,
El comando con un nico nmero,
El comando con dos nmeros.
Cuando se usa el comando slo, cal muestra un calendario representando el mes actual real:
e@abe:e/> cal
August 2007
Sun Mon Tue Wed Thu Fri Sat
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
January February
Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat
1 2 3 4 5 6 1 2 3
7 8 9 10 11 12 13 4 5 6 7 8 9 10
14 15 16 17 18 19 20 11 12 13 14 15 16 17
23 24 25 26 27 28 29 28 29 30 31
30
November December
Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat
1 2 3 1
4 5 6 7 8 9 10 2 3 4 5 6 7 8
11 12 13 14 15 16 17 9 10 11 12 13 14 15
18 19 20 21 22 23 24 16 17 18 19 20 21 22
25 26 27 28 29 30 23 24 25 26 27 28 29
30 31
Cuando se usa el comando cal con dos nmeros, el comando muestra un calendario del
mes del primer nmero en el ao segundo nmero:
e@abe:e/> cal 5 1974
May 1974
Sun Mon Tue Wed Thu Fri Sat
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Desde los meros comienzos no exactamente desde el inicio, la verdad- UNIX ha sido multi-
usuario, por lo que ha tenido buenas facilidades de comunicacin con otros usuarios del
mismo o de diferente sistema.
Mientras en otros sistemas han ido evolucionando, muchas de las cosas que han sido
novedad en los ltimos aos, los usuarios de UNIX las dan por sentado porque las han tenido
de alguna manera por dcadas. En UNIX es muy fcil cuando se conoce que TCP/IP naci en
UNIX, siendo BSD el primer ambiente con una implementacin funcionando, y siendo las
ideas de sockets de TCP/IP desarrolladas para BSD el estndar de hecho como se programan
todas las implementaciones de TCP/IP en todos los otros sistemas en la actualidad.
En UNIX siempre ha habido correo, en UNIX naci TCP, naci TCP/IP, naci TELNET, FTP,
SMTP, POP, IMAP, y muchsimos protocolos ms. En NeXTSTEP -un UNIX - se inventaron
HTTP y se hizo la primera implementacin de un navegador (browser) y de un servidor de
pginas, y en el mismo sistema operativo se implement HTML!. En UNIX se inventaron CGI
y JavaScript. En UNIX se inventaron las direcciones de correo buzn@dominio, y en UNIX se
inventaron el chat centralizado y el distribuido por TCP/IP. Sin UNIX no existira la Internet
global como existe hoy en da. Por algo Sun Microsystems en el ms grande auge de sus
mquinas con Solaris acu The network Is the computer. Tan importante es UNIX en la
Internet, que el modo de transmisin de datos nativo de la red es el modo como escribe
UNIX texto dentro de un socket.
Una manera sencilla de comunicarse con otro usuario actualmente presente en el sistema es
usando mensajes directos escritos con el comando write. La sintaxis bsica es muy sencilla:
write nombreUsuario. Como este comando slo enva mensajes directos a la ventana de
sesin a la terminal realmente-, el que escribe/enva debera verificar primero que el
usuario al que le va a enviar el mensaje est conectado en el sistema y que tiene una sesin
interactiva de sistema operativo.
Ejemplo:
Un usuario en su sesin:
0 root@abe:/> who
root pts/0 Aug 14 19:18 (moe.lan)
e pts/1 Aug 14 19:36 (moe.lan) El usuario debe
0 root@abe:/> write e finalizar el
mensaje presiona
ndo ctrl d
Hola usuario!
0 root@abe:/>
Como puede observarse, el comando write no muestra un indicador al usuario que lo usa
para mostrarle que ya puede escribir, pero de hecho, s le recibe al usuario y s enva el
mensaje. El usuario al que le envan un mensaje no tiene una manera para responder el
mensaje segn la herramienta, es decir, esta no es una herramienta interactiva. Si el usuario
que recibe un mensaje quiere responder debera usar lo mismo: write otroUsuario.
Los mensajes que se envan usando write aparecen encima del texto que est observando
en su sesin el usuario destinatario, as que dicho texto no tiene nada que ver con el texto
del archivo si el destinatario est trabajando un archivo en un editor de texto. Ahora, como
puede ser incmodo, el usuario puede controlar si recibe o no los mensajes de otros
usuarios, usando el comando mesg, pero, estos controles no funcionan si quien enva es el
usuario todopoderoso root.
Ejemplo:
Un usuario se bloquea:
2 root@abe:/> mesg n
1 root@abe:/>
El comando write puede usarse tambin para comunicarse instantneamente con otros
usuarios en otros sistemas si en ambos sistemas est corriendo el servicio writesrv o
equivalente-. Es muy raro hoy en da encontrar sistemas de stos. Si se tienen disponibles se
usara write usuario@sistema, donde aplica la misma regla, el usuario debe estar conectado
en se momento y no debe haber bloqueado la recepcin de mensajes.
Xxx
Como el comando write es especfico, enva mensajes a un nico usuario que debe estar
conectado a la mquina en el momento del envo de los mensajes, no es muy prctico para
hacer anuncios. Afortunadamente los sistemas UNIX incluyen un comando para hacer
anuncios, este comando es wall (write all), que enva un mismo- mensaje a todos los
usuarios que en el momento estn conectados con una sesin interactiva.
El uso del comando wall es muy sencillo: se usa wall, sin parmetros, y en la nueva lnea
que aparece se escribe el texto a anunciar, la cantidad de lneas que sean necesarias, y se
finaliza con ctrl d, solo, en una lnea. El mensaje ser recibido por todos los usuarios
conectados interactivamente que no hayan bloqueado la recepcin de los mensajes al igual
que write, los mensajes que root enva no se pueden bloquear-.
Ejemplo:
El usuario que enva,
e@abe:e/> wall
Esta alguien ahi???
^D
mail listaDirecciones (m) Abre el editor para crear un nuevo mensaje para enviar a
los destinos dados por la lista de direcciones.
new listaMensajes Marca el mensaje actual o los dados por la lista de mensajes
como no ledos.
next (n) Muestra el siguiente mensaje, seleccionndolo como mensaje actual
quit (q) Deja el buzn actual y se sale del programa mail. Todos los cambios
pendientes al buzn son aplicados: Los mensajes ledos pero no borrados ni
grabados son movidos al buzn personal, los mensajes marcados para
eliminacin son perdidos definitivamente, los mensajes marcados con hold son
mantenidos en el buzn de sistema.
reply mensaje (r) Permite responder al remitente y a todos los destinatarios del
correo actual, o al mensaje dado.
Reply mensaje (R) Permite responder al remitente del mensaje actual o al del
mensaje dado.
undelete listaMensajes (u) Marca el mensaje actual, o los especificados,
como no borrados para que no se pierdan al salir del buzn actual.
unread listaMensajes (U) Marca el mensaje actual, o los especificados, como no
ledos.
z+ (z) Muestra el siguiente grupo de encabezados de mensajes.
z- Muestra el anterior grupo de encabezados de mensajes.
Modo directo y envo de nuevos mensajes de correo electrnico
El segundo modo se usa nicamente para enviar correos, este modo invoca usando el
comando mail con argumentos posiblemente con opciones tambin-, en donde el
comando mail asume que los argumentos son buzones destinatarios de correo.
Ejemplo:
e@abe:e/> mail -s "Mensaje prueba Nro 1" [email protected]
No es ms.
.
Cc:
e@abe:e/>
Directorios
Los directorios son archivos especiales en UNIX. Realmente son archivos dentro de las
estructuras grabadas en disco- pero tienen una finalidad especial en el sistema: con los
directorios se arma el concepto de rbol jerrquico de contenidos a los que estamos
acostumbrados en muchas plataformas adems de los UNIX -. Los directorios en UNIX
realmente son archivos especiales catlogo que contienen/son una tabla de nombres y
nmeros de ndice de lo que est contenido dentro de el directorio.
Como son especiales los directorios se trabajan con unos comandos diferentes de los que se
permiten para los archivos comunes.
Los directorios son tan archivos en UNIX que cumplen las mismas reglas que cumplen los
archivos:
Los directorios pueden tener casi cualquier nombre de entre uno (1) y dos
cientos cincuenta y cinco caracteres (255), en un UNIX moderno. El nico carcter
que no se permite en los nombres es /
Dos directorios o dos archivos o un directorio y un archivo no pueden tener el
mismo nombre completo.
Como se observa, incluye slo los nombres, pero mostr lo de otro directorio sin tener que
irnos al mismo.
Si se observa detenidamente se notar que muchos tems son los mismos, pero como en la
segunda invocacin se especific que haba que incluir los ocultos en los listados, pues,
aparecen ms, todos con nombres que inician con punto (.). Nota cules son?
Todos los archivos incluso los directorios porque tambin son archivos- tienen unas
propiedades llamadas metadatos en UNIX -. Estas propiedades pueden
revisarse muy fcilmente con el comando ls cuando se le agrega la Recuerde: los di
re
UNIX s ocupan es ctorios en
opcin l (long listing). pacio!
Ejemplo:
e@abe:e/> ls -l
total 88
-rw-r--r-- 1 e system 0 Aug 14 23:15 LitteFile
-rw-r--r-- 1 e system 17804 Aug 14 23:16 MadRamon 1.png
drwxr-xr-x 2 e system 256 Aug 14 23:17 SubDir_2
-rw-r--r-- 1 e system 29 Aug 14 23:15 fecha actual.txt
-rw-r--r-- 1 e system 10181 Apr 10 16:02 smit.log
-rw-r--r-- 1 e system 544 Apr 10 16:00 smit.script
-rw-r--r-- 1 e system 291 Apr 10 16:00 smit.transaction
drwxr-xr-x 2 e system 256 Aug 14 23:17 subdir1
e@abe:e/> ls -l /
total 856
-rw-r--r-- 1 root system 6892 Apr 16 13:14 WebSM.pref
-rw-r--r-- 1 root system 84 Apr 16 13:11
WebSM.pref_wsmmonitoring.data
drwxr-x--- 2 root audit 256 Jan 10 2006 audit
lrwxrwxrwx 1 bin bin 8 Apr 10 07:57 bin -> /usr/bin
-rw-r--r-- 1 root system 5793 Apr 18 22:01 bosinst.data
drwxr-xr-x 2 root system 256 Apr 11 12:43 cdrom
drwxr-xr-x 3 root system 256 Jul 11 23:39 cluster
drwxrwxr-x 5 root system 8192 Aug 14 15:00 dev
drwxr-xr-x 27 root system 8192 Aug 12 13:48 etc
-rwxr-xr-x 1 root system 2287 Jun 08 18:43 getinfo.sh
drwxr-xr-x 7 bin bin 256 Jun 18 21:57 home
-rw-r--r-- 1 root system 8062 Apr 18 22:02 image.data
lrwxrwxrwx 1 bin bin 8 Apr 10 07:57 lib -> /usr/lib
drwx------ 2 root system 256 Apr 10 07:57 lost+found
drwxr-xr-x 45 bin bin 4096 Aug 09 22:13 lpp
drwxr-xr-x 2 bin bin 256 Jan 10 2006 mnt
drwxr-xr-x 11 root system 4096 Apr 13 00:37 opt
dr-xr-xr-x 1 root system 0 Aug 14 23:32 proc
drwxr-xr-x 3 bin bin 256 Apr 10 20:06 sbin
-rw-r--r-- 1 root system 304408 Aug 14 19:34 smit.log
-rw-r--r-- 1 root system 11526 Aug 14 19:34 smit.script
-rw-r--r-- 1 root system 22352 Aug 14 19:34 smit.transaction
drwxrwxr-x 2 root system 256 Apr 10 08:21 tftpboot
drwxrwxrwt 9 bin bin 8192 Aug 14 23:32 tmp
lrwxrwxrwx 1 bin bin 5 Apr 10 07:57 u -> /home
lrwxrwxrwx 1 root system 21 Apr 10 10:55 UNIX -> /usr/lib/
boot/unix_64
drwxr-xr-x 36 bin bin 4096 Jun 18 21:43 usr
drwxr-xr-x 30 root system 4096 Aug 09 12:31 var
-rw-r--r-- 1 root system 11806 Apr 16 13:13 websm.script
Es un listado largo y complejo. Hay mucha informacin, a saber: Note que ls lista
el nombre del
item dado como
El primer ejemplo muestra el uso de ls con la opcin l, pero sin es un archivo,
argumento si
pero lista los
argumentos, es decir, un listado con detalles del directorio actual. nombres de los
cont
el argumento es un enidos si
directorio!
El segundo ejemplo muestra el uso de ls con la opcin l y con
argumento, es decir, un listado con detalles de un directorio especfico.
Qu incluye el listado?
Una primera columna con el tipo y los permisos de cada uno de los tems. De los
permisos se hablar ms adelante.
El nmero de nombres que tiene en total cada tem s los archivos y directorios
en UNIX pueden tener varios nombres simultneamente-.
El nombre o nmero interno del usuario dueo de cada tem.
El nombre o nmero interno del grupo de usuarios que tiene acceso a cada tem.
El tamao en bytes de cada tem. Ciertos tems archivos especiales- no tienen
tamao, para ellos el listado incluye otra informacin en esta columna.
La fecha y hora de ltima modificacin, de forma mes da hora si la ltima
modificacin sucedi hace mximo seis meses; de forma mes da ao si la ltima
modificacin sucedi hace ms de seis meses.
El nombre del tem. Si el tem es un enlace simblico muestra el nombre ->
nombreDelItemApuntado.
Como en un sistema UNIX tpico hay muchsimos directorios (tal vez miles), una operacin
muy importante es moverse o cambiarse de directorio. Para cambiarse o moverse de
directorio se usa el comando cd, que tiene cuatro modos de sintaxis diferentes:
cd nombreDirectorio Si se le da un nombre de
directorio el comando CD mira dos casos: si el nombre dado En U N IX ..
subdirectorio que es un
comienza con el smbolo / entonces el nombre es absoluto de existe dentro
cada
y el comando cd intenta buscar el directorio a partir de la raz mgicamenditerectorio y que
ap un ta al
absoluta de la jerarqua de directorios; si el nombre dado directorio que
contiene al
presente!
comienza con otra cosa el comando cd intenta buscar el
directorio destino a partir del directorio actual, como si fuera
un subdirectorio de donde el usuario est ubicado presentemente.
cd ~ Si se le da como argumento el smbolo ~, el comando cd averigua cul es el
directorio inicial o personal del usuario que lo est invocando, e intenta moverse
a dicho directorio personal.
cd - Si se le da el smbolo -, el comando cd averigua cul fue el ltimo directorio
donde el usuario estaba antes de moverse al actual e intenta moverse a dicho
directorio previo.
cd Si se usa el comando cd sin argumentos, el comando asume que se invoc
cd ~ y busca el directorio personal o inicial del usuario que lo est invocando,
para intentar moverse all.
Ejemplos:
e@abe:e/> pwd
/home/e (el usuario inicia en su directorio personal)
e@abe:e/> cd /home
e@abe:home/> pwd
/home (el usuario ahora est en un directorio que se busc desde la raz)
e@abe:home/> cd ..
e@abe:/> pwd
/ (el usuario ahora est en un nivel superior)
e@abe:/> cd usr
e@abe:usr/> pwd
/usr (el comando busc a partir del directorio donde estaba ubicado)
e@abe:usr/> cd /home/e
e@abe:e/> pwd
/home/e (el comando puede navegar varios niveles en un solo paso)
e@abe:e/> cd -
/usr (reporta a dnde llevar, como se verificar)
e@abe:usr/> pwd
/usr (el comando cambi al usuario a donde estaba antes)
e@abe:usr/> cd
e@abe:e/> pwd
Nota: Siendo un sistema multiusuario con una arquitectura de seguridad, los permisos de
los directorios definen qu usuarios pueden entrar o deambular por cada uno.
Como cada usuario quiere organizar su informacin de la manera que ms prctica le parece,
existe el comando para crear nuevos directorios. Es un comando muy sencillo con el que se
pueden crear directorios donde se tengan permisos, y en un UNIX tpico no se manejan
permisos poder crear directorios, slo se manejan poder escribir en un directorio, con
ste ltimo es suficiente para poder crear directorios!.
El comando es sencillo:
mkdir nuevoDirectorio
Como todos los comandos, si el nombre del nuevo directorio no comienza con el smbolo /
el comando intentar crear el nuevo como subdirectorio del directorio actual.
Adicionalmente, con sas sintaxis, si al comando se le da toda una ruta o camino jerrquico,
slo intentar crear como directorio el ltimo elemento de toda la ruta, todo lo otro ya
deber existir.
Ejemplo:
e@abe:e/> ls
LitteFile SubDir_2 smit.log smit.transaction
MadRamon 1.png fecha actual.txt smit.script subdir1
e@abe:e/> mkdir NuevoSubDir
e@abe:e/> ls
LitteFile SubDir_2 smit.script
MadRamon 1.png fecha actual.txt smit.transaction
NuevoSubDir smit.log subdir1
e@abe:e/> ls -l
total 88
-rw-r--r-- 1 e system 0 Aug 14 23:15 LitteFile
-rw-r--r-- 1 e system 17804 Aug 14 23:16 MadRamon 1.png
drwxr-xr-x 2 e system 256 Aug 15 21:05 NuevoSubDir
drwxr-xr-x 2 e system 256 Aug 14 23:17 SubDir_2
-rw-r--r-- 1 e system 29 Aug 14 23:15 fecha actual.txt
-rw-r--r-- 1 e system 10181 Apr 10 16:02 smit.log
-rw-r--r-- 1 e system 544 Apr 10 16:00 smit.script
-rw-r--r-- 1 e system 291 Apr 10 16:00 smit.transaction
drwxr-xr-x 2 e system 256 Aug 14 23:17 subdir1
e@abe:e/>
Otro ejemplo ms:
e@abe:e/> mkdir /tmp/ejemplo/mi_dir
mkdir: 0653-357 Cannot access directory /tmp/ejemplo.
/tmp/ejemplo: A file or directory in the path name does not exist.
e@abe:e/> mkdir /tmp/ejemplo /tmp/ejemplo/mi_dir
e@abe:e/> ls -ld /tmp /tmp/ejemplo /tmp/ejemplo/mi_dir
drwxrwxrwt 10 bin bin 8192 Aug 15 21:08 /tmp
Ejemplo:
e@abe:e/> mkdir dirA/dirB/dirC
mkdir: 0653-357 Cannot access directory dirA/dirB.
dirA/dirB: A file or directory in the path name does not exist.
e@abe:e/> mkdir -p dirA/dirB/dirC
e@abe:e/> ls -ld dirA dirA/dirB dirA/dirB/dirC
drwxr-xr-x 3 e system 256 Aug 15 22:19 dirA
drwxr-xr-x 3 e system 256 Aug 15 22:19 dirA/dirB
drwxr-xr-x 2 e system 256 Aug 15 22:19 dirA/dirB/dirC
As como se crean nuevos directorios, pueden borrarse los que ya no se necesiten. Toca
cumplir condiciones: deben tenerse los permisos suficientes, y adems, el comando rmdir
slo sabe borrar directorios vacos:
rmdir directorioVaco
Ejemplo:
e@abe:e/> rmdir dirA
rmdir: 0653-611 Directory dirA is not empty.
e@abe:e/> rmdir dirA/dirB/dirC
e@abe:e/> ls -ld dirA dirA/dirB
drwxr-xr-x 3 e system 256 Aug 15 22:19 dirA
drwxr-xr-x 2 e system 256 Aug 15 22:23 dirA/dirB
rmdir p /undir/segdir/tercdir/cuartodir
Ejemplo:
e@abe:e/> ls -ld dirA dirA/dirB dirA/dirB/dirC
drwxr-xr-x 3 e system 256 Aug 15 22:19 dirA
drwxr-xr-x 3 e system 256 Aug 15 22:25 dirA/dirB
drwxr-xr-x 2 e system 256 Aug 15 22:25 dirA/dirB/dirC
e@abe:e/> rmdir -p dirA/dirB/dirC
e@abe:e/> ls -ld dirA dirA/dirB dirA/dirB/dirC
ls: 0653-341 The file dirA does not exist.
ls: 0653-341 The file dirA/dirB does not exist.
ls: 0653-341 The file dirA/dirB/dirC does not exist.
e@abe:e/>
Archivos
En UNIX un archivo siempre se considera desde el punto de vista del sistema operativo-
como una secuencia de bytes sin estructura. En UNIX un archivo se encuentra y se accede a
travs de una estructura especial de disco por fuera del archivo que se llama nodo ndice o
ms comnmente inodo. En este inodo se encuentran los metadatos de cada archivo, as,
en disco, para UNIX el inodo tiene una estructura pero el archivo no.
Hay unas cosas que hacen especial el tratamiento de los archivos en UNIX:
En cada inodo hay un marcador de tipo, lo que define tipos de archivo. Ya se ha
mencionado, por ejemplo, que los directorios son un tipo de archivo.
Un archivo est atado a su inodo, y para un dado archivo no cambia jams,
hasta que se elimine del todo el archivo. Un archivo tiene un nico inodo y un
inodo da acceso (podra decirse apunta a) un nico archivo.
El nombre de un archivo est registrado en alguna (o algunas) tablas directorio,
donde hay una relacin de algn inodo con algn nombre, para cada archivo
contenido en el directorio. Un archivo puede tener de hecho muchos tienen
tpicamente- ms de un nombre, en un mismo o en ms de un directorio. En cada
inodo hay un contador de cuntos nombres tiene el archivo al que el inodo
apunta, sin incluir o mencionar cules son esos nombres ni dnde estn.
Temporalmente un archivo puede existir sin nombre, pero no es usable por las
aplicaciones mientras as est.
Existen archivos especiales en donde el inodo realmente se usa para apuntar y
dar acceso a piezas de hardware y funciones de software, pero que no apuntan a
archivos que guardan datos. Estos archivos especiales se usan exactamente
como se usan otros archivos.
Esta ltima particularidad es una caracterstica nica y muy poderosa de UNIX: los
diseadores originales intentaron que todo en el sistema pudiera accederse como se usan
El comando ls (list) realmente no lista archivos, lista directorios que lo que ms contienen
son archivos:
[255 e@Moe ~] ls
Desktop Library Pictures dlmgr_.pro
Documents Movies Public drbd.conf
Downloads Music Sites
Es claro que la mayora de las cosas dentro de un directorio son archivos, y que lo otro,
que casi siempre son directorios tambin son archivos.
Ahora, si se lista un archivo, a menos que se diga otra cosa, el comando lista el nombre del
archivo dado:
[0 e@Moe ~] ls drbd.conf
drbd.conf
El comando ls cuando tiene la opcin l presenta un listado largo, que incluye muchos
detalles de los archivos dados o contenidos en el directorio especificado (o contenidos en el
directorio actual si no se especifica nada).
Ejemplo:
e@abe:e/> ls -l
total 88
-rw-r--r-- 1 e system 0 Aug 14 23:15 LitteFile
-rw-r--r-- 1 e system 17804 Aug 14 23:16 MadRamon 1.png
drwxr-xr-x 2 e system 256 Aug 14 23:17 SubDir_2
-rw-r--r-- 1 e system 29 Aug 14 23:15 fecha actual.txt
-rw-r--r-- 1 e system 10181 Apr 10 16:02 smit.log
-rw-r--r-- 1 e system 544 Apr 10 16:00 smit.script
-rw-r--r-- 1 e system 291 Apr 10 16:00 smit.transaction
drwxr-xr-x 3 e system 256 Aug 15 21:15 subdir1
Es fcil reconocer del listado cules tems son archivos comunes: la primera columna tiene
un menos (-) como primer carcter. Tambin se puede notar:
La segunda columna es un nmero, es el nmero de nombres (oficialmente the
link count). Casualmente en el listado superior, todos los archivos comunes
tienen un nico nombre, como es tpico.
Todo archivo tiene un dueo, casi siempre quin cre originalmente al archivo.
Es lo que aparece en la columna tres (3) del listado.
Todo archivo tiene un grupo, casi siempre el grupo principal del usuario dueo.
Es lo que aparece en la columna cuatro (4) de un listado como el de arriba.
Los archivos comunes y los directorios tienen tamao. En los listados de ls l
aparecen en bytes.
El sistema maneja tres marcas de tiempo con fecha y hora por cada archivo (en
cada inodo):
o Fecha y hora de ltimo uso, sin importar cul uso. Se llama oficialmente
fecha de ltimo acceso o atime.
o Fecha y hora de la ltima modificacin de los contenidos. Se llama
oficialmente fecha de ltima modificacin o mtime.
o Fecha y hora de la ltima modificacin de los metadatos. Se llama
oficialmente fecha de ltimo cambio o ctime.
Como no est especificado en el estndar, la mayora de los UNIX no mantienen
una fecha de creacin, aunque muchos creen que s, ya que el nombre ctime es
fcil confundirlo con creation time.
Como para los sistemas UNIX un archivo es slo una secuencia de bytes sin un significado
especial, el sistema no incluye en s un comando crear archivo nuevo. Los archivos
normalmente se crean con la misma aplicacin que despus se usar para leer y/o procesar
la informacin que contienen. As para crear un nuevo archivo de audio se usa una aplicacin
de grabado o edicin de audio, para crear un documento hoja de clculo se usa una
aplicacin de hojas de clculo y as.
Sin embargo en el sistema viene un comando que cambia las fechas de los archivos (la de
ltimo acceso, la de ltimo cambio o de ltimo cambio del inodo), que casualmente si se le
da como argumento algn nombre de archivo que no existe, lo crea nuevo, archivo comn,
sin contenidos y le cambia la fecha puede invocarse de manera que no cree archivos si se
desea-.
Para crear un nuevo archivo puede usarse:
touch nombreNuevo
Ejemplos:
e@abe:e/> ls -l
total 88
-rw-r--r-- 1 e system 0 Aug 14 23:15 LitteFile
-rw-r--r-- 1 e system 17804 Aug 14 23:16 MadRamon 1.png
-rw-r--r-- 1 e system 0 Aug 16 17:22 NuevoVacio.txt
drwxr-xr-x 2 e system 256 Aug 14 23:17 SubDir_2
-rw-r--r-- 1 e system 29 Aug 14 23:15 fecha actual.txt
-rw-r--r-- 1 e system 10181 Apr 10 16:02 smit.log
-rw-r--r-- 1 e system 544 Apr 10 16:00 smit.script
-rw-r--r-- 1 e system 291 Apr 10 16:00 smit.transaction
drwxr-xr-x 3 e system 256 Aug 15 21:15 subdir1
e@abe:e/> cp "MadRamon 1.png" smit.log LitteFile
cp: LitteFile: The system call does not exist on this system.
e@abe:e/> cp "MadRamon 1.png" smit.log LitteFile subdir1
e@abe:e/> ls subdir1
Otras dos operaciones muy comunes en todos los ambientes son renombrar un tem, y
mover de sitio un tem. Ambas operaciones son lo mismo en UNIX, y por ello ambas se
hacen con el mismo comando, mv (move).
El uso de mv es bsicamente el mismo de cp, pero siendo otro, ste no deja copia.
En UNIX hay una operacin que no es posible hacer con los archivos en la mayora de los
otros sistemas: agregarle nombres a los archivos. La operacin es semejante a la de copiar
archivos, pero en este caso lo que queda no es un nuevo archivo con los mismos
contenidos, queda un nuevo nombre por el que se puede acceder a un archivo por eso
parece una copia, pero el archivo es uno solo-. UNIX no maneja casos especiales de primer
nombre o ltimo nombre, as que todos los nombres son equivalentes y ninguno es
principal.
Agregarle un nuevo nombre a un archivo individual
Se usa el comando ln (link) para agregarle nombres (oficialmente en UNIX se llaman links),
cuya sintaxis es muy parecida a la de cp y mv:
IMPORTANTE: Si
ln nombreOriginal nombreNuevo al comando
ln se le da como
nombre el de segundo
Dependiendo de cmo se usen los argumentos, los dos nombres pueden existente,
un archivo
si puede
estar en el mismo o en diferentes directorios, pero, los UNIX por lo sobreescribe ta
l archivo sin
general necesitan que ambos estn en el mismo contenedor fsico. consultar o adverti
r!
Como ambos nombres son un mismo archivo y un archivo tiene un
nico inodo, ambos nombres llevan al mismo inodo.
Como el sistema operativo usa esta operacin para mantener la estructura de rboles para
directorios, este comando no puede ponerle nombres adicionales a directorios.
Ejemplo:
e@abe:e/> ls -li
total 48
72 -rw-r--r-- 1 e system 0 Aug 14 23:15 LitteFile
180 -rw-r--r-- 1 e system 17804 Aug 14 23:16 MadRamon 1.png
179 -rw-r--r-- 1 e system 0 Aug 16 17:22 NuevoVacio.txt
12320 drwxr-xr-x 3 e system 256 Aug 16 18:00 SubDir_2
177 -rw-r--r-- 1 e system 29 Aug 14 23:15 fecha actual.txt
12288 drwxr-xr-x 3 e system 256 Aug 16 17:37 subdir1
12292 drwxr-xr-x 3 e system 256 Aug 16 17:59 subdir2
e@abe:e/> ln "fecha actual.txt" "dato viejo"
e@abe:e/> ls -li
total 56
72 -rw-r--r-- 1 e system 0 Aug 14 23:15 LitteFile
180 -rw-r--r-- 1 e system 17804 Aug 14 23:16 MadRamon 1.png
179 -rw-r--r-- 1 e system 0 Aug 16 17:22 NuevoVacio.txt
12320 drwxr-xr-x 3 e system 256 Aug 16 18:00 SubDir_2
177 -rw-r--r-- 2 e system 29 Aug 14 23:15 dato viejo
177 -rw-r--r-- 2 e system 29 Aug 14 23:15 fecha actual.txt
12288 drwxr-xr-x 3 e system 256 Aug 16 17:37 subdir1
12292 drwxr-xr-x 3 e system 256 Aug 16 17:59 subdir2
Como no se pueden tener dos nombres al mismo archivo en diferente contenedor fsico de
almacenamiento ni se pueden hacer enlaces tradicionales a directorios entonces en UNIX hay
otro estilo de enlace que se puede usar en todos los casos. Este otro estilo de enlace se llama
enlace simblico y es realmente un nuevo archivo, de tipo especial l que realmente apunta
al nombre del archivo original. Como es otro archivo ocupa espacio aparte y tiene su propio
inodo.
Cuando se crea un enlace simblico a un archivo no se le aumenta al archivo original la
cuenta de nombres que se almacena en el inodo. Cuando se borra un archivo enlace
simblico tampoco se afecta el original, pero cuando se borra el archivo original el enlace
simblico no sirve, porque sigue apuntando al nombre del archivo original que ya no existe.
Por otro lado, usar un enlace simblico realmente hace que el sistema operativo redirija la
operacin y los programas realmente usan el archivo original.
Agregarle un enlace simblico a un archivo individual
Se usa el comando ln con la opcin s para agregarle enlaces simblicos (oficialmente en
UNIX se llaman symbolic links pero tradicionalmente se usa symlinks), cuya sintaxis es muy
parecida a la de cp y mv:
ln s nombreOriginal nombreNuevo
Dependiendo de cmo se usen los argumentos, los dos nombres pueden estar en el mismo
o en diferentes directorios, o en reas totalmente diferentes del sistema.
Si el archivo original est en algn otro lado puede obviarse el segundo nombre, lo que hace
un enlace simblico nuevo en el directorio actual, que cuando se use haga acceso al archivo
original en algn otro lado:
ln s /ruta/nombreOriginal
Comando que un una sola operacin crea un enlace simblico llamado /directorio/
destino/archivo1 apuntando a /ruta1/archivo1, uno llamado /directorio/destino/
archivo2 apuntando a /ruta2/archivo2, y as sucesivamente.
Ejemplos:
e@abe:e/> date
Thu Aug 16 23:00:45 EST 2007
e@abe:e/> date > actual.txt
Se nota cmo editar los contenidos de actual.txt o de hoy.txt resulta en lo mismo, los
contenidos de actual.txt son los que cambian, pero se nota cmo no son el mismo archivo,
es ms actual.txt mide 29 bytes, pero hoy.txt mide 10 bytes (el nombre actual.txt son 10
caracteres).
Remocin de directorios
Hay que notar que para borrar directorios se usa el comando rmdir, pero que ste slo borra
directorios que estn vacos. Por eso el comando rm tiene una funcin adicional: la
posibilidad de remover directorios con todo lo que contienen es decir que borra aunque
no estn vacos-. Este es un comando muy peligroso, por favor fjese antes de enviar el
comando: rm R item1 item2
Ejemplo:
e@abe:e/> ls subdir2
Antiguo_SubDir LitteFile MadRamon 1.png smit.log
e@abe:e/> rm -R subdir2
e@abe:e/> ls subdir2
ls: 0653-341 The file subdir2 does not exist.
Como el nombre y los contenidos de un archivo en UNIX no tienen relacin directa, en UNIX
hay disponible que un comando que revisa los contenidos y haciendo un anlisis intenta
reportar qu clase de archivo es cada uno de los nombrados como argumentos. El comando
se llama file, y es de muy sencillo uso.
Ejemplos:
e@abe:e/> file LitteFile actual.txt
LitteFile: empty
actual.txt: ascii text
e@abe:e/> file subdir1
subdir1: directory
e@abe:e/> file /tmp
/tmp: directory
Archivos de Texto
Desde el comienzo UNIX se plane para trabajar texto, grandes cantidades de texto, por ello,
desde siempre ha habido muchas utilidades para el manejo de texto. De todas las utilidades
para el manejo de texto la central es la herramienta de creacin de contenido y de edicin-:
el editor de texto.
Editores de Texto: vi
En UNIX se cuenta con mltiples editores de texto, que varan de plataforma a plataforma,
pero hay unos que estn estandarizados en los libros POSIX y en la especificacin UNIX oficial
(la ltima siendo Single UNIX Specification v3 o UNIX 03), de stos el ms A
mediados de los
importante es vi. Este editor, llamado por el comando que lo invoca toma por la poc setentas
a en que aparec
i
el nombre de un editor anterior llamado ex, que era una versin vi- se usaba m
ucho
de texto avanza un editor
moderna de otro anterior con el cual mantiene la compatibilidad infinidad de com
do con una
binaciones de
llamado ed-. En ex, usar el comando vi lleva al modo visual de edicin teclas y casi cualquier
secu cia de cara
normalmente se trabaja a travs de comandos, parecidos a las actuales comanendo cteres com
s. Su nombre o
macros de los editores de ambiente grfico-. El modo visual de ex es TECO. es
Editar archivos de texto ya existentes con vi es muy sencillo, simplemente se puede abrir
uno con vi nombreArchivo o se pueden abrir varios simultneamente dndolos todos como
argumentos como siempre, separados por espacios-:
vi archivo1 archivo2 archivo3
Crear nuevos archivos de texto con vi es muy sencillo, se hace de la misma manera como se
abren archivos existentes, simplemente se nombra o nombran en la lnea de comandos, y si
vi nota que no existe cada uno- se prepara para crearlo, nuevo. Ahora vi realmente no crea
el archivo si no en el momento que se guarde.
vi nombreNuevo
Como se observa, vi muestra una pantalla llena de smbolos ~, donde cada smbolo ~
representa una lnea no existente en el archivo. Tambin vi muestra informacin en la lnea
de estado:
Nombre del nuevo archivo a crear, entre comillas dobles
El texto informativo [New file]
Para salir del archivo o los archivos se usa el mismo comando que antes :q (dos puntos q)
Ahora, como los archivos nuevos no existen realmente si no cuando se guarden en disco, hay
que guardar, y esta operacin se realiza con el comando :w (dos puntos w) por archivo.
Cuando vi guarda un archivo, reporta en la lnea de estado el nombre del archivo guardado,
entre comillas dobles, el nmero de caracteres y el nmero de lneas en el archivo recin
guardado. Ahora, si el usuario puede sobreescribir un archivo por ejemplo es el dueo del
archivo- pero los permisos del mismo dicen que debera estar protegido, cuando se intente
guardar vi reportar The file has read permission only, pero podr escribirse de todas
maneras sobre el archivo si se usa el comando :w! (dos puntos w admiracin).
Entrar nuevo texto en vi es muy fcil. Existen varias maneras, dependiendo de dnde se est
y de dnde se quiere que aparezca el nuevo texto agregado. En modo comando funcionan:
i para insertar texto justo antes de la posicin del cursor. Agrega texto si se est al
final de una lnea.
a para agregar texto justo despus de la posicin del cursor.
shift i para insertar texto al comienzo de la lnea sin importar dnde est el
cursor en la lnea.
shift a para agregar texto al final de la lnea sin importar dnde est el cursor en
la lnea.
o para agregar una lnea en blanco despus de la actual.
Todos estos comandos cambian el modo de vi, apenas se usen vi se cambia a modo
insercin de texto y as permanecer. Puede cambiarse al modo comando usando la tecla
escape.
vi tiene unos comandos sencillos para modificar texto, son necesarios en las operaciones del
da a da con texto. Funcionan cuando se est en modo comando:
x para borrar el carcter debajo del cursor. Borra el carcter a la izquierda del
cursor si se est al final de la lnea.
X para borrar el carcter anterior al cursor. Borra el carcter debajo del cursor si
se est al comienzo de la lnea.
r y un carcter para reemplazar el carcter debajo del cursor por el que se escriba
a continuacin.
R y texto para sobreescribir un texto original. Si se escriben n caracteres se
sobrescribirn los n caracteres a partir de la posicin del cursor. Se termina la
sobreescritura presionando escape.
. para repetir la ltima operacin, sin importar cul operacin de edicin haya
sido.
u para deshacer el ltimo cambio o edicin hecha.
/texto para ir a la prxima lnea que contenga el texto dado (busca hacia
adelante o abajo). Si el texto no se encuentra vi reporta The pattern does not
exists.
?texto para ir a la previa lnea que contenga el texto dado (busca hacia atrs o
arriba). Si el texto no se encuentra vi reporta The pattern does not exists.
d} corta desde donde est el cursor hasta el final del prrafo actual
y} copia desde donde est el cursor hasta el final del prrafo actual.
p pega los contenidos del tablero de recortes justo despus de donde est el
cursor. Si son lneas pega justo despus de la lnea actual.
P pega los contenidos del tablero de recortes justo antes de donde est el
cursor. Si son lneas pega justo antes de la lnea actual.
:e! re-abre para edicin el archivo actual, descartando todos los cambios hechos
que no hayan sido guardados
:e+ otroArchivo abre para edicin el archivo mencionado, y automticamente se
ubica al final del mismo (se abre el archivo para agregar contenido).
:e+nmero otroArchivo abre para edicin el archivo mencionado, y
automticamente se ubica en la lnea nmero especificada. Si otroArchivo
puede abirse pero no tiene tantas lneas como para ubicarse en la lnea
especificada lo abre pero reporta Not that many lines exist in the file.
:e# vuelve a abrir el otro archivo, el ltimo que se estaba editando.
:r otroArchivo importa otro archivo en el que se est editando, es decir lee las
lneas del otroArchivo y las inserta justo despus de la lnea actual en el archivo
que se est editando.
:r !unComando ejecuta unComando, y las lneas de texto producidas por el
comando las inserta justo despus de la lnea actual en el archivo que se est
editando.
El editor de texto vi tiene una serie de opciones que gobiernan cmo funciona. Estas
opciones gobiernan cmo reacciona a los comandos, como muestra contenido en la pantalla
y cmo se manipulan las lneas de texto.
Para ver las opciones actualmente en efecto en vi se usa el comando :set all como se
muestra a continuacin:
Como puede apreciarse, hay muchas opciones, pero no todas son de uso comn. Entre las
ms tiles estn:
autoindent (ai) opcin que activa la indentacin automtica de las nuevas
lneas de texto, para alinearlas con las inmediatamente anteriores. Para desactivar
la funcin se usa noautoindent o noai.
autowrite (aw) opcin que activa el grabado automtico de un archivo antes
de cambiarse al siguiente en una sesin. Para desactivar la funcin se usa
noautowrite o noaw.
beautifying text (bf) opcin que activa la proteccin de los archivos para
que no se puedan insertar caracteres de control en el mismo. Para desactivar la
funcin se usa nobf.
ignorecase (ic) opcin que hace que el editor ignore la diferencia entre
maysculas y minsculas en las bsquedas y los reemplazos. Para desactivar la
funcin se usa noignorecase o noic.
wraptype (wt=) opcin con la que se configura cmo corta y fluye las lneas
vi cuando una lnea sea ms larga que el margen especificado con wm=. Tiene
cuatro posibles valores general, word, rigid, y flexible.
A todas estas opciones pueden drsele valor en cualquier momento, usando :setopcin o
tal vez :set opcin=valor. Cuando as se usa, la opcin slo aplica para la sesin actual de
edicin, es decir, que si se sale del editor vuelven a aplicar los valores predeterminados.
Si se desea que vi tenga una cierta configuracin y que dicha configuracin aplique para
todas las invocaciones del editor hay que guardarlas en un archivo de configuracin. vi
nunca guarda las opciones automticamente, el archivo debe ser creado.
Cuando vi se ejecuta, a menos que se le de la opcin para que no lo haga, busca el archivo /
etc/.exrc, si lo encuentra carga las opciones de configuracin que all encuentre; luego
busca el archivo .exrc en el directorio personal o inicial del usuario, si lo encuentra carga las
Recuerde que como el archivo debe llamarse .exrc normalmente no aparecer en los
listados (el nombre comienza con punto).
El ambiente de trabajo
&$'
&$' &$'
&$'
.!()/" 6#;-<1&
6#;-<1&
((23!"456
%&0$&%1
(!)*"+,-$
23(/"#$&%1 &$'
6#;-<1&
6#;-<1&
6#;-<1& &$'
&$'
!())(!"456
!())(!"456
2!(7!"189:,
Los sistemas operativos UNIX tienen todos una arquitectura de ejecucin donde cada
instancia de comando o programa que se ejecuta en el sistema obtiene una vista de un
universo virtual, donde l es el nico programa en ejecucin. Ahora, en la realidad todos
los UNIX son sistemas multitarea y multiusuario, y por ello, dentro de esa arquitectura hay,
por cada programa en ejecucin que oficialmente se llama proceso- un espacio que se
llama el ambiente.
El mencionado ambiente es un rea de memoria que existe dentro del universo virtual de
cada proceso. En dicho ambiente escribe el cargador de procesos unos valores que
definen cmo reacciona el programa al universo virtual y cmo reacciona el sistema
operativo ante lo que el proceso le solicita. Lo que hay en el ambiente son valores guardados
a manera de variables, aunque no todos los valores que all se encuentra se consideran
variables en s. Como cada proceso ve al sistema como todo para s, ya que lo que tiene es
una vista que le arma un universo virtual propio, no hay manera de hacer que un proceso
directamente altere los valores que hay en el ambiente de otro proceso.
Algunos de los valores que estn en el ambiente oficialmente llamado environment- de un
proceso son fciles de revisar por el proceso, ya que estn en casillas nombradas con
nombre y con valores que se consideran texto. Estos pares se llaman variables de
Como cada proceso es una instancia de un programa o comando en ejecucin, cada proceso
en el sistema necesita de algo de CPU (por lo menos uno turnos cuando no consume
mucho), cierta cantidad de RAM, y hace ciertas operaciones de I/O. Todo proceso en el
sistema afecta en algo, entonces puede al usuario interesarle:
Sus propios procesos cunto afectan a los dems.
Cun afectado se ven sus propios procesos afectados por lo que hacen los
procesos de los dems.
Ntese que cmo afectan a los dems y cmo son afectados por los dems es el resultado
indirecto de estar en el mismo sistema, no es algo directo porque los UNIX son un ambiente
protegido de ejecucin, que no permite que un proceso pueda manipular directamente el
ambiente donde otro proceso existe y se ejecuta.
Iniciar y detener procesos
Como un proceso es una instancia de programa y comando en ejecucin, iniciar un proceso
es simplemente invocar un comando o iniciar un programa. Este slo hecho inicia al menos
un proceso algunos programas cuando inician ejecutan otros programas accesorios que
necesitan para funcionar-. Detener oficialmente un proceso en UNIX es decirle a un
programa que termine de la manera que al programa se le dice. Por ejemplo: la mayora de
lo que uno llama comando es un programa que realiza una tarea sencilla, y cuando el
programa termina dicha tarea el slo programa termina, sin necesidad de solicitarle. Como
un proceso es un programa en ejecucin, si un programa termina, el proceso que lo
representa desaparece de la lista de procesos. Por otro lado, programas como vi, que trabaja
interactivamente necesita que se le diga termine usando algn tipo de comando interno o
men; en el caso de vi, se le dice usando el comando escape :q! o escape :x!
Como se puede observar la lista puede llegar a ser muy grande habindose extrado la
informacin de una estacin de trabajo bsicamente con un nico usuario-.
Acerca de las columnas: %CPU
La columna %CPU del comando ps -aux muestra un promedio porcentual de lo consumido
en turnos de CPU por cada proceso desde el momento en que se inici. Como cada proceso
inicia y consume CPU- desde un momento del tiempo diferente, los porcentajes no se
refieren a los mismos momentos del tiempo y por ello las sumatorias o cualquier otro
clculo no tienen que sumar un valor especfico. Adicionalmente, si un proceso lleva das de
iniciado y casi nunca ha consumido pero ahora ltimo consume bastante el promedio no lo
indicar. As que esta columna no es un indicador definitivo de cules procesos afectan ahora
Los UNIX son sistemas multitarea y multiusuario, por ello, aunque no lo parezca al usuario
desprevenido, pueden an desde una nica ventada de terminal o de sesin, iniciarse
mltiples procesos, aunque normalmente no visibles simultneamente como se puede en un
ambiente grfico multi-ventanas.
Mientras todo sigue, el comando terminado en & se ejecuta sin acceder a la terminal (ni
teclado ni control de pantalla). Ntese que los sistemas UNIX pondrn a un proceso de fondo
en pausa automticamente si y cuando intente controlar la terminal de sesin (por ejemplo
especificando posicin, colores o atributos a un aviso de texto) o si intenta leer de la
terminal (el teclado se mantiene ocupado con lo que el usuario est trabajando
interactivamente).
Listar procesos de fondo
Para listar los procesos de fondo asociados con trabajos iniciados desde ventana de sesin
actual se usa el comando jobs. Es muy sencillo:
[0 e@Moe ~] ping -q localhost &
[1] 1158
[PING localhost (127.0.0.1): 56 data bytes esta es salida del comando
[0 e@Moe ~] jobs
[1]- Running ping -q localhost &
[2]+ Stopped vi
[0 e@Moe ~]
Como se observa, de manera predeterminada muestra tres (3) columnas:
La primera columna muestra el nmero del trabajo (entre smbolos []). Esta
columna tiene anexa adems un ms (+) o un menos (-). El smbolo se usa para
Para enviar una seal se usa kill seal nmeroProceso o para enviar una seal a una
tarea se usa kill seal %nmeroTarea. Para enviar una seal a todo un grupo de procesos
se usa kill seal nmeroGrupo.
Las seales, en el comando kill, pueden especificarse usando el nmero obtenido del
listado, el nombre completo (tambin obtenido del listado) o el nombre cortado, sin el
prefijo SIG.
Acerca de las seales
Algunas de las seales son tpicas o estn estandarizadas:
La seal 1, HUP o SIGHUP (hang up) es enviada automticamente por el sistema a
todos los procesos del grupo relacionados con una ventana de sesin que ha sido
Muchos procesos en UNIX necesitan de los valores en las variables de ambiente para
funcionar o simplemente para hacer lo correcto o lo que se espera; adicionalmente, muchos
de los programas en UNIX necesitan invocar subprogramas sencillos para realizar su labor (el
editor vi no sabe corregir ortografa o imprimir, por ejemplo). La manera ms sencilla de
pasar informacin en estos casos es una manera estandarizada en UNIX: un proceso puede
seleccionar la informacin inicial del ambiente de con la que todos sus procesos hijos inician
prcticamente no se puede seleccionar la informacin relacionada directamente con la
seguridad-.
Cuando se trata del intrprete de comandos shell un programa que casi lo nico que hace
es invocar subprogramas-, hay cmo fcilmente revisar las variables del ambiente donde est
trabajando y cmo seleccionar la informacin que copia a sus subprogramas hijos.
Una variable de ambiente como se ha mencionado es un valor limitado bsicamente por la
memoria disponible en el sistema- considerado como texto, manejado a travs de una
etiqueta o nombre de variable. Como muchsimas otras cosas en UNIX, se diferencia entre
maysculas y minsculas.
Como puede observarse las variables de ambiente que se copian a los procesos hijos son un
subconjunto de las variables de ambiente del shell. Esta no es la situacin para los otros
programas.
Como se observa simplemente se nombra una variable y se una con un valor por medio de
un smbolo de igual (=) sin espacios alrededor. La variable asume un valor nico, por lo que
nicamente se puede asignar un valor. Si se necesita insertar un valor multi-palabra en una
variable se ponen comillas sencillas o dobles dependiendo exactamente de lo que se
necesite hacer- alrededor de los valores mltiples, para que se entienda como un nico
valor:
nombreVar1=valor multi palabras
Note que si la variable nombrada con nombreVar1 no existe se crea con la ejecucin de la
sentencia anterior, pero si la variable previamente exista simplemente se reusa pero se le
define un nuevo valor, con lo que el valor anteriormente guardado en la variable se pierde
definitivamente.
Las variables del intrprete shell existen nicamente en memoria, con lo que el lmite de lo
que se puede almacenar en una variable est limitado por la memoria disponible en el
sistema, y adems, los valores almacenados en las variables se pierden cuando se cierre el
intrprete shell o termine la sesin.
(*,
!"#$%&'()*('+
(*,
-./01+(
Para que un proceso pase variables a otros procesos deber cumplirse una nica condicin:
como los sistemas UNIX son de memoria protegida lo nico factible es pasar copias de ciertas
variables de ambiente a los procesos hijo nuevos, justo en el momento de la creacin de los
procesos hijo-. Cuando se trata del intrprete de comandos shell se especifica qu
subconjunto de las variables del ambiente del shell se copiarn a los comandos ejecutados,
comandos que inician procesos hijo. Existen dos maneras:
Una copia de cada una de las variables de la lista de exportadas es recibida en el
ambiente por cada uno de los procesos hijos de intrprete o shell.
Puede especificarse un juego de variables con valor en la lnea de comandos que
inicia un nuevo proceso. Estas variables son insertadas en el ambiente del nuevo
proceso aunque no hacen parte del ambiente del intrprete de comandos.
Note que las variables no exportadas slo existen en el ambiente del intrprete y por eso
ningn otro proceso o comando tiene acceso a las mismas o los valores contenidas en ellas.
Paso de variables nuevas no preexistentes en el intrprete
Si necesita insertar una o algunas variables en el ambiente de un nuevo proceso desde el
intrprete shell sin que hagan parte del ambiente del shell se usa una sintaxis muy clara:
nombreVar1=valor1 nombreVar2=valor mltiple2 comandoNuevo
/(97) (*,
(*'8(:7+7
$ "&1*1'
(*,
(*,
"
$-5$5&.1))
#
67,384(*,178
!"#$%&'()*('+ /(97) /(97)
(*'8(:7+7
(*,
01234+(
"#"$-"&./0
Dada la arquitectura de procesos de los sistemas Unix, todas las seales (las mencionadas
cuando se habl del comando kill) que se envan a un proceso lder de grupo son enviadas
no solo al proceso lder, si no que son directamente heredadas por sus El proceso init
procesos hijos. seales a proces no enva
os a m enos
que el originador
y el destino
As, cuando un usuario tiene una sesin de terminal remota usando SSH ejecuten bajo
un mismo
usuario o el orig
contra un servidor Unix. y en la misma inicia al editor vi, tiene no un usuario root.
inador sea el
proceso, si no un grupo de procesos:
Un proceso SSHD que recibe la conexin en el servidor requerida por el cliente
SSH remoto.
Un intrprete de comandos en el servidor UNIX.
Una instancia del editor vi, en la misma sesin de terminal.
Si en la mquina cliente se cierra la ventana de terminal remota, como el sistema detecta la
falla en la conexin TCP/IP, genera y enva una seal hang up o SIGHUP al proceso lder de
grupo, en este el sshd que recibe la sesin en el servidor. Como es todo un grupo de
procesos, la seal SIGHUP se le enva tambin al intrprete de comandos y al editor de texto,
todo simultneamente.
Uso del comando kill para el envo de seales a grupos de procesos
Para enviar seales a todo un grupo de procesos se usa la sintaxis:
kill s nombreSeal procesoLder
o
kill nmeroSeal procesoLder
La primera sintaxis enva la seal seleccionada por nombre con la opcin s a todos los
procesos de un grupo, iniciando con su procesoLder, y a todos sus descendientes,
simultneamente.
La segunda sintaxis enva una seal seleccionada dado su nmero a todo un grupo,
iniciando con un proceso lder, y a todos sus descendientes, simultneamente.
La tercera sintaxis enva la seal predeterminada 15 o TERM al lder de un grupo y a todos
sus descendientes, simultneamente.
+$3<=(>$3==
!"#$%&'()$*+,-(.$/0
+$*+,-(>$?4>
;/3%
+$3<=(>$3==
+$,-,(>$/0
@ ,39:%
!"#$122%()$3440(.$565078 +$3<=(>$3==
+$*457(>$?,33
,39:%
Cada instancia de un programa en ejecucin es una tarea diferente. Cada una de esas
tareas se denomina proceso, y cada proceso est compuesto en memoria por varias
secciones. Una de esas secciones, a manera de encabezado de proceso se llama ambiente
(environment). Dentro de el ambiente del proceso hay numerosas variables que afectan cmo
funciona el proceso en s.
Desde el punto de vista de la seguridad, para controlar qu puede y qu no puede hacer un
proceso se tienen dentro del ambiente de cada uno unas variables crticas: una variable tiene
el nmero interno del usuario bajo el que el proceso est en ejecucin, y otra variable tiene
una lista de nmeros internos de grupos a los que est afiliado el proceso porque cuando
inici el usuario estaba afiliado a los mencionados grupos. Cada llamado a sistema, como
abrir archivo, leer archivo, escribir en archivo, enviar paquete, pedir memoria,
cambiar la hora, tiene unas caractersticas que definen quin puede usar dichos llamados a
funcin. Con este esquema el funcionamiento multitarea con permisos y privilegios est
asegurado y funciona.
Aunque puede verse un poco complicado en la teora y en el esquema, en la prctica es
sencillo y se mostrar cmo se usa ms adelante. Slo hay que tener en cuenta:
Todo el esquema de seguridad se basa en nmeros: nmero de usuario, nmeros
de grupo, no en los textos que son el nombre de un usuario y los nombres de los
grupos.
+$3<=(>$3==
!"#$%&'()$*+,-(.$/0
+$*+,-(>$?4>
;/3%
+$3<=(>$3==
+$,-,(>$/0
@ ,39:%
!"#$122%()$3440(.$565078 +$3<=(>$3==
+$*457(>$?,33
,39:%
Cuando un proceso trata de ejecutar un llamado a sistema se validan dos cosas: si es una
funcin comn y sin limitaciones o si es una funcin restringida; o si es una funcin que
accede a algo que tiene permisos.
Algunas funciones se consideran restringidas y slo estn disponibles a los procesos que se
ejecutan bajo la identidad del usuario root nicamente. Dentro de estas funciones estn
pero no siendo una lista exhaustiva-:
Conectarse a un puerto TCP o UDP local que tenga nmero inferior a 1024.
Enviar o recibir paquetes IP con transportes diferentes de TCP y de UDP (OSPF,
ICMP, etc).
Manipular la fecha, hora o el huso horario del sistema.
Hacer ms prioritario un proceso, propio o ajeno.
Manipular cualquier informacin de un proceso de otro usuario.
Acceder al hardware directamente.
Ejecutar un proceso con la identidad de otro usuario sin conocer la contrasea
del mismo.
Ninguno de los llamados a funcin del sistema mencionados arriba es ajustable o
parametrizable para que su seguridad se maneje diferente. Siempre se manejan tal como se
describen.
-*&$#+,(./#,,0 5#&1,(./*6*0"3
*"8&#+06
$&)+0
1"#7
5#&1,*(7&48+,4$9"*
1#+40% *;&0),<4
-*&$#+,*(1#,0"2+),*
$)3+4/0#&"
:0#,*(2#&1,*
*0$77
!"#$#%&'$()"(&*&$#+,* !"#$#%&'$()"(2#&1,*
De todos los usuarios del sistema hay slo uno que es especial, se usuario es el de UID
igual a cero (0) siempre, independientemente del nombre de usuario (username) que tenga.
A este usuario el sistema nunca le forza el cumplimiento de los permisos, sus procesos
pueden invocar cualquier llamado a funcin del sistema y puede intervenir en lo que hacen
los procesos de cualquier otro usuario. La cuenta del usuario cero no se bloquea
automticamente por intentos fallidos de autenticacin.
Existe un grupo en el sistema que puede invocar numerosos llamados a funcin del sistema,
aunque no puede saltarse la seguridad. Este grupo de nmero cero ya est creado cuando el
sistema es instalado, puede administrar numerosas cosas en el sistema y lleva por nombre
system. Cuando el sistema est recin instalado, slo un usuario pertenece al grupo system,
este usuario es root. Los usuarios que pertenecen al grupo system pueden instalar, actualizar
Grupo adm: Los usuarios asignados a este grupo pueden tomar estadsticas
bsicas del sistema, pueden ver los reportes generados por la ejecucin del
sistema de contabilidad de comandos y pueden manipular la programacin de
tareas y a cron. Inicialmente este grupo est vaco.
Grupos internos: Existen otros grupos para uso interno del sistema. A estos
grupos como el grupo bin- no deben asignarse usuarios porque se compromete
la integridad del sistema.
Adicionalmente existe creado en el sistema desde el comienzo un grupo llamado staff, sin
ningn tipo de privilegios al que se asigna todo usuario que se cree y al que especficamente
no se le asigne un grupo.
Cuando se usa el comando, la primera columna incluye un campo de diez caracteres que si
inician en guin (-), este rengln es efectivamente un archivo.
Los permisos de un archivo se interpretan de la siguiente manera:
Si en la terna de permisos que aplica para el proceso hay una r, el proceso s
tiene permisos para leer los contenidos del archivo en cuestin. Si no hay una r si
no un guin en la primera posicin, el proceso no tiene permisos para leer los
contenidos.
Si en la terna de permisos que aplica para el proceso hay una w, el proceso s
tiene permisos para escribir o cambiar los contenidos del archivo en cuestin. Si
no hay una w si no un guin en la segunda posicin, el proceso no tiene permisos
para escribir en los contenidos.
Si en la terna de permisos que aplica para el proceso hay una x, el proceso s
tiene permisos para usar el archivo y sus contenidos como si fuera un programa,
es decir invocar o ejecutar el archivo. Si no hay una x si no un guin en la
tercera posicin, el proceso puede usar al archivo como datos nicamente.
Las propiedades externas de un archivo, que se ven con el comando ls l archivo a
excepcin del nombre- son cambiables nicamente si la identidad con la que est ejecutando
el proceso en cuestin es la misma que la que tiene el archivo. Es decir las propiedades slo
las manipula el dueo de un archivo independientemente de los permisos que tenga.
Para saber cul de la terna de permisos aplica a un proceso se sigue el siguiente
razonamiento:
Cuando se usa el comando, la primera columna incluye un campo de diez caracteres que si
inician en la letra d, este rengln es efectivamente un directorio.
Los permisos de un directorio se interpretan de la siguiente manera:
Si en la terna de permisos que aplica para el proceso hay una r, el proceso s
tiene permisos para listar lo que hay en el directorio en cuestin. Si no hay una r
si no un guin en la primera posicin, el proceso no tiene permisos para listar los
contenidos del directorio.
Si en la terna de permisos que aplica para el proceso hay una w, el proceso s
tiene permisos para cambiar el listado que es el directorio. Si no hay una w si no
un guin en la segunda posicin, el proceso no tiene permisos para modificar el
listado que es el directorio. Poder cambiar los listados que constituyen al
directorio implica crear, renombrar, borrar archivos y directorios contenidos en el
directorio en cuestin.
Si en la terna de permisos que aplica para el proceso hay una x, el proceso s
tiene permisos para pararse dentro del directorio con el comando cd (o
equivalente), o para pasar por l para llegar a un subdirectorio. Si no hay una x
si no un guin en la tercera posicin, el proceso no puede ni pararse en el
directorio ni pasar por l para llegar a un subdirectorio.
Las propiedades externas de un directorio, que se ven con el comando ls ld archivo a
excepcin del nombre- son cambiables nicamente si la identidad con la que est ejecutando
el proceso en cuestin es la misma que la que tiene el directorio. Es decir las propiedades
slo las manipula el dueo de un directorio independientemente de los permisos que tenga.
Para saber cul de la terna de permisos aplica a un proceso se sigue el siguiente
razonamiento:
Para cambiar los permisos de un archivo o directorio o de varios a la vez- se usa el comando
chmod. La sintaxis del mismo es sencilla:
Intentar agregar una letra de permisos que ya tiene o intentar una letra de permisos que un
archivo no tiene no es error.
As, como en el ejemplo, si un archivo tiene permisos rw-r----- y se usa chmod u+x,
agregar una x en la terna del usuario y quedar rwxr-----.
Ntese que el comando chown slo puede ser invocado por el usuario root, no puede ser
usado ni por el dueo actual del archivo en UNIX. Es decir, la propiedad de un archivo no
puede ser entregada, slo root puede cambiarla.
Ntese que el comando chgrp puede ser invocado por el usuario dueo de un archivo, pero
que el grupo que se vaya a asignar debe ser uno de los asignados al usuario dueo. Cuando
el usuario root usa chgrp para cambiar el grupo, puede asignar un grupo
cualquiera hasta uno inexistente- an uno no asignado al dueo del Un usuario pued
e co
archivo en cuestin. qu grupos est nocer a
invo asignado
cando el comando
groups. sencillo
juancho@abe:/home/juancho> whoami
juancho
juancho@abe:/home/juancho> ls l /etc/security
ls: /etc/security: The file access permissions do not allow the specified
juancho@abe:/home/juancho> su
roots password: ********* (texto escrito no visible)
juancho@abe:/home/juancho> whoami
root
juancho@abe:/home/juancho> id
uid=501(juancho) gid=0(system) groups=1(staff),7(security),9(printq),10(audit)
juancho@abe:/home/juancho> ls l /etc/security
total 6656
-rw------- 1 root security 14 Jan 31 12:23 .ids
-rw-rw---- 1 root security 254 Jun 21 2004 .profile
juancho@abe:/home/juancho> exit
juancho@abe:/home/juancho> whoami
juancho
juancho@abe:/home/juancho> su
roots password: ******** (texto escrito no visible)
root@abe:/> whoami
root
root@abe:/> id
uid=0(root) gid=0(system) groups=2(bin),3(sys),7(security),8(cron),10(audit)
root@abe:/> exit
juancho@abe:/home/juancho
Si se necesita acceder a unas funciones del sistema slo por un momento y se conoce la
contrasea de la cuenta de otro usuario que s tiene permiso para ejecutar dichas funciones
del sistema no es necesario desconectarse.
Todo sistema UNIX inclusive AIX- incluye la funcin sustituir usuario a travs del comando
su. ste es fcil de usar.
Si se invoca el comando
su usuarioDestino
El intrprete de comandos
As, puede uno ahorrar escribir un nombre largo como pl-insert_new_student.sql cuando
haya que editarlo si uno usa algo como vi *new_st*sql, o si uno sabe que slo hay un
nombre parecido simplemente vi *student.sql. Y esto notando que vi no interpreta
comodines en la lnea de comandos, el shell siempre interpreta los comodines antes de
iniciar la ejecucin de lo que unos escribe!
Los comodines en el intrprete estndar Posix, como ya se mencion son:
* ? [ - ! ]
Note que la interpretacin siempre la hace el shell, no ls. Se usa ls nicamente porque es
til como comando sin efectos negativos colaterales.
Comodn amplio * (cualesquiera caracteres del nombre)
El segundo comodn ms bsico es el smbolo *. Este se interpreta al usarlo dentro de un
nombre de archivo existente como cualesquiera caracteres del nombre, incluyendo no
caracteres, y exceptuando el punto inicial del nombre de los archivos ocultos.
Ejemplos:
e@abe:e/> ls
LitteFile archivoA.txt fileA.c fileG
MadRamon 1.png archivoAB.txt fileA.cob fileH
NuevoVacio.txt archivoE.txt fileA.txt fileI
actual.txt archivoZ.txt fileB nuevoArchiv2.txt
archivo A.txt archivoaB.txt fileC procesos.txt
archivo.part.txt archivoab.txt fileD ramon.txt
archivo.txt dato viejo fileE subdir1
archivo23.txt fechaActual.txt fileF
e@abe:e/> echo file*
fileA.c fileA.cob fileA.txt fileB fileC fileD fileE fileF fileG fileH fileI
e@abe:e/> echo archivo*.txt
archivo A.txt archivo.part.txt archivo.txt archivo23.txt archivoA.txt
archivoAB.txt archivoE.txt archivoZ.txt archivoaB.txt archivoab.txt
e@abe:e/>
Como puede observarse, con la primera ejecucin se especifica seleccionar todos los
archivos cuyo nombre comienza con file y el resto del nombre puede ser cualquier cosa -
incluso nada-; en este ejemplo aparecen archivos que tienen una letra en la parte
seleccionada por *, pero tambin archivos que tienen una letra un punto y un sufijo variable;
en el segundo ejemplo se especifica seleccionar todos los archivos cuyo nombre comienza
con archivo luego tiene un * para indicar que pueden ser cualquier cantidad de cualesquiera
caracteres -incluso nada- y luego un punto y el sufijo txt, en este ejemplo aparecen archivos
que no tienen nada entre archivo y .txt -este es el caso de archivo.txt-, y que tienen
diferentes letras entre archivo y .txt, maysculas, minsculas, nmeros, y hasta caracteres
como espacio y punto.
En el primer caso de los ejemplos se indic que se deban seleccionar los archivos cuyo
nombre comiencen con file y luego tengan un caracter seleccionado de B, F o D,
nicamente. En el segundo caso se indic que se seleccionaran los archivos cuyo nombre
comienza con archivo y luego tienen un caracter seleccionado de a, A y 2, luego tienen
cualquier cosa -incluso nada- y finalmente el nombre termina en txt. Este segundo ejemplo
muestra como el shell interpreta todos los smbolos comodn indistintamente, y se pueden
combinar.
Comodn [!xyz] (cualquier caracter que no est en la lista)
Muy semejante al comodn de lista [xyz], que selecciona un caracter del nombre que est en
la lista, existe el comodn lista negada [!xyz], que selecciona un caracter del nombre que no
est en la lista. Note que como casi cualquier caracter puede ser usado en los nombres de los
archivos en UNIX, es posible que la lista haya que sobre-especificarla, porque de lo contrario,
de pronto, selecciona mucho.
Ejemplos:
e@abe:e/> ls
LitteFile archivoA.txt fileA.c fileG
MadRamon 1.png archivoAB.txt fileA.cob fileH
NuevoVacio.txt archivoE.txt fileA.txt fileI
actual.txt archivoZ.txt fileB nuevoArchiv2.txt
archivo A.txt archivoaB.txt fileC procesos.txt
archivo.part.txt archivoab.txt fileD ramon.txt
archivo.txt dato viejo fileE subdir1
archivo23.txt fechaActual.txt fileF
e@abe:e/> echo archivo[!aA2]*txt
archivo A.txt archivo.part.txt archivo.txt archivoE.txt archivoZ.txt
En el primer caso del ejemplo se indica que se seleccionen los archivos cuyo nombre
comience con archivo y luego tengan un caracter que no sea ni a, ni A ni tampoco 2, y que
luego tengan cualquier cosa y finalmente el nombre termine en txt; se nota como selecciona
archivos cuyo nombre es archivo luego un espacio o archivo y luego un punto, o archivo
luego E o Z, pero en ningn caso a, A o 2. En el segundo caso del ejemplo se indica que se
seleccionen archivos cuyo nombre termine en .txt, y que casi nada del nombre importa,
mientras no comience ni con a ni con f; se obserca como se seleccionan archivos .txt cuyos
nombres comienzan con N, con n, con p o con r, nunca con a ni con f.
Comodn [x-z] (cualquier caracter que est en un rango)
Muy parecido al comodn [xyz] donde se indica que se seleccione un nico caracter de una
lista de posibilidades dada posibilidad por posibilidad existe otra sintaxis
Note que si el id
para indicarle al shell que debe seleccionar archivos cuyos nombres est trabajando
ioma en que
el usuario es
concuerdan en una posicin con un caracter dado un rango ascendente. ingls el caracter
entre la n y la o; no est
La sintaxis es simplemente escribir [, el caracter donde comienza el ni
con tilde estn las vocales
rango, un smbolo menos (-), el caracter donde termina el rango, y el junto a las
vocales sin tilde!
smbolo ]. Note que el caracter inicio del rango debe ser numricamente
menor (debe aparecer primero) que el de fin del rango en el cdigo de pgina de
representacin del texto en el idioma que est configurado el usuario.
Ejemplos:
e@abe:e/> ls
LitteFile archivoA.txt fileA.c fileG
MadRamon 1.png archivoAB.txt fileA.cob fileH
NuevoVacio.txt archivoE.txt fileA.txt fileI
actual.txt archivoZ.txt fileB nuevoArchiv2.txt
archivo A.txt archivoaB.txt fileC procesos.txt
archivo.part.txt archivoab.txt fileD ramon.txt
archivo.txt dato viejo fileE subdir1
archivo23.txt fechaActual.txt fileF
e@abe:e/> echo file[C-F]*
fileC fileD fileE fileF
En el anterior muy sencillo ejemplo se indic seleccionar los archivos cuyo nombre inicia
con file, y que luego tienen un caracter cualquiera del rango que va de C a F, es decir C, o D,
o E o F.
Comodn [!x-z] (cualquier caracter que no est en el rango
De manera semejante al comodn [x-z] que permite seleccionar archivos existentes dado un
caracter de una lista de opciones donde se indica el inicio de un rango que arma la lista y
donde se indica donde termina el rango donde termina la lista existe otra sintaxis donde se
especifica que debe seleccionarse un nico caracter que no est en un rango dado. Igual que
Note que este ejemplo tambin es muy sencillo: se indica al shell que
Note pueden com
debe seleccionar los archivos existentes cuyo nombre comienza con file y y rangos en una
binarse listas
especificacin.
que luego tienen un caracter que no est en el rango C a F -es decir el Pregunte cmo!
caracter no es C, ni D, ni E ni F- y que luego el nombre tiene cualquier
cosa.
En la lnea arriba mostrada, se entraron tres comandos en lnea, pero slo el primero
(sleep 60) comienza ejecucin. Tan pronto como el primero termine el segundo (who)
comienza ejecucin; y, cuando el segundo termine, el tercero (whoami)
El cdigo de re
se ejecutar. Slo cuando el ltimo termine volver a aparecer el secuencia de co
torno de una
mandos es el
indicador de mandatos del intrprete para recibir ms comandos. cdigo de retorn
o del
de los comandos ltimo
nicamente.
Ntese como el intrprete no separa de manera alguna la ejecucin o
lo que muestra la ejecucin- de un comando de otro. En el ejemplo la ltima lnea
root parece repetida porque la ltima lnea de who es casualmente la que muestra el
comando who am i.
Como se observa, como el comando whoami se ejecuta sin error el comando echo ejecuta
inmediatamente inmediatamente termina whoami-.
Ejecucin Condicional: Ejecucin slo si el anterior ejecuta con error
Para ejecutar un comando si el comando anterior se ejecuta con error De las variables
del
primero hay que conocer que para los mismos sh, ksh y bash, una se hablar ms ad intrprete
elan
libro, muy pronto te en este
ejecucin se considera con error si cuando termina un comando devuelve notarse que
. Pero puede
las variables
un nmero cualquiera diferente de cero (0) en la variable ?. como ? se co
nsideran del
ambiente,
tema ya
Para ejecutar un comando2 nicamente si el comando1 termina con error considerado.
se usa:
comando1 || comando2
Ntese que igual que con &&, el comando1 puede tener opciones y argumentos, y el comando2
posiblemente tambin, la sintaxis slo depende de los smbolos ||.
Ejemplo:
root@ibmserver1:/> rmdir /tmp || echo "No pudo borrarse /tmp!"
rmdir: 0653-611 Directory /tmp is not empty.
No pudo borrarse /tmp!
root@ibmserver1:/>
Ntese cmo se ejecut arriba el segundo comando (echo) debido a que el primer comando
(rmdir) termin con un error.
Message from e on abe (pts/0) [Sun Sep 9 21:21:33 EST 2007] ...
Ramon Barrios Lascar
<EOT>
e@abe:e/> cat MiNombre.txt
Ramon Barrios Lascar
En el ejemplo se puede notar como el comando write no tuvo que esperar a que el usuario
escribiera el mensaje directamente -y lo terminara con control d-, si no que ley, pero el
shell ya le haba preparado que lo que leera sera el archivo MiNombre.txt.
En los ejemplos se observa cmo lo que genera un comando se almacena en un archivo -en
el ejemplo datos.txt-, y en el segundo ejemplo se muestra cmo sin aviso el shell crea
nuevo el archivo datos.txt, perdindose los contenidos anteriores del mismo.
Redireccin de los mensajes de error hacia un archivo
Comn tambien es la necesidad de almacenar los avisos de alerta, advertencia o mensajes de
error que algunos comandos generan. En muchos casos sirve almacenar Note
que no pued
todo el texto generado por la ejecucin de un comando en un nico mismo archivo e usar un
para
archivo, pero si el texto general generado por un comando es mucho, de esretdireccin de la entradala
ndar y de la salid
pronto se necesita que los textos de los mensajes de error estn de errores simult a estndar
neamente!
registrados en un archivo aparte.
Para hacer la redireccin de la salida estndar de errores de un comando se
usa una sintaxis sencilla tambin: se agrega 2>nombre_archivo a la sintaxis normal del
comando del que se quieren capturar los mensajes de errores y almacenarlos en el archivo
Ejemplo:
[0 e@Moe /Volumes] wc -l << FIN
> Primera linea
> Segunda linea
> Tercera linea
> Cuarta linea
> FIN
4
Como se nota en el ejemplo, con la ejecucin del primer comando -rm archivo1.txt- se crea
el archivo mensajes.txt, y con la ejecucin del segundo comando se agregan contenidos al
mismo. Si se observa el archivo generado mensajes.txt, slo hay texto de mensajes de error
Se ha mencionado ms de una vez que las variables del ambiente de un proceso afectan
cmo hace un proceso ciertas tareas. En especial ciertas variables de ambiente afectan cmo
funciona el -los?- intrprete de comandos, cmo ejecuta los comandos que se le dan y la
apariencia que tiene. En un captulo anterior titulado Ambiente de Trabajo: Procesos y
Variables se mencion cmo se listaban, creaban, modificaban y borraban variables del
ambiente del shell. Tambin se vi en dicho captulo cmo se hace para publicar las
variables de ambiente para que los procesos hijos -del shell- tengan unas copias.
Las variables de ambiente existen en el shell, pero no hemos visto an cmo se pueden usar
directamente en el shell!
Para usar el valor de una variable en el shell se escribe ${nombre_variable} en donde quiera
el valor que contiene la variable en el intrprete. Si el nombre no se presta Note
que lo
para confusiones puede usarse simplemente $nombre_variable; as si se diferencian lass msisaytesmcuas Unix
las minsculas en las de
tiene una variable llamada Host, y se quiere obtener o usar el valor en el de los nombres
las variables de am
momento se escribe ${Host} o simplemente $Host. A la hora de la
biente!
ejecucin el shell usar el valor dentro de la variable, y no la variable.
Ejemplos:
0 root@abe:/> echo $Host
0 root@abe:/> Host=abe.iknow.com
0 root@abe:/> echo Mi servidor es ${Host}
Mi servidor es abe.iknow.com
0 root@abe:/> printf "La maquina usada en los ejemplos es $Host\n"
La maquina usada en los ejemplos es abe.iknow.com
En el ejemplo se puede observar que la variable Host inicialmente es nula. Usar una variable
inexistente o una variable nula en el intrprete de comandos no es error a menos que as se
configure el shell. Como segundo paso se crea -o se llena, no lo sabemos- la variable con un
nuevo valor y se usa primero con la sintaxis ${variable} y luego se usa con la sintaxis
$variable. Aunque lo ms comn es usar $variable, la sintaxis completa ${variable} existe
porque las sustuciones de variables son literales y en algunos casos se presta para
confusiones:
0 root@abe:/> MES=Sept
0 root@abe:/> echo Estamos en ${MES}iembre
Estamos en Septiembre
0 root@abe:/> echo Estamos en $MESiembre
Estamos en Note que hay m
s
Si se observa en detalle el ejemplo, cuando la variable no tiene texto sustitucin de estilos de
pregunte al instru variables,
alrededor el shell no tiene problemas en identificar el nombre de la ctor cules!
misma y por ello extrae el valor y lo usa, pero despus, como se us la sintaxis
0 root@abe:/> echo $0
-bash
0 root@abe:/> echo $TERM
xterm
0 root@abe:/> echo $MANPATH
:/usr/share/man:/opt/freeware/man
0 root@abe:/> echo $IFS
Gran parte del enorme poder que tienen los sistemas UNIX est basado en una idea sencilla:
cada herramienta o comando debera hacer una sola cosa pero hacerla lo mejor posible, as
el comando listar usuarios no debera ordenarlos segn un criterio, pero debera haber un
comando ordenar que puede ordenar lo mejor posible cualquier cantidad de tems, y
debera haber una manera de combinarlos. Esta es la base de la filosofa Unix y es como
trabajan todos los UNIX en general.
Una manera de combinar comandos es a travs de la sustitucin de comandos. De qu se
trata? de obtener los textos generados por algn comando y usarlos como parte de la sintaxis
de otro comando.
Para sustituir los textos generados por un comando y usarlos como parte de la sintaxis de
otro comando se agrega a la sintaxis del segundo comando, en el sitio donde se necesita el
texto del primer comando, la construccin `primer comando`. Note que la
Note que la su
comilla inversa o acento grave es el smbolo a la izquierda del 1 en un comandos no us
bstitucin de
a la entrada o
teclado qwerty en ingls. Como este smbolo en algunos teclados es algo la salida estndar del coman
do
complicado de obtener, puede usarse la construccin $(primer comando) otquroe . necesita informacin de
El sh el l ca pt
en el mismo sitio de la sintaxis del segundo comando, y as obtener lo informacin y ur a
reemplazo de text hace un
mismo. o literal.
En el ejemplo se observa cmo se aprovecha que puede usarse el comando date para
obtener la fecha en el momento de ejecucin y en algn formato prctico. Se usa
substitucin de comandos para capturar el texto generado por date y usarlo como parte de
la sintaxis del comando touch. Podra haberse usado date +'%Y%m%d', usar las facilidades
para copiar y pegar y luego escribir el comando touch con la sintaxis adecuada. Si se usa
substitucin de comandos el shell ejecuta en varias fases:
Ejecuta primero lo que est entre $( ) o ` `, capturando el texto.
En algunos casos se necesita que un comando procese directamente los datos generados por
otro (algo semejante a la substitucin de comandos), pero los datos los puede usar el
segundo comando -el procesador- tomndolos de un archivo, o mejor, de la entrada
estndar. Este es el caso mencionado en querer una lista ordenada de los usuarios del
sistema; hay un comando que genera la lista sin ordenar, y hay un comando que ordena
cualesquiera tems. Estos casos en general traducen a conectar la salida
Note que algunos
estndar de un comando directamente a la entrada estndar de otro tienen | si no un
teclados no
comando. sm bolo de
barra cortada .
Si el teclado
no tiene la barr
Para conectar la salida estndar de un primer comando con la entrada a completa el
smbolo de barr
a
estndar de otro comando se usa la construccin primer comando | totalmente equi cortada es
valente y se
puede usar.
segundo comando. En los intrpretes shell Posix el smbolo de barra
vertical (llamado comnmente en ingls pipe) conecta la salida estndar
del comando justo antes de l con la entrada estndar del comando justo despus.
Ejemplo:
e@abe:e/> echo "Hola super usuario" | write root Ntese: algunos
com
reciben por entra andos no
da estndar
fcilmente, pe
Message from e on abe (pts/0) [Wed Sep 19 00:41:51 EST ro en la
do cu m en ta ci n
2007] ... informar cmo. pu ed en
Hola super usuario Muchos usan
una sintaxis de a
<EOT> brir archivo
con el archivo -
e@abe:e/> echo "Cuerpo del mensaje
More...de correo
More...
More...Ramon Barrios Lascar | mail -s Mensaje 2007-09-19"
[email protected]
Note que en el intrprete shell los dos comandos se ejecutan inmediata y simultneamente
para poder hacer la conexin del archivo salida estndar de uno con el archivo entrada
estndar del segundo. No use comandos que tengan alguna dependencia temporal.
Comandos filtro
En Unix se dice que un comando es un filtro cuando dicho comando lee o puede leer texto
de la entrada estndar y cuando bota o puede botar texto producido por la salida estndar.
Estos comandos se supone que de alguna manera transforman -como un paso de una cadena
de produccin- lo que reciben y lo pasan al siguiente comando de una cadena.
Un comando que es filtro puede estar al comienzo de una secuencia de tuberas, en la
mitad, o al final de una cadena de tuberas. Algunos comandos pueden usarse slo para
iniciar o terminar una secuencia de tuberas, pero entonces no se les denomina filtros.
Como se ha observado, el shell hace una interpretacin bastante extensa del texto que se
escribe en la lnea de comandos, haciendo reemplazos contnuamente basndose
principalmente en ciertos smbolos, por esa razn cuando se quieren usar los smbolos como
parte de un comando hay el problema de hacer que el intrprete shell no los reemplace. El
caso ms comn es el uso de los espacios.
El caracter espacio es el separador de tems usado principalmente, buscando ste el shell
separa lo que se da despus del nombre del comando en opciones, argumentos, y cada uno
de los argumentos los distingue de los otros porque se separan por espacios. En especial la
sintaxis para guardar un valor dentro de una variable de ambiente es variable=valor, pero
qu si el valor que se necesita dentro de una variable est compuesta de varias variables?
Cuando se usa el trmino escape dentro de esta seccin se quiere decir hacer que el
significado no sea el comn; as que escapar un espacio es hacer que el espacio no tenga
el significado como separador de tems que normalmente tiene; escapar un smbolo de
pesos es hacer que el smbolo pesos no signifique usar valor de variable que normalmente
tiene, y as.
En UNIX -realmente en el intrprete shell POSIX- hay tres maneras de hacer que un o unos
caracteres no tengan el significado que normalmente tienen, es decir de escaparlos.
Escape de un nico caracter: smbolo \
Para quitarle el significado especial a un nico caracter o smbolo -o lo contrario, para darle
significado especial a un caracter que normalmente no tiene- se usa el caracter smbolo \ (en
ingls backslash). Este smbolo cuando se antepone a un caracter especial le quita su
significado especial y lo convierte en un caracter de texto simple: un * ya no significar
todos los caracteres posibles en un nombre de archivo, significar simplemente asterisco.
Algunos caracteres normales se convierten en especiales cuando no lo son pero se les
antepone un smbolo \ -estos son los escapes del lenguaje C-.
Ejemplos A:
e@abe:e/> echo *
LitteFile MadRamon 1.png MiNombre.txt NuevoVacio.txt actual.txt app_.log
app_20070913.log archivo A.txt archivo.part.txt archivo.txt archivo23.txt
archivoA.txt archivoAB.txt archivoE.txt archivoZ.txt archivoaB.txt
archivoab.txt dato viejo fechaActual.txt fileA.c fileA.cob fileA.txt fileB
fileC fileD fileE fileF fileG fileH fileI nuevoArchiv2.txt procesos.txt
ramon.txt subdir1
e@abe:e/> echo \*
*
e@abe:e/> echo La variable con mi directorio es $HOME
La variable con mi directorio es /home/e
e@abe:e/> echo La variable con mi directorio es \$HOME
En el primer ejemplo se usa el smbolo * y como no se toma ningn cuidado especial el shell
lo interpreta con su significado de siempre todos los caracteres posibles en los nombres de
los archivos y como est slo termina significando todos los archivos. Como echo repite
simplemente el texto que se le de como argumentos simplemente muestra los nombres de
todos los archivos. En el segundo ejemplo se le quita el significado especial al asterisco,
usando \*, y como echo simplemente repite escribiendo a la salida estndar los argumentos
que se le den, la salida obtenida es un simple *.
En el tercer ejemplo se usa $HOME que normalmente obtiene el contenido de una variable -en
este caso HOME-, que se da a echo, que muestra el texto, incluyendo el contenido de la
variable. En el cuarto ejemplo se vara un poquito simplemente agregando \ al smbolo $, lo
que logra que $ no sea especial -donde significa obtener valor contenido en la variable que
sigue-, as que un $ es un simple $, por lo que al lado de un nombre de una variable no
obtiene el valor de la variable, as que echo simplemente repite un texto, un smbolo pesos y
un texto que casualmente es el nombre de una variable.
Ejemplo B:
e@abe:e/> echo "Texto compuesto de\ndos lineas"
Texto compuesto de
dos lineas
e@abe:e/> echo "Mostrar es un backslash es especial: \\"
Mostrar es un backslash es especial: \
En este nuevo ejemplo se usa \ a la inversa: el caracter n que normalmente no tiene nada de
especial al tener un escape como prefijo se convierte en un smbolo especial -porque tiene
un significado especial dentro de una cadena de texto en lenguaje C-, en este caso en un
cambio a siguiente lnea. El ejemplo termina mostrando dos lneas porque a mitad, un
caracter del texto significa cambio a siguiente lnea. En el segundo caso Note
que pocos
mostrado se demuestra cmo obtener un backslash que no tenga tienen significad caracteres
o especial
significado especial -donde especial quiere decir hacer escape al cuando llevan co
mo prefijo a
\. Deber consul
caracter que sigue-, hay que usar un backslash para quitare el significado de C pa tarse una gu
ra saber cules a
son
especial al backslash que sigue! todos.
Se observa cmo el comando echo muestra \* cuando stos smbolos estn encerrados en '
ya que ni \ ni * son especiales cuando as estn encerrados. Como se ve en el segundo caso
del ejemplo, los caracteres sin significado especial siguen siendo caracteres comunes cuando
estn dentro de las comillas rectas no tipogrficas. En el tercer caso de los
Not
ejemplos se muestra cmo hacer que un texto de varias palabras se tome obteenequr un e no hay la maner
a de
as ' dentro de te
como un nico tem. Dentro de las comilla ' ni los espacios son en ce rr ado en ' '. xto
En el primer caso de los ejemplos se nota cmo una comilla sencilla no tiene significado
especial dentro de un par de comillas dobles (" "). En el segundo caso de los ejemplos se
nota cmo el backslash (\) sigue teniendo dentro de " " el significado de siempre: hacer
que lo que sigue no tenga significado especial si normalmente lo hace, hacer que lo que siga
tenga significado especial si normalmente no lo hace. Se muestra en el tercer caso de los
El Concepto
Cuando inici el diseo y desarrollo de UNIX, por all en la prehistoria de finales de la dcada
de los sesentas lo imperativo en AT&T era que se obtuviera un sistema para procesar
ingentes cantidades de texto que finalmente se convertiran en manuales tcnicos de
servicio. Por esta razn nica, desde el comienzo se pens en que UNIX tuviese mltiples
comandos de manipulacin de texto que pudieran combinarse para obtener lo que AT&T
necesitaba -y lo que los usuarios queran hacer-. Un UNIX tpico termina entonces siendo un
sistema con ingentes cantidades de comandos cuyo producido es texto, casi siempre texto
plano sin formato (inicialmente ASCII, pero despus interpretable con cdigos de pgina),
y textos que pueden pasarse y mandarse de un comando a otro, en secuencias y cadenas.
En un UNIX normal, sin instalaciones adicionales o agregados se dispone de centenares de
comandos, muchos de ellos -decenas- son y existen nicamente para procesar texto. Estos
comandos existen y han existido por dcadas, y han sido optimizados a travs del tiempo,
por lo que es difcil encontrar implementaciones para lo mismo que sean tan o ms
eficientes.
Dentro de lo que veremos en este captulo estn:
Cmo ordenar texto -y archivos de texto-.
Cmo filtrar texto -y archivos de texto-.
Cmo cortar texto, juntar, combinar.
Otras operaciones con texto -y archivos de texto-.
!"#
Para volcar un texto a la salida estndar en UNIX normalmente hay simplemente que
redirigirla, pero en muchos casos es prctico tener un comando. Este comando lleva por
nombre cat (catenate), que lee la entrada estndar o los archivos dados como argumento y
vuelca, sin pausa ni separacin los contenidos de todos a la salida estndar.
La sintaxis de cat es muy sencilla:
cat [ -r ] [ -v [ -e ] [ -t ] ] [ archivo ... ]
Donde:
Los smbolos [ y ] indican que las opciones y los argumentos son opcionales, no
hacen parte de la sintaxis.
La opcin r se usa para que cat reemplace en la salida varias lneas en blanco
consecutivas por una sola.
La opcin v se usa para que cat reemplace en la salida los caracteres de control
por ^octal donde octal es el nmero de tres octales que representa al caracter
de control. Al mismo tiempo cat reemplaza en la salida otros caracteres no
mostrables por M-x donde x es un caracter ASCII que resulta de apagar el bit ms
significativo del caracter no mostrable por un 0. Cuando se usa la opcin v
tambin se pueden usar las opciones e y t.
La opcin e se usa para que cat muestre un smbolo $ para representar el fin de
cada lnea.
La opcin t se usa para que cat reemplace en la salida el caracter tabulador por
un ^I.
Ejemplos:
0 root@abe:/etc> cat passwd
Como se notar, en el primer caso de los ejemplos cat vuelca los contenidos del archivo a la
salida estndar, sin hacer ms. En el segundo caso de los ejemplos cat muestra los caracteres
especiales como smbolos -el archivo no contiene caracteres especiales- y los fines de lnea
con unos smbolos $.
!" #$
Contar texto es una de las operaciones ms bsicas. Uno de los comandos cuenta lneas,
palabras y caracteres, y puede decrsele que cuente y reporte cualesquiera de los tres.
Para todo lo mencionado se usa el comando wc (word count), que no slo cuenta palabras -
como indicara el nombre en ingls-. La sintaxis es muy sencilla: Not e que el comando
wc [ -c | -w | -l ] [ archivo ... ] an ms opcione wc tiene
s, opciones
que puede re
visar en la
Donde: documentacin.
El primer caso del ejemplo muestra cmo cuando no se dan opciones reporta tres nmeros:
el nmero de lneas, el nmero de palabras y el nmero de caracteres, en se orden. El
segundo caso de los ejemplos muestra cmo puede solicitarse una nica estadstica, en este
caso el nmero de lneas, y como se indicaron dos archivos como argumentos primero se
reporta por archivo y al final un total. El tercer caso de los ejemplos muestra cmo pueden
reportarse estadsticas de un texto que no est en un archivo, en este caso, como no se
indicaron argumentos el comando wc lee de la entrada estndar, que termina siendo la salida
estndar del comando anterior, que se conect con el smbolo |.
#
$
%
&
'
!" (
)
*
+
#,
A menudo hay que listar archivos -o texto que no necesariamente est en un archivo-. Esta
operacin a veces se usa para indicar dnde lgicamente se ubica algo, y Note qu
e el
es ms fcil si se reporta usando nmeros de lnea. La manera ms fcil de an ms opcociomneans,doopnl tiene
que puede re ciones
listar texto con las lneas numeradas es usando el comando nl (number do cumentacin.
visar en la
lines). Este comando toma un archivo o si no se da el archivo la entrada
estndar, y lo muestra con las lneas numeradas, posiblemente segn unas opciones
dadas. La sintaxis puede parecer complicada -por el nmero de opciones- pero la verdad es
muy sencilla:
nl [-b modo] [-n formato] [-s separador] [-w nmero] [-l nmero] [ archivo ]
Donde:
Los smbolos [ y ] indican que las opciones y los argumentos son opcionales, no
hacen parte de la sintaxis.
Pueden drsele cero o ms opciones.
Pueden drsele ninguno o un archivo. Cuando no se indica archivo el comando
nl lee el texto de la entrada estndar.
La opcin b se usa para escoger el modo como se numeran las lneas. El modo a
indica que se numeran todas las lneas, el modo t indica que se numeran las
lneas que sean visibles -no contara las lneas vacas o de slo blancos y/o
tabuladores, el modo ppatrn numera slo las lneas que cumplen con un patrn
-el patrn es una expresin regular-. El modo predeterminado es el modo t.
La opcin n se usa para escoger el modo como se muestran los nmeros de
lneas. El modo ln muestra los nmeros justificados a la izquierda, y sin ceros a la
izquierda, el modo rn muestra los nmeros justificados a la derecha, y sin ceros a
Para leer textos en un archivo o en la entrada estndar no siempre se usa vi. En especial vi
no puede leer texto que no est en un archivo -no puede leer textos de la entrada estndar-.
Ms flexible y rpido -y sin peligro de editar inadvertidamente el archivo- es usar el comando
pg (paginate) que lee textos y los muestra por salida estndar (casi siempre por pantalla) por
pginas que llenan la pantalla y luego se detiene para esperar comandos. La sintaxis de pg es:
pg [ +nmero | +/patrn/ ] [ -e ] [ -f ] [ -s ] [ archivo ... ]
Donde:
Los smbolos [ y ] indican que las opciones y los argumentos son opcionales, no
hacen parte de la sintaxis.
El smbolo | indica posibilidad, se usa para mostrar las posibles opciones, no
hace parte de la sintaxis.
Pueden drsele cero o ms opciones.
Pueden drsele cero o ms archivos. Cuando no se le dan archivos el comando pg
lee de la entrada estndar.
Con +nmero se indica que el comando pg debe comenzar a mostrar en cierto
nmero de lnea.
Con +/patrn/ se indica que el comando pg debe comenzar a mostrar a partir de
la primera lnea que contenga el patrn de texto.
Con la opcin e se indica que el comando pg no debe esperar un Enter entre
archivo y archivo.
Con la opcin f se indica que el comando pg no debe partir las lneas que no
caben en la pantalla.
Con la opcin s se indica que el comando debe resaltar todos los mensajes e
indicadores en la ltima lnea de la pantalla.
Ejemplos:
Para mostrar un archivo reporte.txt por pginas se usara:
pg reporte.txt
Para mostrar un archivo reporte.txt por pginas, comenzando con Agosto (estando este texto
en una lnea con las maysculas tal cual) se usara:
pg +/Agosto/ reporte.txt
nmerol hace que pg salte a una parte del texto donde la lnea nmero est de
primera en la pantalla (el comando es nmero ele).
+nmerol hace que pg avance nmero lneas en el texto (el comando es mas
nmero ele).
-nmerol hace que pg retroceda nmero lneas en el texto (el comando es
menos nmero ele).
$ hace que pg vaya a la ltima pgina del texto. No funciona cuando pg est
leyendo la entrada estndar.
/texto/ hace que pg busque avanzando texto.
!"#$
Muchas veces interesan de un texto slo unas pocas lneas del inicio del mismo -por ejemplo
es un listado de los usuarios que ms consumen un recurso y nos interesan los ms
consumidores nicamente-. Para obtener las primeras lneas de un texto se usa el comando
sencillo head. La sintaxis es de verdad sencilla:
head [ -nmero | -n nmero | -c nmero ] [ archivo ... ]
Donde:
Los smbolos [ y ] indican que las opciones y los argumentos son opcionales, no
hacen parte de la sintaxis.
El smbolo | indica posibilidad, se usa para mostrar las posibles opciones, no
hace parte de la sintaxis.
Debe darse una opcin.
Pueden drsele cero o ms archivos. Cuando no se dan archivos head lee de la
entrada estndar.
Cuando a head se le dan varios archivos muestra las primeras lneas del texto
combinado de los archivos, no muestra las primeras lneas de cada texto.
Cuando se usa -nmero el comando head muestra las primeras nmero lneas del
(de los) archivo(s). Esta es la sintaxis antigua del comando.
Cuando se usa -n nmero el comando head muestra lo mismo, las primeras
nmero lneas del archivo.
Cuando se usa -c nmero el comando head muestra los primeros nmero
caracteres del archivo.
En los ejemplos primero se muestra el archivo completo, usando cat. El segundo caso
muestra el uso tpico, con la opcin n para obtener slo algunas de las primeras lneas. El
tercer caso de los ejemplos usa la opcin c para obtener slo algunos de los caracteres del
inicio del texto, puede observarse que la tercera lnea del texto no aparece completa.
!"#$
As como muchas veces slo nos interesan las primeras lneas de un texto -para lo que se usa
head- otras muchas veces slo nos interesan las ltimas lneas de un texto. Para esto otro
existe el comando tail, que muestra las ltimas lneas de un texto o las lneas a partir de una
posicin hasta las ltima. La sintaxis de tail es parecida a la del comando head:
tail [ -n signmero | -c signmero | -k signmero ] [ -f ] [archivo ... ]
o tambin:
tail -r [ -n nmero ] [ archivo ... ]
Donde:
Los smbolos [ y ] indican que las opciones y los argumentos son opcionales, no
hacen parte de la sintaxis.
El smbolo | indica posibilidad, se usa para mostrar las posibles opciones, no
hace parte de la sintaxis.
Puede darse cero o una opcin.
Pueden drsele cero o ms archivos. Cuando no se dan archivos tail lee de la
entrada estndar.
Cuando se dan varios archivos tail muestra los ltimos contenidos de la
combinacin de todos los archivos, no muestra los ltimos contenidos de cada
archivo.
El parmetro signmero es un nmero individual, o +nmero o -nmero. Cuando
se da un nmero individual tail muestra las ltimas nmero unidades del texto
(sean lneas, caracteres o kilobytes). Cuando se da +nmero el comando tail
muestra las ltimas unidades del texto a partir de la nmero unidad entrada (sean
La opcin k se usa para que las unidades sean kilobytes, as que el comando tail
mostrar los ltimos kilobytes del texto.
La opcin f se usa para que tail no termine, se quedar leyendo
indefinidamente y si encuentra ms contenido en el final del texto ir
mostrndolo.
La opcin r se usa para que las ltimas lneas las muestre en sentido inverso. Slo
puede mostrar mximo los ltimos 20KB del texto.
Cuando no se dan opciones tail funciona como si se hubiera indicado -n10, es
decir mostrar las ltimas diez lneas del texto.
Ejemplos:
0 root@abe:/etc> cat passwd
root:!:0:0::/:/usr/bin/bash
daemon:!:1:1::/etc:
bin:!:2:2::/bin:
sys:!:3:3::/usr/sys:
adm:!:4:4::/var/adm:
uucp:!:5:5::/usr/lib/uucp:
guest:!:100:100::/home/guest:
nobody:!:4294967294:4294967294::/:
lpd:!:9:4294967294::/:
lp:!:11:11::/var/spool/lp:/bin/false
invscout:!:6:12::/var/adm/invscout:/usr/bin/ksh
snapp:!:200:13:snapp login user:/usr/sbin/snapp:/usr/sbin/snappd
ipsec:!:201:1::/etc/ipsec:/usr/bin/ksh
nuucp:!:7:5:uucp login user:/var/spool/uucppublic:/usr/sbin/uucp/uucico
sshd:!:202:201::/var/empty:/usr/bin/ksh
j:!:505:0: Jorge Valbuena:/home/j:/usr/bin/ksh
ldapdb2:!:205:14::/home/ldapdb2:/usr/bin/ksh
e:!:501:0:Ramon Barrios Lascar:/home/e:/usr/bin/ksh
0 root@abe:/etc> tail -n 5 passwd
nuucp:!:7:5:uucp login user:/var/spool/uucppublic:/usr/sbin/uucp/uucico
sshd:!:202:201::/var/empty:/usr/bin/ksh
j:!:505:0:Ramon Barrios Lascar:/home/j:/usr/bin/ksh
ldapdb2:!:205:14::/home/ldapdb2:/usr/bin/ksh
e:!:501:0:Ramon Barrios Lascar:/home/e:/usr/bin/ksh
0 root@abe:/etc> tail -n +5 passwd
adm:!:4:4::/var/adm:
uucp:!:5:5::/usr/lib/uucp:
En los ejemplos el primer caso muestra el archivo completo. El segundo caso de los
ejemplos muestra cmo se usa tail para obtener las ltimas lneas de un archivo (con la
opcin n nmero). El tercer caso muestra cmo se usa tail para obtener las lneas de un
archivo desde la nmero dado hasta la ltima (con la opcin n +nmero).
!"#
Donde:
Los smbolos [ y ] indican que las opciones y los argumentos
Note que el com
son opcionales, no hacen parte de la sintaxis. corta -como se
ando cut no
pensara dado
el nombre-, realm
El smbolo | indica posibilidad, se usa para mostrar las en
hace es selecciona te lo que
r.
posibles opciones, no hace parte de la sintaxis.
Debe darse una de las opciones c o f.
Pueden drsele cero o ms archivos. Cuando no se dan archivos cut lee de la
entrada estndar.
Las columnas que se especifican son las que aparecen en la salida estndar.
Las columnas pueden especificarse como nmero individual -as 5 indica la quinta
columna-; pueden especificarse como una lista de nmeros separados por comas
(,) -as 5,7,9 indican la columna quinta, sptima y novena-; pueden especificarse
como un rango de nmeros, donde 5-9 indican las columnas de la quinta a la
novena, inclusive; y pueden usarse combinaciones. Cuando se usa un rango de
columnas y no se indica el inicio el comando cut asume que se deben copiar
desde la primera columna -as que -5 indica las columnas hasta la quita-, y cuando
En el primer caso de los ejemplos se usa cat para volcar a la pantalla el archivo completo. En
el segundo caso de los ejemplos se usa cut para obtener slo la primera columna del texto
(con la opcin f1, pero el texto tiene columnas separadas por el smbolo : se indica esto a
cut con d:, ya que de manera predeterminada busca un tabulador). En el tercer caso de los
ejemplos usa cut para obtener un listado parcial de procesos; en este caso como el texto
generado por ps viene con columnas armadas con ancho exacto se usa cut con la opcin c
para indicar dichas columnas: primero hasta cierta posicin, y luego desde cierta posicin
hasta el final.
Ntese que cut no es usable fcilmente con columnas de ancho variable y que separan
columna de columna usando algo variable; para estos casos es mejor usar otra herramienta.
!"#$%
Con el comando cat pueden combinarse dos o ms textos o archivos de manera que queden
uno seguido del otro, pero qu se usa cuando hay que combinar unos textos uno al lado
del otro? Tampoco hay que usar una compleja herramienta de programacin, hay que usar
una herramienta sencilla que conoceremos enseguida: el comando paste. Este comando
junta dos o ms textos o archivos y los copia a la salida estndar de manera que los de la
entrada se convierten en columnas de la salida estndar. La sintaxis del comando paste es:
paste [ -d lista ] [ -s ] [ archivo1 archivo2 ... ]
Donde:
Los smbolos [ y ] indican que las opciones y los argumentos son opcionales, no
hacen parte de la sintaxis.
Pueden drsele cero o ms archivos. El comando paste es til de verdad con al
menos dos archivos.
Cualesquiera de los archivos de la entrada pueden ser reemplazados por -. El
argumento - se usa para indicar dnde debe ir -en las columnas- el texto ledo de
la entrada estndar.
La opcin d se usa para dar una lista de caracteres individuales que deban usarse
como separadores de columna. As el primer caracter de la lista se usar para
separar la primera columna de la segunda -de la salida-, el segundo caracter de la
lista se usar para separar la segunda columna de la tercera -de la salida-. Si hay
ms caracteres en la lista que columnas en la salida los caracteres sobrantes se
ignoran. Si hay menos caracteres en la lista, las ltimas columnas son separadas
usando repetidamente el ltimo caracter de la lista.
La opcin s se usa para que paste no arme las columnas tomando igual cantidad
de lneas de cada columna de texto, si no que arme las columnas tomando lneas
Los dos primeros casos de los ejemplos simplemente muestran cmo son los contenidos
de los archivos Numeros.txt y Romanos.txt. Se usa cat para volcar los contenidos a la salida.
e@abe:e/> paste Numeros.txt Romanos.txt
1 i
2 ii
3 iii
4 iv
5 v
6 vi
7 vii
8 viii
9 ix
10 x
11
12
13
14
15
El cuarto caso de los ejemplos muestra cmo usar la opcin d del comando paste para que
el listado combinado generado tenga las columnas separadas por medio de otro caracter.
Note cmo hay que escapar el smbolo | para que no tenga el significado de redireccin
tradicional.
En los sistemas UNIX est disponible un comando que muchos usuarios ni siquiera imaginan
que podra existir. El comando join de los sistemas Unix hace el equivalente a las sentencias
SQL SELECT ... INNER JOIN, SELECT ... RIGHT OUTER JOIN, SELECT ... LEFT OUTER JOIN.
Este comando combina archivos usando campos que estn presentes en los dos archivos
que se usan como entrada. La sintaxis del comando join es:
join [ -1 campo ] [ -2 campo ] [ -a nm | -v nm ] [ -e texto ] [ -o campos ]
[ -t sep ] archivo1 archivo2
Donde:
Los smbolos [ y ] indican que las opciones y los argumentos son opcionales, no
hacen parte de la sintaxis.
El smbolo | indica posibilidad, se usa para mostrar las posibles opciones, no
hace parte de la sintaxis.
Deben darse dos archivos ordenados.
Uno de los archivos puede reemplazarse por un argumento -. Cuando uno de los
argumentos es - el comando join lee la entrada estndar y lo combina con el
otro argumento, que se asume es un archivo.
La opcin 1 necesita un nmero de campo o columna, columna que se usar
como llave para hacer el join en el primer archivo, es decir en archivo1. Se
supone que los valores en esta columna se encuentran tambin como valores en
una columna del segundo archivo, es decir archivo2. El comando join asume
que el archivo1 est ordenado segn esta columna o campo.
La opcin 2 necesita un nmero de campo o columna, columna que se usar
como llave para hacer el join en el segundo archivo, es decir en archivo2. Se
supone que los valores en esta columna se encuentran tambin como valores en
una columna del primer archivo, es decir archivo1. El comando join asume que
el archivo2 est ordenado segn esta columna o campo.
La opcin t se usa para especificar cul es el caracter separador de columnas en
ambos archivos de entrada (archivo1 y archivo2) y en la salida estndar
generada. Si este caracter se repite seguido el comando join asume que hay
columnas con campos vacos.
La opcin e se usa para especificar un texto que se usar para presentar en la
salida para reeemplazar -en caso de que se desee- los valores nulos en las
columnas de la salida.
Los primeros dos casos de los ejemplos simplemente muestran los archivos como son. El
primer archivo tiene dos columnas, est ordenado por la primera -nombre-, y tiene como
separador un tabulador. El segundo archivo tiene dos columnas, est ordenado por la
primera -nombre-, y tiene como separador tambin un tabulador.
El tercer caso del ejemplo muestra un join usando la primera columna del primer archivo
(-1 1), y la primera columna del segundo archivo (-2 1), indica que se use como separador
un tabulador (el argumento de la opcin t), y que los campos de las columnas de la salida
que estn nulos se completan con N/D (el argumento de la opcin e).
En el caso cuarto de los ejemplos se muestra cmo no hay necesidad de indicar la primera
columna en los archivos porque es el valor predeterminado para las opciones 1 y 2; tambin
se dice que el separador es tabulador aunque es el valor predeterminado para la opcin t; se
escoge unas columnas -y un orden- para la salida (la columna del join, con el valor mgico 0,
la segunda columna del segundo archivo con 2.2, y la segunda columna del primer archivo
con 1.2); tambin se indic que los campos nulos se muestren como *** (el valor de la
opcin e).
%&'
%&'
%&'
%&'
!"#$ %&'
%&'
Una de las operaciones ms comunes al trabajar con textos son las bsquedas. Muchas de
esas bsquedas se hacen para efectos de filtrado: a veces se busca para filtrar lo que no
contiene lo que se busca, a veces se busca para filtrar lo que s contiene lo Expres
iones regu
que se busca. En los sistemas UNIX hay mltiples maneras de hacer un cruce entre lares son
expresione
filtrados de texto, dentro de editores de texto, y a travs de comandos de prmatogemticas y un lenguaje des
ramacin ba
lnea, es decir, por fuera de los editores. Una de las maneras es usando autmatas celular sado en
es.
alguno de los comandos de una familia basada en expresiones
regulares. El primero y central de la familia de comandos lleva por nombre grep (general
regular expression print), comando que busca texto y filtra, para mostrar slo lneas de
texto que cumplan con la expresin regular dada. El comando grep tiene una sintaxis base
sencilla, pero el primero de los argumentos debe ser una expresin regular que puede llegar
a ser bastante complicada. La sintaxis de grep es:
grep [-i] [-v] [-c] [-l] [-q] [-w] [-x] [ -e expr ] [ expr ] [ archivo ... ]
Donde:
Los smbolos [ y ] indican que las opciones y los argumentos son opcionales, no
hacen parte de la sintaxis.
Pueden drsele a grep cero o ms archivos. Si a grep no se le dan archivos leer
de la entrada estndar.
En la sintaxis expr es una expresin regular bsica. Si en la sintaxis no se usa la
opcin e entonces la expresin es obligatoria, asumindose como la expresin
regular al primer argumento.
La opcin i se usa para que grep ignore la diferencia entre maysculas y
minsculas (hace a grep case insensitive).
En el primer caso de los ejemplos A se muestra el archivo completo, simple, con cat. El
segundo caso de los ejempos A muestra cmo se hace una bsqueda o filtrado sencillo, con
texto literal, usando grep. Se da como primer argumento el texto iknow, y como no se dan
opciones, grep hace una bsqueda donde una lnea completa se copiar a la salida estndar
si en alguna parte aparece el texto literal dado como primer argumento. Como no se dan
En el primer caso de los ejemplos B muestra el uso combinado de las opciones i (para
que no diferencie las maysculas de las minsculas) y v (para hacer una bsqueda negada).
Como a grep se le indica que la expresin es el literal iknow, sin diferenciar, pero usando la
opcin v, copiar a la salida las lneas que no cumplen con el patrn de bsqueda, as que se
muestran las lneas que no contienen iknow.
El segundo caso de los ejemplos B muestra el uso de la opcin n, y como tambin se
incluye la opcin i la bsqueda ser indiferente a las maysculas y minsculas. En este caso
se muestra el nmero de lnea como prefijo de cada lnea que cumple con el patrn de
bsqueda (se muestra en nmero como prefijo, con un smbolo de dos puntos (:) como
separador.
Ejemplos C:
1 root@abe:/home/e> grep -e Mar -e Al *.tsv
Celulares.tsv:Alessio Di Mare (311) 688-1162
Empresas.tsv:Alessio Di Mare Redsis
Las expresiones regulares son un lenguaje muy rico, pero a la vez pueden hacer cosas
bastante complejas. Por ello, algunas herramientas -en este caso grep- implementan un
subconjunto de las mismas, de manera que no se conviertan en algo demasiado complejo de
usar. En el tpico anterior vimos unos ejemplos donde se usaban unos de los casos ms
bsicos: los caracteres alfabticos son parte de la simbologa de las Expresiones re
gu
expresiones regulares bsicas. unes expresiones lares son
conc isas que
describen una
porcin de
A continuacin se define la simbologa usada en las expresiones regulares texto.
bsicas.
Un smbolo punto (.) representa un caracter nico cualquiera, por ejemplo una
letra, un nmero, un smbolo visible, an un espacio; excepto un caracter de fin
de lnea o retorno de carro.
Un smbolo asterisco (*) representa una secuencia del caracter o grupo
inmediatamente anterior. La secuencia puede tener cero o ms caracteres del
inmediatemente precedente.
Un smbolo acento circunflejo (^) si aparece al inicio de una expresin
representa un anclaje al inicio de una lnea o cadena de texto.
Un smbolo pesos ($) si aparece al final de una expresin representa un anclaje al
final de una lnea o cadena de texto.
Una lista de caracteres encerrada en [ ] representa un nico caracter cualquiera
de la lista de caracteres encerrada.
Un rango de caracteres encerrado en [ ] representa un nico caracter cualquiera
del rango de caracteres encerrado. Un rango de caracteres comienza con un
caracter, sigue con un smbolo menos (-), y termina con un caractere
numricamente superior o posterior al que comienza el rango.
Una lista de caracteres encerrada en [^ ] representa un nico caracter cualquiera
que no est en la lista de caracteres encerrada.
Un rango de caracteres encerrado en [^ ] representa un nico caracter
cualquiera que no est en el rango de caracteres encerrado. Un rango de
caracteres comienza con un caracter, sigue con un smbolo menos (-), y
termina con un caractere numricamente superior o posterior al que comienza el
rango.
Los smbolos ., *, $, pierden su significado especial cuando estn encerrados
dentro de [ ]. El smbolo ^ no tiene el significado especial negativo dentro de
[ ] si no es el primer caracter inmediatamente despus de [. El smbolo menos
En el primer caso de los ejemplos simplemente se usa cat para volcar a la salida todo el
archivo Celulares.tsv.
En el segundo caso de los ejemplos se indica a grep que debe copiar a la salida estndar las
lneas que tienen un caracter cualquiera (.) y luego una R. Si se observa bien hay otra lnea
con una R, pero no tiene antes un caracter porque est al comienzo de la lnea.
En el tercer caso de los ejemplos se busca un caracter cualquiera, y al mismo tiempo se le
memoriza -como es el primer grupo capturado entonces est en la memoria -oficialmente
registro- nmero 1, seguido de los contenidos de la memoria -registro- nmero 1; esta
construccin busca dos caracteres repetidos; y como muestra lo listado, efectivamente
%&'
%&'
%&'
%&'
!"#!$ %&' %&'
%&' %&'
Como algunas de las bsquedas posibles matemticamente no son posibles con el juego de
expresiones regulares bsicas que grep soporta, y como no es conveniente complicar al
comando grep, se cre un comando que soporta lo que se llama expresiones regulares
extendidas, que permiten cosas que con las bsicas no son posibles, y que adems facilita lo
que con grep es simplemente difcil. El comando lleva por nombre egrep (extended general
regular expression print).
Sintaxis del comando egrep:
egrep [-h] [-i] [-l] [-n] [-s] [-v] [-w] [-x] [-f arch1] [-e expr] [ expr ]
[ archivo ... ]
Donde:
Los smbolos [ y ] indican que las opciones y los argumentos son opcionales, no
hacen parte de la sintaxis.
Pueden drsele a egrep cero o ms archivos. Si no se le dan archivos egrep lee de
la entrada estndar.
En la sintaxis expr es una expresin regular bsica. Si en la sintaxis no se usa la
opcin e entonces la expresin es obligatoria, asumindose como la expresin
regular al primer argumento. Como muchas de las expresiones incluyen
caracteres especiales que pueden ser interpretados por el shell la expresin
debera encerrarse entre .
La opcin i se usa para que egrep ignore la diferencia entre maysculas y
minsculas (hace a egrep case insensitive).
La opcin v se usa para que egrep filtre negativamente, as seleccionar las lneas
que no cumplan con la expresin regular.
En el primer caso de los ejemplos A se muestra el archivo completo, simple, con cat.
El segundo caso de los ejempos A muestra cmo se hace una bsqueda o filtrado sencillo,
con texto literal, usando egrep. Se da como primer argumento el texto iknow, y como no se
dan opciones, egrep hace una bsqueda donde una lnea completa se copiar a la salida
estndar si en alguna parte aparece el texto literal dado como primer argumento. Como no
se dan opciones egrep diferenciar las maysculas de las minsculas, y por ello el texto no se
encuentra, y as no se muestra ni una lnea en la salida.
El tercer caso de los ejemplos A muestra el resultado de una bsqueda literal donde el
texto s se encuentra: las lneas se copian a la salida estndar tal como aparecen en el archivo
dado.
El cuarto caso de los ejemplos A muestra el uso de la opcin i, que hace las bsquedas
insensibles a las maysculas, entonces en este caso se da el primer argumento todo en
minsculas, pero como no importa lo encuentra aunque est un poquito diferente y las
lneas se copian como estn en el archivo.
Ejemplos B:
0 root@abe:/home/e> egrep -iv iknow Empresas.txt
Alessio Di Mare Redsis
Jairo E. Soler Net.Solutions
Jorge Molina M. SENA
Jorge Russo Redsis
Yasser Barrios Lascar SupraImpresores
Yeimy Fontalvo
0 root@abe:/home/e> egrep -ni iknow Empresas.txt
5:Jorge Valbuena V. iKnow
6:Ramn Barrios Lascar iKnow
En el primer caso de los ejemplos B muestra el uso combinado de las opciones i (para
que no diferencie las maysculas de las minsculas) y v (para hacer una bsqueda negada).
Como a grep se le indica que la expresin es el literal iknow, sin diferenciar, pero usando la
opcin v, copiar a la salida las lneas que no cumplen con el patrn de bsqueda, as que se
muestran las lneas que no contienen iknow.
El segundo caso de los ejemplos B muestra el uso de la opcin n, y como tambin se
incluye la opcin i la bsqueda ser indiferente a las maysculas y minsculas. En este caso
se muestra el nmero de lnea como prefijo de cada lnea que cumple con el patrn de
bsqueda (se muestra en nmero como prefijo, con un smbolo de dos puntos (:) como
separador.
Ejemplos C:
1 root@abe:/home/e> egrep -e Mar -e Al *.tsv
Celulares.tsv:Alessio Di Mare (311) 688-1162
Empresas.tsv:Alessio Di Mare Redsis
Las expresiones regulares extendidas son un lenguaje an ms rico, con las que se pueden
hacer bsquedas y comparaciones bastante complejas. Algunos de los comandos de Unix
implementan las expresiones regulares bsicas, pero algunas otras herramientas
implementan las expresiones regulares extendidas (por ejemplo uno que no hemos
revisado, sed), pero en especial el comando ya mencionado egrep.
A continuacin se define la simbologa usada en las expresiones regulares extendidas.
Un smbolo punto (.) representa un caracter nico cualquiera, por ejemplo una
letra, un nmero, un smbolo visible, an un espacio; excepto un caracter de fin
de lnea o retorno de carro.
Un smbolo asterisco (*) representa una secuencia del caracter o grupo
inmediatamente anterior. La secuencia puede tener cero o ms caracteres del
inmediatemente precedente.
Un smbolo interrogacin (?) indica que el caracter o tem inmediatamente
anterior puede aparecer cero o una vez, mximo.
Un smbolo ms (+) indica que el caracter o tem inmediatamente anterior puede
aparecer una o ms veces.
Un smbolo acento circunflejo (^) si aparece al inicio de una expresin
representa un anclaje al inicio de una lnea o cadena de texto.
Un smbolo pesos ($) si aparece al final de una expresin representa un anclaje al
final de una lnea o cadena de texto.
Una lista de caracteres encerrada en [ ] representa un nico caracter cualquiera
de la lista de caracteres encerrada.
Un rango de caracteres encerrado en [ ] representa un nico caracter cualquiera
del rango de caracteres encerrado. Un rango de caracteres comienza con un
caracter, sigue con un smbolo menos (-), y termina con un caractere
numricamente superior o posterior al que comienza el rango.
Una lista de caracteres encerrada en [^ ] representa un nico caracter cualquiera
que no est en la lista de caracteres encerrada.
Un rango de caracteres encerrado en [^ ] representa un nico caracter
cualquiera que no est en el rango de caracteres encerrado. Un rango de
caracteres comienza con un caracter, sigue con un smbolo menos (-), y
termina con un caractere numricamente superior o posterior al que comienza el
rango.
Cuando se encierra una parte de la expresin regular entre pares ede parntess
( ) la parte encerrada se considera una subexpresin, que bsicamente se trata
como un tem o elemento nico.
El smbolo barra vertical (|) dentro de las expresiones regulares extendidas
sirve para indicar alternativas, de las cuales es posible escoger o concordar con
una.
Se pueden indicar cuntas repeticiones de un item se permiten o deben darse en
una expresin regular si se usa la construccin {min,max} como sufijo de un item.
Por ejemplo, a{2,5} indica que se necesita para concordancia un mnimo de dos
aes y un mximo de cinco. Si se omite el primer nmero egrep asume cero (0), si
se omite el segundo nmero no se asume un mximo. As ? es equivalente a
{0,1} o {,1}, + es equivalente a {1,}, y * es equivalente a {0,}.
Ejemplos:
e@abe:e/> cat Celulares.tsv
Alessio Di Mare (311) 688-1162
Carlos Castilla V. (313) 433-7386
Jairo E. Soler (315) 797-1397
Jorge Molina M. (315) 344-8150
Jorge Russo (311) 818-8709
Jorge Valbuena V. (313) 571-6462
Omar Villalba (313) 388-7017
Ramn Barrios Lascar (315)313-7269
Yeimy Fontalvo (300) 817-4126
e@abe:e/> egrep '3.[15]' *.tsv
Celulares.tsv:Alessio Di Mare (311) 688-1162
Celulares.tsv:Jairo E. Soler (315) 797-1397
Celulares.tsv:Jorge Molina M. (315) 344-8150
Celulares.tsv:Jorge Russo (311) 818-8709
Celulares.tsv:Ramn Barrios Lascar (315)313-7269
e@abe:e/> egrep '8[^-]' *.tsv
Celulares.tsv:Alessio Di Mare (311) 688-1162
Celulares.tsv:Carlos Castilla V. (313) 433-7386
Celulares.tsv:Jorge Molina M. (315) 344-8150
Celulares.tsv:Jorge Russo (311) 818-8709
Celulares.tsv:Omar Villalba (313) 388-7017
Celulares.tsv:Yeimy Fontalvo (300) 817-4126
e@abe:e/> egrep '(^|[^a-zA-Z])[a-zA-Z]{5} ' *.tsv
Celulares.tsv:Jairo E. Soler (315) 797-1397
Celulares.tsv:Jorge Molina M. (315) 344-8150
Celulares.tsv:Jorge Russo (311) 818-8709
, %
' &
( '
% (
%. )
*
!"#$ *
) +
- ,
& -
+ %.
Donde:
Los smbolos [ y ] indican que las opciones y los argumentos son opcionales, no
hacen parte de la sintaxis.
A sort pueden drsele cero o ms archivos. Si no se le dan archivos sort lee la
entrada estndar.
La opcin A indica a sort que debe usar nicamente los valores ASCII de los
caracteres para hacer el ordenamiento.
La opcin b indica a sort que debe ignorar los espacios y tabuladores para buscar
la primera o ltima columna de un campo.
La opcin c se usa para que sort no ordene, slo reportar verdadero o falso,
indicando si los archivos de entrada estn ya ordenados segn indiquen las
opciones. Como siempre, el valor verdadero en el intrprete de comandos shell
es un cdigo de retorno cero (0).
La opcin d se usa para que sort ordene segn diccionario. En estos
ordenamientos slo se tienen en cuenta las letras, nmeros y espacios.
Se muestra en este caso simplemente cmo son los contenidos del archivo Empresas.tsv.
e@abe:e/> sort -c Empresas.tsv && echo "Empresas.tsv est ordenado!"
Empresas.tsv est ordenado!
Se usa la opcin c en este segundo caso para decir a sort que revise si el archivo
Empresas.tsv est ordenado. Como no muestra salida debern usarse las facilidades del shell
para revisar el cdigo de retorno.
En este tercer caso se usa la opcin r para que el ordenamiento sea inverso. Se us la
opcin A para que el ordenamiento no use la definicin del idioma del Unix donde sort est
corriendo.
e@abe:e/> sort -t' ' -k 2 Empresas.tsv
Yeimy Fontalvo
Jairo E. Soler Net.Solutions
Alessio Di Mare Redsis
Jorge Russo Redsis
Jorge Molina M. SENA
Yasser Barrios Lascar SupraImpresores
Jorge Valbuena V. iKnow
Ramn Barrios Lascar iKnow
En este caso sptimo se hace un ordenamiento usando la segunda letra del primer campo
(k1.2) , definiendo de paso que el separador de campos es un caracter tabulador.
e@abe:e/> cat Numeros.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
o tambin
tr { -cd|-cs|-Cd|-Cs| -d| -s} [ -A] caracteres
Donde:
Los smbolos [ y ] indican que las opciones y los argumentos son opcionales, no
hacen parte de la sintaxis. Si se dan dos cadenas de caracteres como argumentos
no es obligatorio dar alguna opcin.
Los smbolos { y } indican que las opciones y los argumentos son opcionales, no
hacen parte de la sintaxis. Si se dan una cadena de caracteres como argumento es
obligatorio dar alguna opcin.
El smbolo | indica posibilidad, se usa para mostrar las posibles opciones, no
hace parte de la sintaxis.
A tr pueden drsele una o dos cadenas -secuencias- de caracteres. Como tr
entiende un subconjunto de las expresiones regulares extendidas las cadenas
deberan estar encerradas entre .
La opcin A se usa para indicar que tr debe usar ordenamiento puramente ASCII
cuando se le den rangos de caracteres, no debe tener en cuenta los
ordenamientos segn el idioma en que est funcionando el UNIX donde corre.
La opcin C se usa para indicar que tr no debe tomar el valor de la cadena
caracteres1 si no que debe tomar el valor del complemento de caracteres1. El
complemento se define como los otros caracteres que componen el conjunto
nacional segn el idioma definido por la variable de ambiente LC_COLLATE.
La opcin c se usa para indicar que tr no debe tomar el valor de la cadena de
caracteres1 si no que debe tomar del valor del complemento de caracteres1.
El complemento se define como los otros caracteres que componen el juego de
caracteres ASCII.
En este primer caso simplemente se muestran los contenidos del archivo Celulares.tsv
usando el comando cat.
e@abe:e/> tr -d 3 < Celulares.tsv
Alessio Di Mare (11) 688-1162
Carlos Castilla V. (1) 4-786
Jairo E. Soler (15) 797-197
Jorge Molina M. (15) 44-8150
Jorge Russo (11) 818-8709
Jorge Valbuena V. (1) 571-6462
Omar Villalba (1) 88-7017
Ramn Barrios Lascar (15)1-7269
Yeimy Fontalvo (00) 817-4126
En este tercer caso de los ejemplos se usa la opcin d con una cadena de dos caracteres, lo
que indica que debe borrar de la salida cualquier aparicin de cualquiera de los dos
caracteres, aunque la cadena completa 83 no aparece en le texto origen. tr toma los
caracteres individuales.
e@abe:e/> tr '0123456789' 'OI2EAS6TB9' < Celulares.tsv
Alessio Di Mare (EII) 6BB-II62
Carlos Castilla V. (EIE) AEE-TEB6
Jairo E. Soler (EIS) T9T-IE9T
Jorge Molina M. (EIS) EAA-BISO
Jorge Russo (EII) BIB-BTO9
Jorge Valbuena V. (EIE) STI-6A62
Omar Villalba (EIE) EBB-TOIT
Ramn Barrios Lascar (EIS)EIE-T269
Yeimy Fontalvo (EOO) BIT-AI26
En este cuarto caso de los ejemplos se usan dos argumentos de igual longitud, as cada vez
que se encuentre en la entrada el primer caracter del argumento1 se reemplaza por el primer
caracter del argumento2 en la salida (0 se reemplaza por O), cada vez que se encuentre en la
entrada el segundo caracter del argumento1 se reemplaza por el segundo caracter del
argumento2 (1 se reemplaza por I), y as.
e@abe:e/> tr '[:lower:]' '[:upper:]' < Celulares.tsv
ALESSIO DI MARE (311) 688-1162
CARLOS CASTILLA V. (313) 433-7386
JAIRO E. SOLER (315) 797-1397
JORGE MOLINA M. (315) 344-8150
JORGE RUSSO (311) 818-8709
JORGE VALBUENA V. (313) 571-6462
OMAR VILLALBA (313) 388-7017
RAMN BARRIOS LASCAR (315)313-7269
YEIMY FONTALVO (300) 817-4126
En este quinto caso de los ejemplos se usan clases de caracteres para que tr reemplace los
caracteres en minsculas en la entrada por los equivalentes en maysculas en la salida. tr no
conoce las maysculas adecuadas de cada caracter en minsculas. Pero la a minscula
En estos dos casos se muestra cmo funciona tr cuando la segunda secuencia de caracteres
de los argumentos es ms corta que la primera: slo una parte de la clase -en los ejemplos-
es reemplazada en la salida.
e@abe:e/> tr '[:digit:]' 'abcd[e*]' < Celulares.tsv
Alessio Di Mare (dbb) eee-bbec
Carlos Castilla V. (dbd) edd-edee
Jairo E. Soler (dbe) eee-bdee
Jorge Molina M. (dbe) dee-ebea
Jorge Russo (dbb) ebe-eeae
Jorge Valbuena V. (dbd) eeb-eeec
Omar Villalba (dbd) dee-eabe
Ramn Barrios Lascar (dbe)dbd-ecee
Yeimy Fontalvo (daa) ebe-ebce
Es este otro caso se usa [C*] para que la segunda cadena de caracteres de los argumentos
tenga la misma longitud de la primera, repitindo los ltimos caracteres las veces que sea
necesario.
e@abe:e/> tr -s '[:digit:]' < Celulares.tsv
Alessio Di Mare (31) 68-162
Carlos Castilla V. (313) 43-7386
Jairo E. Soler (315) 797-1397
Jorge Molina M. (315) 34-8150
Jorge Russo (31) 818-8709
Jorge Valbuena V. (313) 571-6462
Omar Villalba (313) 38-7017
Ramn Barrios Lascar (315)313-7269
Yeimy Fontalvo (30) 817-4126
Utilidades, ms utilidades
Aunque en la lnea de comandos del intrprete shell de UNIX hay unas tareas u operaciones
que son ms difciles de hacer que en la interfaz grfica cuando slo hay que hacerlas o
repetirlas una o dos veces, la mayora de las tareas que haya que repetir muchas veces es
muchsimo ms fcil y rpido hacerlas combinando comandos. As un UNIX tpico o estndar
incluye muchos, muchsimos comandos para todo.
Como la entidad central que contiene datos en un UNIX es el archivo, la mayora de los
comandos de UNIX operan sobre archivos. En este apartado trataremos algunos de los
muchos comandos necesarios para hacer operaciones sobre archivos, en especial sobre
mltiples archivos.
Dentro de toda la cantidad de herramientas con las que cuenta un operador Unix hay una
que tienen reconocimiento especial ya que se le denomina la navaja suiza del administrador
UNIX, esta herramienta lleva el nombre de find.
El comando find navega recursivamente rboles de directorios y selecciona archivos y
directorios segn una serie de criterios que se le den, a los archivos y directorios
seleccionados puede hacerle una serie de acciones que indique quien lo invoca. La sintaxis
general de find es muy sencilla:
find directorio ... -criterio ... -accin ...
Donde:
Slo directorio es obligatorio segn el estndar POSIX. En algunos sistemas UNIX
ni un directorio como argumento es obligatorio, asumiendo en este caso el
directorio actual.
Pueden darse uno o ms directorios, usando rutas relativas o absolutas. Como
cada directorio es un argumento, debern separarse por espacios como todo
argumento en el shell -realmente deben separarse por $IFS-.
find navega recursivamente -usando mtodo infijo- cada uno de los directorios
que se den como argumento. find no sigue los enlaces simblicos.
Los criterios son de seleccin, que indican cules de los archivos y directorios
se seleccionarn para realizar en ellos, uno a uno las acciones. Como el criterio
predeterminado es todos si no se da un criterio de seleccin find llevar a cabo
las acciones para todos y cada uno de los archivos y directorios encontrados al
navegar recursivamente cada uno de los directorios argumento.
Las acciones indican qu hay que hacer con cada uno de los archivos y
directorios seleccionados al navegar recursivamente los directorios iniciales
dados, segn los criterios de seleccin dados. La accin predeterminada, cuando
no se dan las acciones es -print.
Acciones en find
El comando find tiene muchas menos acciones que criterios. Acciones son lo que puede
hacer find con cada uno de los archivos o directorios seleccionados. La accin
predeterminada -cuando no se indican acciones- en find es -print. Las acciones se listan a
continuacin:
La accin -print hace que find reporte en la salida estndar los nombres de los
archivos o directorios que va seleccionando. Si el argumento de directorio inicial
est dado como una ruta absoluta -print listar nombres como rutas absolutas, de
lo contrario usar nombres como rutas relativas.
La accin -ls hace que find reporte en la salida estndar los nombres de los
archivos o directorios que va seleccionado, con detalles adicionales. Si el
argumento de directorio inicial est dado como una ruta absoluta -ls listar
nombres como rutas absolutas, de lo contrario usar nombres como rutas
relativas. El comando find reporta, en orden, el nmero de inodo, el tamao en
Kilobytes, los permisos, el nmero de nombres, el usuario, el grupo, el tamao
en Bytes, el tiempo de ltima modificacin y el nombre.
La accin -exec ComandoCompleto hace que find ejecute ComandoCompleto con
cada archivo seleccionado. ComandoCompleto debera terminar en \; o ; para
evitar la interpretacin del shell. Si dentro de ComandoCompleto se encuentra el
par {} el comando find reemplazar el nombre del archivo o directorio
seleccionado para hacer la ejecucin del comando. Devuelve verdadero si
...
Este primer caso de los ejemplos simplemente muestra cmo listar recursivamente una
estructura de rbol en UNIX usando find. Slo se le da un directorio inicial, en este caso el
actual (.).
e@abe:e/> find . -ls
64 4 drwxr-xr-x 4 e system 4096 Sep 16 20:34 .
65 1 -rw-r--r-- 1 root system 248 Apr 11 08:53 ./.profile
66 9 -rw------- 1 e system 8770 Sep 18 09:23 ./.sh_history
182 3 -rw-r--r-- 1 e system 2413 Aug 18 21:40 ./procesos.txt
67 1 -rw-r--r-- 1 e system 29 Aug 16 23:02 ./actual.txt
177 1 -rw-r--r-- 1 e system 29 Aug 14 23:15 ./dato viejo
72 0 -rw-r--r-- 1 e system 0 Aug 14 23:15 ./LitteFile
4 1 drwxr-xr-x 2 e system 256 Aug 14 19:18 ./.ssh
183 1 -rw-r----- 1 e system 760 Aug 18 23:09 ./ramon.txt
180 18 -rw-r--r-- 1 e system 17804 Aug 14 23:16 ./MadRamon 1.png
185 1 -rw------- 1 e system 147 Aug 19 17:02 ./.Xauthority
12288 1 drwxr-xr-x 3 e system 256 Aug 16 17:37 ./subdir1
12352 1 drwxr-xr-x 2 e system 256 Aug 15 21:05 ./subdir1/
Antiguo_SubDir
12289 18 -rw-r--r-- 1 e system 17804 Aug 16 17:37 ./subdir1/
MadRamon 1.png
12290 10 -rw-r--r-- 1 e system 10181 Aug 16 17:37 ./subdir1/
smit.log
12291 0 -rw-r--r-- 1 e system 0 Aug 16 17:37 ./subdir1/
LitteFile
68 1 -rw-r--r-- 1 e system 1 Aug 18 21:31 ./
nuevoArchiv2.txt
...
En este segundo caso de los ejemplos se nota el uso de la accin -ls que incluye los
detalles de los archivos seleccionados, como se mencion en las notas acerca del comando.
Como no se da un criterio de seleccin, el comando find muestra todos los archivos y
directorios del inicial hacia abajo (recursivamente).
e@abe:e/> find . -inum 211 -ls
211 1 -rw-r--r-- 1 e system 31 Sep 14 09:13 ./Romanos.txt
Este tercer caso de los ejemplos muestra el uso de la opcin de seleccin -inum que
selecciona un archivo o directorio dado su nmero de inodo -nico por sistema de
archivos-.
e@abe:e/> find . -type d -print
.
./.ssh
Este cuarto caso muestra el uso de la opcin de seleccin -type, que con el argumento d
hace que find slo seleccione los directorios. Tambin se agrega la opcin de accin -print
que muestra los nombres de lo seleccionado. Como es la accin predeterminada en esta
situacin no cambia para nada la salida del comando find.
e@abe:e/> find . -perm -111 -ls
64 4 drwxr-xr-x 4 e system 4096 Sep 16 20:34 .
4 1 drwxr-xr-x 2 e system 256 Aug 14 19:18 ./.ssh
12288 1 drwxr-xr-x 3 e system 256 Aug 16 17:37 ./subdir1
12352 1 drwxr-xr-x 2 e system 256 Aug 15 21:05 ./subdir1/
Antiguo_SubDir
...
Este quinto caso de los ejemplos muestra el uso de la opcin de seleccin -perm, que
cuando se le da un nmero debe ser octal, y si se le da con un smbolo menos (-) asumir
al menos estos permisos, tal vez otros adicionales. Como se le da 111 el comando find
entiende --x--x--x, que con el menos (-) asume que al menos tenga --x--x--x. Lista con
detalles lo seleccionado y se nota que stos s cumplen con el criterio.
e@abe:e/> find /tmp /home -links +2
/tmp
/tmp/bos
find: 0652-081 cannot change directory to </tmp/lost+found>:
: The file access permissions do not allow the specified action.
find: 0652-081 cannot change directory to </tmp/wsmdata.196726>:
: The file access permissions do not allow the specified action.
/tmp/vgdata
/tmp/ejemplo
/home
find: 0652-081 cannot change directory to </home/lost+found>:
: The file access permissions do not allow the specified action.
...
El sexto caso de los ejemplos muestra cmo cuando un usuario usa find, el comando no
puede ir donde el usuario manualmente no puede ir (usando cd). En este caso se muestra
cmo usar dos directorios para iniciar una bsqueda (simplemente separndolos con
espacios), y cmo buscar segn el nmero de nombres (en este caso los que tengan ms de
dos nombres).
e@abe:e/> find /tmp /home -links +2 2> /dev/null
/tmp
/tmp/bos
/tmp/vgdata
/tmp/ejemplo
/home
/home/e
/home/e/subdir1
...
El sptimo caso de los ejemplos muestra cmo cuando un usuario usa find, el comando no
puede ir donde el usuario manualmente no puede ir (usando cd). Para evitar la mezcolanza
de lo reportado por find con los mensajes de error se usa redireccin, se mandan los
mensajes de error al archivo /dev/null.
e@abe:e/> find /tmp /home ! -user e -ls 2> /dev/null
2 8 drwxrwxrwt 10 bin bin 8192 Sep 18 09:22 /tmp
10 1 drwxr-xr-x 2 root system 256 Aug 9 13:15 /
tmp/.oslevel.datafiles
11 0 -rw-r--r-- 1 root system 0 Apr 10 13:18 /
tmp/.oslevel.datafiles/.oslevel.hold
26 1 -rw-r--r-- 1 root system 62 Aug 9 12:33 /
tmp/.oslevel.datafiles/.oslevel.mlinfo.cache
29 1 -rw-r--r-- 1 root system 5 Aug 9 12:33 /
tmp/.oslevel.datafiles/.oslevel.cache.sum
52 3 -rw-r--r-- 1 root system 3068 Aug 17 10:37 /
tmp/.ctinst.log
106 13 -rwxr--r-- 1 test02 testgrp1 12292 Aug 9 23:56 /
tmp/.DS_Store
120 1 -rw-r--r-- 1 root system 406 Apr 10 08:47 /
tmp/.sr_migrate.log
4 0 -rw------- 1 root system 0 Apr 10 11:05 /
tmp/.strload.mutex
14 49 -rw-r--r-- 1 root system 49464 Apr 10 15:41 /
tmp/.tmpfile.123028
23 1 -rw-r--r-- 1 root system 29 Aug 9 10:42 /tmp/
File1.txt
17 4 -rw-r--r-- 1 root system 3584 Apr 13 00:38 /tmp/
tlist159808
8 0 -rw-r----- 1 root system 0 Apr 10 20:48 /tmp/
Spmi_shm_hook
18 888 -rw-r----- 1 root system 909172 Aug 9 11:55 /tmp/samba-
client-2.2.7-4.aix4.3.ppc.rpm
...
En este octavo caso de los ejemplos se usa find con un operador lgico NOT (el
smbolo !), donde unido con -user e indicia seleccionar los que su dueo no es e, como
tal vez no pueda entrar a buscar en ciertos directorios, los mensajes de error se
redireccionan a /dev/null (con 2>).
e@abe:e/> find /home -size +10
...
En este noveno caso de los ejemplos se muestra el uso de la opcin de seleccin -size.
Con sta se dice a find que seleccione los archivos que miden ms de 5KB (10 bloques de
512B). El comando reporta que no pudo entra a algunos subdirectorios del inicial /home.
e@abe:e/> find /home -mtime -1 -ls 2> /dev/null
66 9 -rw------- 1 e system 9166 Sep 18 09:29 /home/
e/.sh_history
En el dcimo caso se le dice a find que seleccione los archivos -o directorios- debajo de /
home que han sido modificados hace menos de un da (con la opcin de seleccin -mtime
-1), que les liste los detalles (con la accin -ls), y los mensajes de error los mandamos al
archivo /dev/null.
e@abe:e/>find /home -type f -a -user e -ok rm {} \;
find: 0652-081 cannot change directory to </home/lost+found>:
: The file access permissions do not allow the specified action.
rm /home/e/.sh_history (?) n
rm /home/e/dato viejo (?) y
rm /home/e/LitteFile (?)
...
En el caso once de los ejemplos se le dice a el comando find que seleccione los archivos
que cumplen dos criterios: que sean de tipo f (es decir que sean archivos), usando el criterio
de seleccin -type f y (AND) que tengan como dueo al usuario e. Con cada uno de los
seleccionados deber ejecutar un rm, pero deber preguntar antes de ejecutar, para ello
usando la accin -ok rm {} \;. Se nota cmo find reemplaza el nombre de lo encontrado o
seleccionado en la posicin donde est el par de smbolos {} en el comando armado para la
accin -ok. Se nota tambin cmo \; pertenece a la sintaxis pero no se usa a la hora de
ejecutar el comando. Se nota finalmente cmo es la pregunta que find hace, y cmo se
puede responder usando y -para dar un s y que find ejecute el comando que arm-, o
usando otra cosa -en los ejemplos n- para que find no ejecute el comando que arm.
Ejemplo Especial:
Para buscar los archivos que cuyo nombre tiene alguna caracterstica y que contienen cierto
texto se usa:
Esta construccin ubica simplemente los archivos a los que amerita revisarles sus
contenidos (usando el comando find, que no revisa contenidos), y luego de ubicados se los
pasa a grep que los abre y s revisa lnea por lnea para verificar si dentro de los contenidos se
encuentra el texto a buscar (grep abre y revisa los contenidos, pero no ubica los archivos).
Esta construccin reporta el nombre de cada archivo que contenga el texto a buscar, y la
lnea donde el texto se encontr.
!
"
#
$
%
&
5.236
'
(
+,-./0,1.23!1.23"1.23#1.23$1.23%1444
)
!*
Como muchas veces un administrador usa find para ejecutar un comando en muchsimos
archivos, casi siempre a travs de la accin -exec del comando find, y como find ejecuta al
comando una vez por cada uno de los archivos seleccionados, y si find selecciona miles de
archivo el comando se ejecutar -o al menos se intentar ejecutar- miles de veces. Como
muchos o muchsimos de los comandos de UNIX pueden ejecutarse dndole muchos -tal vez
centenares- de argumentos, es muy ineficiente ejecutar miles de veces un comando con un
argumento, en vez de una vez con miles de argumentos.
En muchos caso puede usarse la construccin comandoEjecutar -opciones $(find /
directorio /criterios -print), pero si find selecciona miles de archivos la lnea de
comandos dentro de $( ... ) quedar muy muy larga, posiblemente generando error, ya
que la lnea de comandos del intrprete shell soporta secuencias muy largas, pero no
infinitas.
Para sobreponerse a todas las situaciones mencionadas los UNIX incluyen un comando
llamado xargs que:
Recibe nombres de archivos por entrada estndar y con los mismos arma lneas
de comandos largas.
Conoce las limitaciones de las lneas de comandos del UNIX donde ejecuta para
no sobrepasar los topes.
Permite especificar cmo deben ser las lneas de comandos que arma.
La sintaxis del comando xargs es:
xargs [ -E marcaFin ] [ -I comodn ] [ -L mnimo ] [ -n mximo ] [ -p ] [ -s
maxCars ] [ -t ] comando
Donde:
Los smbolos [ y ] indican que las opciones y los argumentos son opcionales, no
hacen parte de la sintaxis.
En el primer caso de los ejemplos se usa artificialmente xargs para ejecutar un comando
sobre muchos archivos, en este caso se le da compress -v a xargs y el arma una lnea de
comandos con posiblemente muchsimos argumentos, toda la lnea comenzando con
compress -v. Si la lnea de comandos es demasiado grande, el tomara muchos de los
argumentos que va leyendo de la entrada estndar y armara la lnea de comandos ms
grande posible comenzando con compress -v. Armara una segunda, y as, hasta consumir
toda la entrada estndar.
e@abe:e/> echo file[C-H]* | xargs -t compress -v
compress -v fileC fileD fileE fileF fileG fileH
fileC: Compression: 55.18% This file is replaced with fileC.Z.
fileD: Compression: 55.18% This file is replaced with fileD.Z.
En el segundo caso de los ejemplos se le da la misma entrada a xargs, pero se usa la opcin
t para poder observar cmo es la lnea de comandos que compress usara -que xargs arma-.
e@abe:e/> echo file[C-H]* | xargs -t -n3 compress -v
compress -v fileC fileD fileE
fileC: Compression: 55.18% This file is replaced with fileC.Z.
fileD: Compression: 55.18% This file is replaced with fileD.Z.
fileE: Compression: 55.18% This file is replaced with fileE.Z.
compress -v fileF fileG fileH
fileF: Compression: 55.14% This file is replaced with fileF.Z.
fileG: Compression: 55.14% This file is replaced with fileG.Z.
fileH: Compression: 55.18% This file is replaced with fileH.Z.
En el tercer caso de los ejemplos se usa xargs con la misma entrada, pero esta vez adems
de usar t para observar los comandos que xargs arma, se usa la opcin n con un 3 para que
xargs arme lneas de comandos con mximo tres tems tomados de la entrada estndar.
e@abe:e/> find . -name 'file[C-H]*' | xargs -L 1 -I _ echo mv _ _-Compr
mv ./fileG.Z ./fileG.Z-Compr
mv ./fileH.Z ./fileH.Z-Compr
mv ./fileC.Z ./fileC.Z-Compr
mv ./fileD.Z ./fileD.Z-Compr
mv ./fileE.Z ./fileE.Z-Compr
mv ./fileF.Z ./fileF.Z-Compr
En el cuarto caso de los ejemplos se usa el comando xargs en una situacin tpica:
combinado con find. En este caso find busca y selecciona -y reporta- unos ciertos archivos,
que pasa a xargs a travs de redireccin, el que armar unas lneas de comandos. Con la
opcin -L xargs no armar lneas de comandos imposiblemente grandes, tomar tantos
tems de la entrada estndar como le dice el argumento de L, en esta caso un item. Con la
opcin -I se indica a xargs que use algo como comodn para ubicar en la lnea de comandos
el texto del tem que recin tom de la entrada estndar. En este caso se usa un _. Luego se
arma una lnea de comandos con el tem. Para no necesariamente ubicarlo al final de lo dado
a xargs como argumento se usa el smbolo de reemplazo, en este caso un _. El smbolo de
reemplazo puede usarse hasta cinco veces en una lnea de reemplazo generada por xargs.
Como se ve xargs deber armar algo como echo mv Nombre1 Nombre1-Compr, y se nota que
en realidad es as, porque se observan unas lneas de salida mv Nombre1 Nombre1-Compr.
!"#$%&''
()!"#$%&''
Donde:
Los smbolos [ y ] indican que las opciones y los argumentos son opcionales, no
hacen parte de la sintaxis.
El smbolo | indica posibilidad, se usa para mostrar las posibles opciones, no
hace parte de la sintaxis.
Si a cualquiera de los dos comandos (compress o uncompress) no se le dan
archivos como argumento, intentarn leer de la entrada estndar y escribir en la
salida estndar.
La opcin c se usa para que tanto compress como uncompress escriban en la
salida estndar (independientemente de se dio archivo como argumento). As no
intentan escribir archivos.
En este primer caso de los ejemplos se buscan archivos que ameritan ser comprimidos,
nicamente, usando find con el criterio -size.
e@abe:e/> compress -v $(find . -size +2000c)
. is not a regular file. It is not changed.
./MadRamon: A file or directory in the path name does not exist.
1.png: A file or directory in the path name does not exist.
./subdir1/MadRamon: A file or directory in the path name does not exist.
1.png: A file or directory in the path name does not exist.
compress: 0653-054 ./subdir1/smit.log.Z already has a .Z suffix. It is not
changed.
./.sh_history: Compression: 50.65% This file is replaced with ./.sh_history.Z.
./ibmserver2-lslpp-L.txt: Compression: 77.47% This file is replaced with ./
ibmserver2-lslpp-L.txt.Z.
En el tercer caso de ejemplo se usa la accin -exec del comando find para invocar
uncompress en cada archivo comprimido -que se sabe que tiene el nombre terminado en Z.
Se usa uncompress con la opcin v para que reporte los archivos conforme los va
descomprimiendo.
!"#$
!%&"#$
Como tanto compress como uncompress estn basados en el algoritmo patentado LZW (en
este momento el algoritmo es propiedad de Unisys-, Jean-Loup Gailly y Mark Adler lanzaron
el 31 de octubre de 1992 un nuevo par de programas diseados para reemplazarlos, todo
bajo el auspicio del proyecto GNU. Este nuevo par de programas usan un algoritmo ahora
llamado DEFLATE, que es una combinacin de LZ77 y codificacin Huffman. Como este par
de comandos hacen parte del proyecto GNU, ambos son de cdigo abierto.
Igual que compress, gzip est diseado para comprimir archivos individuales, y gunzip est
diseado para descomprimir los archivos creados por gzip. Ntese que gunzip reconoce los
archivos creados con compress y puede descomprimirlos.
Igual que compress, gzip toma un archivo y lo reemplaza por otro comprimido, con el
nombre ligeramente cambiado agregndole .gz, y gunzip toma un archivo .gz comprimido y
lo descomprime, generando un archivo sin la extensin .gz. La sintaxis de ambos comandos
es sencilla:
gzip [ -c ] [ -f ] [ -v ] [ -dgito | --fast | --best ] [ archivo ... ]
y
gunzip [ -c ] [ -f ] [ -v ] [ -t ] [ -l ] [ archivo ... ]
Donde:
Los smbolos [ y ] indican que las opciones y los argumentos son opcionales, no
hacen parte de la sintaxis.
El smbolo | indica posibilidad, se usa para mostrar las posibles opciones, no
hace parte de la sintaxis.
Si a cualquiera de los dos comandos (gzip o gunzip) no se le dan archivos como
argumento, intentarn leer de la entrada estndar y escribir en la salida estndar.
Ejemplos:
e@abe:e/> find . -size +2000c -ls
64 4 drwxr-xr-x 4 e system 4096 Sep 18 11:19 .
221 3 -rw-r--r-- 1 e system 2245 Sep 9 18:06 ./fileH
182 3 -rw-r--r-- 1 e system 2245 Sep 9 18:06 ./fileB
177 3 -rw-r--r-- 1 e system 2245 Sep 9 18:06 ./fileC
180 18 -rw-r--r-- 1 e system 17804 Aug 14 23:16 ./MadRamon
1.png
12289 18 -rw-r--r-- 1 e system 17804 Aug 16 17:37 ./subdir1/
MadRamon 1.png
12290 10 -rw-r--r-- 1 e system 10181 Aug 16 17:37 ./subdir1/
smit.log
191 11 -rw------- 1 e system 10456 Sep 18
10:57 ./.sh_history
193 3 -rw-r--r-- 1 e system 2245 Sep 9 18:06 ./fileD
194 3 -rw-r--r-- 1 e system 2245 Sep 9 18:06 ./fileE
En este primer caso de los ejemplos se buscan archivos que ameritan ser comprimidos,
nicamente, usando find con el criterio -size.
e@abe:e/> gzip -v $(find . -size +2000c)
gzip: . is a directory -- ignored
./fileH: 72.8% -- replaced with ./fileH.gz
./fileB: 72.8% -- replaced with ./fileB.gz
./fileC: 72.9% -- replaced with ./fileC.gz
./MadRamon: No such file or directory
1.png: No such file or directory
./subdir1/MadRamon: No such file or directory
1.png: No such file or directory
./subdir1/smit.log: 72.3% -- replaced with ./subdir1/smit.log.gz
./.sh_history: 72.5% -- replaced with ./.sh_history.gz
./fileD: 72.9% -- replaced with ./fileD.gz
./fileE: 72.8% -- replaced with ./fileE.gz
./fileF: 72.8% -- replaced with ./fileF.gz
./fileG: 72.8% -- replaced with ./fileG.gz
./fileI: 72.8% -- replaced with ./fileI.gz
./ibmserver2-lslpp-L.txt: 87.0% -- replaced with ./ibmserver2-lslpp-
L.txt.gz
./procesos.txt: 71.6% -- replaced with ./procesos.txt.gz
En este segundo caso de ejemplo se combina find con gzip usando substitucin de
comandos para que se vayan comprimiendo los archivos que find encontr. Se usa gzip con
la opcin v para que reporte las estadsticas de compresin de cada archivo que se va
comprimiendo.
e@abe:e/> find . -name '*gz' -exec gunzip -l {} \;
compressed uncompr. ratio uncompressed_name
633 2245 72.8% ./fileB
compressed uncompr. ratio uncompressed_name
631 2245 72.9% ./fileC
compressed uncompr. ratio uncompressed_name
2902 10456 72.5% ./.sh_history
compressed uncompr. ratio uncompressed_name
2842 10181 72.3% ./subdir1/smit.log
compressed uncompr. ratio uncompressed_name
631 2245 72.9% ./fileD
compressed uncompr. ratio uncompressed_name
633 2245 72.8% ./fileE
compressed uncompr. ratio uncompressed_name
633 2245 72.8% ./fileF
compressed uncompr. ratio uncompressed_name
633 2245 72.8% ./fileG
compressed uncompr. ratio uncompressed_name
En el cuarto caso se usa la opcin de accin -exec del comando find para ejecutar gunzip
-l en cada archivo comprimido y obtener unas estadsticas de compresin por archivo.
e@abe:e/> find . -name '*gz' -print | xargs gunzip -vl
method crc date time compressed uncompr. ratio uncompressed_name
defla c58ff355 Sep 9 18:06 633 2245 72.8% ./fileB
defla 4ee49376 Sep 9 18:06 631 2245 72.9% ./fileC
defla db9b9031 Sep 18 10:57 2902 10456 72.5% ./.sh_history
defla 44d5bb72 Aug 16 17:37 2842 10181 72.3% ./subdir1/smit.log
defla 4401742b Sep 9 18:06 631 2245 72.9% ./fileD
defla ae144046 Sep 9 18:06 633 2245 72.8% ./fileE
defla 7cc54b0d Sep 9 18:06 633 2245 72.8% ./fileF
defla d675841c Sep 9 18:06 633 2245 72.8% ./fileG
defla 58651c7f Sep 9 18:06 633 2245 72.8% ./fileI
defla e3f19b59 Sep 15 18:14 13669 105515 87.0% ./ibmserver2-lslpp-
L.txt
defla e1b6233a Aug 18 21:40 716 2413 71.6% ./procesos.txt
defla f2d5d36e Sep 9 18:06 633 2245 72.8% ./fileH
25189 146525 82.8% (totals)
En el quinto caso se usa una combinacin de find con xargs con la esperanza de que haya
slo una ejecucin de gunzip -vl. As (con las opciones v y l)se obtiene un reporte ms
detallado por archivo, pero como es una nica ejecucin, el reporte es ms conciso (y tiene
totales).
e@abe:e/> find . -name '*gz' -print | xargs gunzip -v
./fileB.gz: 72.8% -- replaced with ./fileB
./fileC.gz: 72.9% -- replaced with ./fileC
./.sh_history.gz: 72.5% -- replaced with ./.sh_history
./subdir1/smit.log.gz: 72.3% -- replaced with ./subdir1/smit.log
./fileD.gz: 72.9% -- replaced with ./fileD
./fileE.gz: 72.8% -- replaced with ./fileE
./fileF.gz: 72.8% -- replaced with ./fileF
./fileG.gz: 72.8% -- replaced with ./fileG
./fileI.gz: 72.8% -- replaced with ./fileI
./ibmserver2-lslpp-L.txt.gz: 87.0% -- replaced with ./ibmserver2-lslpp-
L.txt
./procesos.txt.gz: 71.6% -- replaced with ./procesos.txt
./fileH.gz: 72.8% -- replaced with ./fileH
En el sexto caso se usa una combinacin parecida, pero no un reporte de compresin (con
gunzip -l), si no una descompresin de los archivos, aunque tambin reporta, porque se
incluy la opcin v de gunzip.
!"#
A fines de la dcada de 1980 se notaba cmo la utilitad bsica para llevar a cabo copias de
respaldo a cinta de la poca era inadecuada e insuficiente. Por esta razn central se di un
nuevo desarrollo que termin tomando la forma del comando tar (tape archive). Este
comando y el formato que se desarroll para que el mismo manejara se dirigieron
originalmente a ser almacenados directamente en dispositivos en burto (raw devices), no en
archivos como es muy comn ahora. Esta utilidad y su formato se estandarizaron en POSIX.
1-1988 y luego en POSIX.1-2001. Aunque originalmente fue una herramienta y un formato
para copias de respaldo en dispositivos puramente secuenciales ahora es ms comn como
un formato para el transporte de mltiples archivos como un todo.
La mayora de las utilidades tar de los sistemas UNIX trabajan lo que ahora se denomina
formato USTAR (Uniform Standard Tape Archive), formato que permite almacenar
mltiples -muchsimos- archivos, con sus metadatos dentro de uno solo. Como los archivos
tar tienen un encabezado por archivo almacenado dentro de l, y este encabezado tiene
unos limitantes, conviene saber cules son estos lmites: bsicamente porciones de nombre
de mximo cien caracteres y archivos individuales de mximo 8GB.
Note que tar archiva pero no comprime, dejando esta tarea a alguna otra utilidad o al
dispositivo o medio de almacenamiento.
La sintaxis de tar es bastante compleja, pero de manera resumida se tiene:
tar { -c | -r | -x | -u } [ -R ] [ -D ] [ -C directiorio ] [ -L
ListaInclusin ] [ -X ListaExclusin ] [ -p ] [ -v ] [ archivo ... ]
Donde:
Los smbolos [ y ] indican que las opciones y los argumentos son opcionales, no
hacen parte de la sintaxis.
La opcin L con un nombre de archivo como argumento para dar a tar una lista
de archivos y directorios a procesar. Esta lista puede usarse como archivos a
copiar al medio de respaldo o como archivos a recuperar del medio de respaldo.
El archivo dado como argumento a la opcin L debe tener un nombre de archivo
a procesar por lnea.
El primer caso de los ejemplos simplemente muestra un listado de los archivos que se
tienen antes de iniciar el trabajo directamente con tar.
e@abe:e/> tar -cvpf empaque.tar archivo*
a archivo A.txt 0 blocks.
a archivo.part.txt 0 blocks.
a archivo.txt 0 blocks.
a archivo23.txt 0 blocks.
El segundo caso de los ejemplos muestra cmo se usa tar para crear un archivo de
respaldo: bsicamente a travs de las opciones c y f. En el ejemplo se agregan las opciones v
y p para que adems tar liste los nombres de los archivos conforme los va copiando al
respaldo y para que guarde todos los detalles como el dueo y los permisos para poderlos
recuperar despus.
e@abe:e/> gzip -v9 *tar
empaque.tar: 92.5% -- replaced with empaque.tar.gz
El tercer caso de los ejemplos simplemente usa gzip para comprimir la copia de respaldo
creada con tar.
e@abe:e/> rm archivo* && ls -l archivo*
ls: 0653-341 The file archivo* does not exist.
El quinto caso de los ejemplos muestra cmo tar no lee la entrada estndar -as que no
recibe del comando anterior-.
e@abe:e/> gunzip -c empaque.tar.gz | tar -tvpf -
-rw-r--r-- 501 0 0 Sep 09 19:21:29 2007 archivo A.txt
-rw-r--r-- 501 0 0 Sep 09 19:21:29 2007 archivo.part.txt
-rw-r--r-- 501 0 0 Sep 09 18:14:20 2007 archivo.txt
-rw-r--r-- 501 0 0 Sep 09 19:21:29 2007 archivo23.txt
-rw-r--r-- 501 0 105 Sep 09 18:05:31 2007 archivoA.txt
-rw-r--r-- 501 0 919 Sep 09 18:05:39 2007 archivoAB.txt
-rw-r--r-- 501 0 105 Sep 09 18:07:36 2007 archivoE.txt
-rw-r--r-- 501 0 105 Sep 09 18:07:45 2007 archivoZ.txt
-rw-r--r-- 501 0 220 Sep 09 18:06:16 2007 archivoaB.txt
-rw-r--r-- 501 0 220 Sep 09 18:06:06 2007 archivoab.txt
El sexto caso de los ejemplos muestra cmo tar puede leer de la entrada estndar o
escribir en la salida estndar si se usa la opcin f con un menos (-) como argumento.
e@abe:e/> gunzip -c empaque.tar.gz | tar -xvpf -
x archivo A.txt, 0 bytes, 0 media blocks.
x archivo.part.txt, 0 bytes, 0 media blocks.
x archivo.txt, 0 bytes, 0 media blocks.
x archivo23.txt, 0 bytes, 0 media blocks.
x archivoA.txt, 105 bytes, 1 media blocks.
Existen muchsimos comandos tiles en UNIX. Muchos son muy prcticos a la hora de hacer
scripts de shell.
Comando host
El sencillo comando host se usa bsicamente para hacer ejercicio del sistema de resolucin
de nombres de un sistema UNIX. La sintaxis bsica es:
host direccin
o
host nombre
Ejemplos:
e@abe:e/> host moe
Moe.lan is 192.168.1.8, Aliases: moe, ramon
e@abe:e/> host 192.168.1.254
gateway is 192.168.1.254, Aliases: gw
Comando hostname
El sencillo comando hostname se usa para configurar o consultar el nombre de la mquina
UNIX actual. La sintaxis es:
hostname
o
hostname NuevoNombre
Ejemplo:
e@abe:e/> hostname
abe
Comando uptime
El comando uptime muestra la informacin de vida del sistema donde se corre. El
comando muestra la hora en que se ejecuta, cunto lleva el sistema desde que se inici, el
nmero de usuarios conectados con sesin interactiva, y la carga promedio en el ltimo
perodo de 1 minuto, 5 minutos y 15 minutos. La carga promedio es el nmero de procesos
en estado activo durante el perodo.
Ejemplo:
e@abe:e/> uptime
12:00AM up 1 day, 9:20, 10 users, load average: 0.24, 0.10, 0.10
Donde:
La opcin a se usa para que du reporte por cada archivo contenido en los
directorios dados como argumentos, o en directorio actual si no se da como
argumento. El comando du reporta siempre por cada uno de los argumentos
dados, aunque sean archivos.
La opcin s se usa para que du reporte un resumen total del espacio ocupado por
todos los argumentos dados. El comando reportar el resumen del directorio
actual si no se le dan argumentos.
La opcin k se usa para que el reporte generado por du est dado en kilobytes.
La opcin m se usa para que el reporte generado por du est dado en megabytes.
La opcin g se usa para que el reporte generado por du est dado en gigabytes.
La opcin H se usa para que du siga los enlaces simblicos y tenga en cuenta el
espacio ocupado por lo apuntado por el enlace simblico.
Si no se dan ni k ni m ni g el comando du reportar en bloques de 512B sin
importar el formato en que estn almacenados los archivos en disco.
Si a du no se le dan argumentos (ni archivos ni directorios) usar el directorio
actual como argumento.
Ejemplos:
e@abe:e/> du
0 ./.ssh
0 ./subdir1/Antiguo_SubDir
64 ./subdir1
640 .
e@abe:e/> du -ms /tmp /etc
du: /tmp/lost+found: The file access permissions do not allow the specified
action.
du: /tmp/wsmdata.196726: The file access permissions do not allow the
specified action.
122.36 /tmp
du: /etc/tunables: The file access permissions do not allow the specified
action.
16.36 /etc
Ejemplos:
e@abe:e/> sum Meses.txt /etc/passwd
46778 1 Meses.txt
41837 1 /etc/passwd
Ejemplos:
e@abe:e/> cksum Meses.txt /etc/passwd
1927595220 175 Meses.txt
3518703885 676 /etc/passwd
El comando cksum usa el algoritmo estndar de verificacin CRC que se usa para verificar las
tramas ethernet.
Comando true
El comando true devuelve un cdigo de retorno verdadero siempre. No muestra ningn
tipo de salida. Sintaxis:
true
Ejemplo:
e@abe:e/> true && echo Devuelve VERDADERO
Devuelve VERDADERO
Una de los ms bsicos elementos dentro de un ambiente de programacin son las pruebas
lgicas. El lenguaje del shell tiene la posibilidad de hacer pruebas lgicas de una manera muy
sencilla: a travs del comando test.
El comando test recibe una o ms condiciones lgicas y devuelve un cdigo de retorno
cero (0) considerado como verdadero si la prueba lgica da verdadero, y devuelve
diferente de cero si la prueba lgica da falso. La sintaxis bsica es muy sencilla:
test pruebaLgica
o
[ pruebaLgica ]
Donde:
El comando test es equivalente a [.
El comando test ignora el ] final.
Si se usa la sintaxis [ ] hay que recordar que es un comando con argumentos, as
que los espacios son obligatorios.
El comando test devuelve verdadero a travs de un cdigo de retorno cero (0),
no genera mensajes por salida.
El comando test devuelve falso a travs de un cdigo de retorno diferente de
cero, no genera mensajes por salida, a menos que haya errores de sintaxis.
Existen muchas clases de pruebas lgicas, que se detallan a continuacin.
Pruebas lgicas bsicas
El comando test tiene una serie de operaciones lgicas bsicas, que aunque tienen un
aspecto extrao cuando se usan con test tienen mucho mejor apariencia cuando se usan
con la sintaxis [ ]:
expresin devuelve verdadero si expresin devuelve verdadero.
comando devuelve verdadero si comando devuelve verdadero (0).
! expresin (~) devuelve verdadero si expresin devuelve falso.
cadena1 = cadena2 ( ) devuelve verdadero si cadena1 (de texto) es igual a
cadena2 (de texto).
Los dos primeros casos de los ejemplos muestran el uso de la prueba lgica igual que y
no igual que en el comando test. Como el comando test no muestra salida (slo muestra
salida de errores cuando hay errores de sintaxis) se usan las construcciones lgicas del shell
de ejecucin condicional (&&) para generar un mensaje en caso de que se necesite.
e@abe:e/> ps
PID TTY TIME CMD
73924 pts/0 0:00 -bash
233706 pts/0 0:00 ps
315406 pts/0 0:00 -ksh
e@abe:e/> echo $$
315406
e@abe:e/> [ $$ -gt 1000 ] && echo "Mi numero de proceso es mayor que mil"
Mi numero de proceso es mayor que mil
El segundo caso de los ejemplos muestra el uso del operador lgico n del comando test.
Pruebas lgicas con archivos
Mucha de la funcionalidad del lenguaje de programacin del shell gira alrededor de las
necesidades del administrador del sistema. As, como la administracin normalmente
manipula archivos, el comando bsico test tiene implementadas unas series de pruebas con
archivos:
-r archivo devuelve verdadero si el usuario tiene permiso de lectura sobre el
archivo.
-w archivo devuelve verdadero si el usuario tiene permiso de escritura sobre
el archivo.
El primer caso de los ejemplos muestra cmo se puede probar si el usuario actual -con el
que se ejecuta test- tiene permisos para leer o escribir un archivo (o directorio).
e@abe:e/> [ -d /etc/security -a -x /etc/security ] && echo "Puedo entrar a /
etc/security"
Puedo entrar a /etc/security
El segundo caso muestra cmo comprobar que se tiene un directorio y que se tienen
permisos para entrar al mismo (usando los operadores de prueba lgica d y x), adems
muestra el uso del operador lgico a (AND).
e@abe:e/> [ -b /dev/hdisk3 ] && echo "El dispositivo hdisk3 existe"
El dispositivo hdisk3 existe
Donde:
El comando necesita hacer las operaciones sobre varios argumentos, as que hay
que separrselos con espacios.
Las operaciones bsicas son suma (+), resta (-), multiplicacin (*), divisin entera
(/), mdulo o residuo (%). Como el * de la multiplicacin es tambin un comodn
del shell, hay que escaparlo para que el shell no lo interprete como todos los
archivos, usando \*.
oper1 | oper2 retorna el valor de oper1 si no es nulo y no es cero, en
ambos casos retornando el valor de oper2. Como el smbolo | es especial en el
shell entonces habr que usarlo con escape \|.
oper1 & oper2 retorna el valor de oper1 si ambos valores son diferentes de
nulo y de cero, de lo contrario devuelve cero. Como el smbolo & es especial en el
shell, entonces habr que usarlo con escape \&.
cadena : exprReg2 retorna cuntos caracteres de cadena cumplen con la
expresin regular exprReg2, asumiendo que est anclada al comienzo (como si
tuviera un smbolo ^). Si no concuerda retorna un cero (0). Si se usan parntesis
para captura devuelve lo capturado. Como las expresiones comnmente tienen
smbolos con significado especial en el shell normalmente exprReg2 est
encerrada en ' '. Para captura se usan parntesis con escape \( \).
match cadena exprReg2 exactamente equivalente a cadena : exprReg2.
El caso uno de los ejemplos muestra cmo realizar operaciones matemticas bsicas con las
variables del shell: usando variable=$(expr operaciones ...). Ntese cmo debe usarse
sustitucin de comandos, sustitucin de variables y espacios para separar los operandos y los
operadores.
e@abe:e/> CADENA="Nombre Propio"
e@abe:e/> echo "Longitud =" $(expr length $CADENA)
expr: 0402-050 Syntax error.
Longitud =
e@abe:e/> echo "Longitud =" $(expr length "$CADENA")
Longitud = 13
El caso dos de los ejemplos muestra cmo es fcil cometer un error de sintaxis con expr. En
nuestro ejemplo, la variable de texto contiene dos palabras, pero la operacin length de
expr espera un nico operando -argumento- por lo que devuelve Syntax error. Se usan las
comillas dobles para que el shell pase un nico argumento al comando expr, pero que al
mismo tiempo, la variable est evaluada.
e@abe:e/> CADENA="Nombre Propio"
e@abe:e/> set -o vi
e@abe:e/> echo "Longitud =" $(expr length '$CADENA')
Longitud = 7
El caso cuatro de los ejemplos muestra cmo usar el operador : (match) de expr. Si la
primera cadena argumento concuerda con la expresin regular del segundo argumento expr
devuelve la longitud de lo que concuerda y adems retorna un cero (verdadero), as que el
if se cumple. Como de pronto no conviene ver el 1 que reporta expr, se hace redireccin a /
dev/null.
e@abe:e/> if VAL=$(expr "$RESP" : '\([yYsS]\)')
then
echo "RESP begins with 'y', 'Y', 's' o 'S'"
El quinto caso de los ejemplos muestra que se puede capturar la salida de expr para usarla
despus. En este caso se usa una expresin regular que contiene \( \) para capturar el texto
de la concordancia.
e@abe:e/> expr 7 / 2
3
El sexto caso muestra cmo expr slo hace clculos con enteros.
e@abe:e/> expr index abcdef fd
4
El octavo caso de los ejemplos muestra el uso de la operacin substr el comando expr.
o tambin
if comandoCondicin
then
Comandos si verdadero
...
else
Comandos si falso
..
fi
pero tambin
if comandoCondicin
then
Comandos si verdadero
...
elif comandoCondicion2
Comandos si Condicin2 verdadera
...
else
Comandos si falso
...
fi
Donde:
La sentencia de control if ejecuta comandoCondicin y analiza el cdigo de
retorno. Si devuelve verdadero (es decir 0), ejecuta lo anidado (Comandos si
verdadero). Si hay una parte else y el comandoCondicin devuelve falso (es decir
no 0) ejecuta lo anidado (Comandos si falso).
La sentencia de control if puede simular una sentencia case ... select de
otros lenguajes de programacin a travs de la parte elif comandoCondicin2.
La sentencia de control if termina con un fi.
Ejemplos:
if [ "$VAL" = "Y" ]
More...then
More... echo VAL igual Y
En el caso uno de los ejemplos se observa el uso ms tpico del comando test: combinado
como comandoCondicin con el comando if.
e@abe:e/> if grep -q root /etc/passwd
More...then
More... echo root existe en /etc/passwd
More...fi
root existe en /etc/passwd
En el caso dos de los ejemplos se observa cmo cualquier comando es vlido para usar con
if, aunque hay que verificar que el comando si devuelve cdigos de retorno que tengan
sentido. En el caso del ejemplo, grep devuelve verdadero si la expresin regular del primer
argumento est o se encuentra entre las lneas de los archivos dados.
Normalmente una computadora es til para tareas repetitivas. Una tarea que no se repite no
amerita programacin la verdad. Existen varias maneras de llevar a cabo tareas repetitivas en
el shell. La primera manera que veremos es la de repetir una tarea un nmero finito dado de
veces, usando una ligera variacin en un valor en cada una de las repeticiones. Para este
estilo de repeticiones existe el comando for en el shell. La sintaxis es muy sencilla:
for variable in lista
do
comandos
...
done
Donde:
El comando for crear una nueva variable si no existe.
El comando for inicia tomando el primer valor de lista, asignndolo a variable
y ejecutando todos los comandos anidados.
El comando for prosigue tomando el siguiente valor de lista, asignndolo a
variable y ejecutando todos los comandos anidados.
El comando for termina con la ejecucin donde variable tiene el ltimo valor de
lista.
El caso del ejemplo muestra lo bsico del comando for. Ntese cmo la lista se le da literal,
expandida, for no recibe un rango y fabrica los elementos.
e@abe:e/> for FIL in *.tsv
More...do
More... echo "Archivo: $FIL"
More...done
Archivo: Celulares.tsv
Archivo: Empresas.tsv
Donde:
El comando while ejecuta al comandoCondicin y analiza si el cdigo de retorno
es verdadero.
Mientras el cdigo de retorno de comandoCondicin sea verdadero el comando
while ejecutar todos los comandos anidados.
Cada vez que termina un ciclo de comandos anidados el comando while re-
ejecuta comandoCondicin, analizando nuevamente si el cdigo de retorno es
verdadero.
Cuando el comandoCondicin retorne diferente de verdadero el comando while
dejar de ejecutar los comandos anidados y terminar. La ejecucin contina en
la lnea que sigue a done.
Ejemplos:
e@abe:e/> while who | grep -q root
More...do
More... write root << FIN
More... Hola root
More...FIN
More... sleep 30
More...done
e@abe:e/>
El caso de los ejemplos ejecuta un comando who, y un comando grep que busca a root
dentro de la lista de usuarios generada por who. El comando ejecutar los anidados write y
sleep mientras se encuentre a root conectado como usuario.
Estando dentro de un ciclo for o un ciclo while puede romperse usando el comando break.
Este incondicionalmente se sale del ciclo y contina en la lnea que sigue al done:
e@abe:e/> i=1
e@abe:e/> while true
do
printf $i
En el ejemplo se muestra el uso del comando break. Ntese cmo se sale inmediatamente
del ciclo while, ni siquiera pasa por el comando echo que sigue.
o
let variable=expresin
o tambin
(( expresin ))
Donde:
El comando let y la construccin (( )) son equivalentes.
expr1 & expr2 AND de los bits de expr1 con los bits de expr2
expr1 | expr2 OR de los bits de expr1 con los bits de expr2
expr1 ^ expr2 XOR de los bits de expr1 con los bits de expr2
expr1 && expr2 1 si tanto expr1 como expr2 son no-cero, de lo contrario 0
Ejemplos:
e@abe:e/> let i=1
e@abe:e/> let i+5*4
e@abe:e/> echo $i
1
e@abe:e/> let i=i+5*4
e@abe:e/> echo $i
21
e@abe:e/> let i=5 j=4
e@abe:e/> if (( i*j<25 ))
More...then
More... echo "i*j es menor que 25"
More...fi
i*j es menor que 25
Como se observa en los ejemplos, el comando let permite definir variables. De paso las
variables quedan definidas como enteras. El comando let deja hacer operaciones aunque el