Anda di halaman 1dari 572

La lnea de comandos de

Linux Segunda edicin del


Internet

William E. Shotts, Jr.

Un libro
LinuxCommand.org

Excepto cuando se indique lo contrario, este trabajo es bajo


licencia
http://creativecommons.Org/licenses/by-nc-nd/3.0/

Copyright 2008-2013, William E. Shotts, Jr.

Esta obra est bajo la licencia Creative Commons Reconocimiento-No comercial-Sin obras
derivadas 3.0 Licencia de Estados Unidos. Para ver una copia de esta licencia, visite el enlace
de arriba o enviar una carta a Creative Commons, 171 Segunda Calle, Suite 300, San Francisco,
California, 94105, EE.UU..
Linux es la marca registrada de Linus Torvalds. Todas las dems marcas comerciales
pertenecen a sus respectivos propietarios.
Este libro forma parte del proyecto LinuxCommand.org, un sitio para la educacin y la
promocin dedicada a ayudar a los usuarios de sistemas operativos Linux heredados migran
hacia el futuro. Usted puede ponerse en contacto con el proyecto en LinuxCommand.org
http://linuxcommand.org.
Este libro tambin est disponible en forma impresa, publicada por Sin Almidn de prensa y
se pueden comprar donde quiera buenos libros se venden. Sin Almidn de prensa tambin
ofrece este libro en formato electrnico para los lectores electrnicos ms populares:
http://nostarch.com/tlcl.htm
Historial de versiones

Versin

Fecha

Descripcin

13.07

06 de julio 2013

Segunda edicin Internet.

09.12
09.11

14 de diciembre 2009
19 de noviembre 2009

Primera edicin Internet.

09.10

03 de octubre 2009

09.08

12 de agosto 2009

09.07

18 de julio 2009

Cuarto proyecto con retroalimentacin casi todo


revisor incorporado y editado hasta el captulo 37.
Tercer proyecto con formato de tabla revisada, la
aplicacin parcial de los colaboradores de
retroalimentacin y editado hasta el captulo 18.
Segundo proyecto de incorporacin de la primera
pasada edicin.
Completado el primer borrador.

Tabla de contenido
Introduccin. .................................................................................................... xvi
Por qu utilizar la lnea de comandos? .......................................................................xvi
Lo que trata este libro ................................................................................................... xvii
Quin debe leer este libro ............................................................................................ xvii
Qu hay en este libro ................................................................................................ xviii
Cmo leer este libro .................................................................................................... xviii
Requisitos previos ....................................................................................................xix
Por qu no lo llaman "GNU / Linux" ..................................................................xix
Agradecimientos ............................................................................................................ xx
Su regeneracin es necesaria! ..................................................................................... xx
Qu hay de nuevo en la segunda edicin del Internet ...............................................xxi
Lectura adicional ...........................................................................................................xxi
Colofn ..........................................................................................................................xxi

Parte 1 - Aprender La Shell .............................................................1


1 - Cul es la cscara ?. ..............................................................................2
Los emuladores de terminal ............................................................................................ 2
Sus primeras pulsaciones de teclas................................................................................ 2
Histrico de comandos............................................................................................... 3
Movimiento del cursor ................................................................................................ 3
Algunas palabras sobre ratones y enfoque ........................................................... 3
Pruebe algunos comandos simples ................................................................................ 4
Poner fin a una sesin de terminal.................................................................................. 5
La Consola Detrs de la cortina ............................................................................ 5
Resumiendo .................................................................................................................... 5
Lectura adicional ............................................................................................................. 6

2 - Navegacin. ................................................................................................. 7
Entender el archivo del rbol de sistemas ...................................................................... 7
El directorio de trabajo actual .......................................................................................... 7
Aadir el contenido de un directorio................................................................................ 8
Cambiar el directorio de trabajo actual ........................................................................... 9
Rutas absolutas.......................................................................................................... 9
Rutas relativas............................................................................................................ 9
Algunos atajos tiles ................................................................................................ 11
Datos importantes sobre nombres de archivo .................................................... 11
yo

Resumiendo

12

3 - Exploracin del sistema. ..........................................................................13


Ms diversin con Is ..................................................................................................... 13
Opciones y argumentos ........................................................................................... 14
Una mirada a ms largo At Long Formato............................................................... 16
Determinar el tipo de un archivo con el archivo ........................................................... 17
Viendo el contenido del archivo Con menos ................................................................ 17
Qu es el "texto"? ............................................................................................. 17
Menos es ms ..................................................................................................... 19
Una visita guiada........................................................................................................... 19
Enlaces simblicos ....................................................................................................... 23
Enlaces duros ............................................................................................................... 24
Resumiendo .................................................................................................................. 24
Lectura adicional ........................................................................................................... 24

4 - Manipulacin de archivos y directorios. ...............................................25


Los comodines .............................................................................................................. 25
Rangos de caracteres ......................................................................................... 27
Los comodines trabajar en la interfaz grfica de usuario Demasiado ............... 27
mkdir - Crea Directorios ................................................................................................ 28
cp - copia ficheros y directorios .................................................................................... 28
Opciones tiles y ejemplos ...................................................................................... 29
mv - Mover y renombrar archivos ................................................................................. 30
Opciones tiles y ejemplos ...................................................................................... 30
rm - Quitar los archivos y directorios ............................................................................ 31
Opciones tiles y ejemplos ...................................................................................... 31
Tenga cuidado con rm! ....................................................................................... 32
ln - Crear enlaces .......................................................................................................... 33
Enlaces duros .......................................................................................................... 33
Enlaces simblicos................................................................................................... 33
Vamos a construir una Zona de juegos ........................................................................ 34
Creacin de directorios ............................................................................................ 34
Copia de archivos .................................................................................................... 34
Mover y renombrar archivos .................................................................................... 35
Crear enlaces duros ................................................................................................. 37
La creacin de enlaces simblicos .......................................................................... 38
La eliminacin de archivos y directorios .................................................................. 39
La creacin de enlaces simblicos con la GUI ................................................... 40
Resumiendo .................................................................................................................. 41
Lectura adicional ........................................................................................................... 41

5 - Trabajar con los comandos. ....................................................................42


Qu son exactamente los comandos? ....................................................................... 42
La identificacin de los comandos ................................................................................ 43
Tipo - Muestra el tipo de un comando ..................................................................... 43
que - Ubicacin de la pantalla de un ejecutable ...................................................... 43
Obtencin de documentacin de un comando ............................................................. 44
ayuda - Obtener Ayuda Para Shell elementos includos ......................................... 44
--help - Pantalla de informacin de uso ................................................................... 45
ii

hombre - Muestra el Manual del Programa Una Pgina ............................................ 45


a propsito - Mostrar comandos apropiados ................................................................ 47
whatis - Muestra una descripcin muy breve de un comando .................................. 47
El hombre ms Brutal Pgina de todos ellos ........................................................... 48
info - Muestra la informacin de entrada de un programa de .................................... 48
README y otros archivos de documentacin del programa ..................................... 49
Crear sus propios comandos con alias ................................................................................. 50
Resumiendo ............................................................................................................................. 52
Lectura adicional..................................................................................................................... 52

6 - Redireccin. .............................................................................................. 53
Estndar de entrada, salida y error .............................................................................. 53
Redireccin de la salida estndar................................................................................. 54
La reorientacin de error estndar ............................................................................... 55
Redireccin de la salida estndar y el error estndar en un archivo ...................... 56
Cmo deshacerse de la produccin no deseado .................................................... 57
/ Dev / null En Unix Cultura ................................................................................. 57
Reorientacin de la entrada estndar .......................................................................... 57
gato - Concatenar archivos ...................................................................................... 57
Tuberas.........................................................................................................................59
La diferencia entre> y |........................................................................................ 60
Filtros ........................................................................................................................ 61
Lneas Reportar u omitir Repetido - Uniq ................................................................ 61
wc - Imprimir lnea, palabra y Nmero total de bytes .............................................. 62
Lneas de impresin coinciden con un patrn - grep .............................................. 62
cabeza / cola - Imprimir Primera / ltima parte de Archivos .................................... 63
tee - Leer de la entrada estndar y la salida a stdout y Archivos ........................... 64
Resumiendo .................................................................................................................. 65
Linux es la imaginacin ....................................................................................... 65

7 - Al ver el mundo como la Shell lo ve. ......................................................67


Expansin................................................................................................................................. 67
La expansin del nombre de ruta .................................................................................... 68
La expansin del nombre de ruta ................................................ De archivos ocultos 69
Expansin Tilde ................................................................................................................. 69
Expansin aritmtica......................................................................................................... 70
Expansin Brace................................................................................................................. 71
Expansin Parmetro ........................................................................................................ 72
Comando Sustitucin........................................................................................................ 73
Citando ..................................................................................................................................... 74
Doble Cotizaciones ............................................................................................................ 75
Soltero Cotizaciones .......................................................................................................... 76
Escapar Personajes ............................................................................................................ 77
Secuencias de escape barra diagonal inversa ........................................................... 77
Resumiendo ............................................................................................................................. 78
Lectura adicional..................................................................................................................... 78

8 - Trucos avanzadas del teclado................................................................ 79


De lnea de comandos de edicin ........................................................................................ 79
Movimiento del cursor .................................................................................................... 79
iii
Modificacin del texto ............................................................................................... 80

Cortar y pegar (destruir y tirar) Texto....................................................................... 80


La tecla Meta....................................................................................................... 81
Terminacin................................................................................................................... 81
Finalizacin programable .................................................................................... 83
Uso del historial ............................................................................................................. 83
Historia bsqueda .................................................................................................... 84
Historia de Expansin .............................................................................................. 86
guin.................................................................................................................... 86
Resumiendo .................................................................................................................. 86
Lectura adicional ........................................................................................................... 87

9 - Permisos.................................................................................................... 88
Los propietarios, miembros del grupo, y todos los dems .......................................... 89
La lectura, la escritura, y ejecucin .............................................................................. 90
chmod - Cambia el modo de archivo ...................................................................... 92
Qu diablos es octal? ....................................................................................... 93
Ajuste de modo de archivo con la GUI .................................................................... 95
umask - Establecer permisos predeterminados ...................................................... 96
Algunos permisos especiales ............................................................................. 98
Cambio de Identidades ................................................................................................. 99
do - Ejecutar un depsito de Sustituto de usuario e ID de grupo ............................ 99
sudo - ejecutar un comando como otro usuario .................................................... 101
Ubuntu y sudo ................................................................................................... 101
chown - Cambiar propietario del archivo y de grupo ............................................. 102
chgrp - Cambia Propiedad del Grupo .................................................................... 103
El ejercicio de nuestros privilegios .............................................................................. 103
Cambio de la contrasea ............................................................................................ 106
Resumiendo ................................................................................................................ 107
Lectura adicional ......................................................................................................... 107

10 - Procesos................................................................................................ 108
Cmo un proceso funciona ....................................................................................... 108
Visualizacin de Procesos .......................................................................................... 109
Viendo Procesos dinmicamente con la parte superior ........................................ 111
El control de procesos................................................................................................. 113
Interrupcin de un proceso .................................................................................... 114
Poner un proceso en segundo plano ..................................................................... 114
Volviendo un proceso para el primer plano ........................................................... 115
Parada (pausa) Proceso A ..................................................................................... 116
Seales ....................................................................................................................... 117
El envo de seales a los procesos con kill ........................................................... 117
Envo de seales a mltiples procesos con killall .................................................. 120
Ms de procesos relacionados Comandos................................................................. 120
Resumiendo ................................................................................................................ 121

Parte 2 - Configuracin y el medio ambiente ............................. 123


11 124

El

Medio

Ambiente.

IV
Lo que se almacena en el medio ambiente? .............................................................. 124

Examinar El Medio Ambiente................................................................................. 124


Algunas variables interesantes .............................................................................. 126
Cmo se establece el medio ambiente? .................................................................. 127
Qu hay en un archivo de inicio? ........................................................................ 128
Modificar el entorno .................................................................................................... 130
Qu archivos deben Nosotros .................................................................... Modificar?
130
Editores de texto .................................................................................................... 130
Utilizando un editor de texto .................................................................................. 131
Por qu comentarios son importantes ............................................................ 134
Activacin Nuestros Cambios ................................................................................ 135
Resumiendo ................................................................................................................ 135
Lectura adicional ......................................................................................................... 135

12 - Una suave introduccin a VI............................................................... 136


Por qu debemos aprender vi .................................................................................. 136
Un poco de historia ..................................................................................................... 137
Inicio y detencin de vi................................................................................................ 137
Modo de compatibilidad .................................................................................... 138
Modos de edicin ........................................................................................................ 139
Acceso al modo de insercin ................................................................................. 140
Salvando Nuestro Trabajo ..................................................................................... 140
Moviendo el cursor por ............................................................................................... 141
Edicin bsica ............................................................................................................. 142
Al aadir texto ........................................................................................................ 142
La apertura de una lnea ........................................................................................ 143
Eliminacin de Texto .............................................................................................. 144
Cortar, copiar y pegar texto ................................................................................... 145
Unirse Lneas ......................................................................................................... 147
Buscar y reemplazar....................................................................................................147
Busca dentro de una lnea ..................................................................................... 147
Busca el archivo completo ..................................................................................... 147
Bsqueda Global y reemplazo ............................................................................... 148
Edicin de varios archivos .......................................................................................... 150
Cambio entre archivos ........................................................................................... 151
Apertura de archivos adicional Para una edicin .................................................. 151
Copiar contenido de un archivo en otro ................................................................. 152
Insercin de un archivo completo en Otra ............................................................. 153
Salvando Nuestro Trabajo .......................................................................................... 154
Resumiendo ................................................................................................................ 155
Lectura adicional ......................................................................................................... 155

13 - Personalizacin de El Smbolo. ......................................................... 156


Anatoma de un Smbolo ............................................................................................ 156
Tratando algunos diseos alternativos Prompt .......................................................... 158
Aadiendo color .......................................................................................................... 159
Confusin Terminal ........................................................................................... 160
Mover el cursor ........................................................................................................... 162
Ahorro El Prompt......................................................................................................... 163
Resumiendo ................................................................................................................ 164
v

Lectura adicional

164

Parte 3 - Tareas comunes y herramientas Esenciales .............. 165


14 - Gestin de paquetes. .......................................................................... 166
Packaging Systems..................................................................................................... 166
Cmo funciona un sistema de paquetes .................................................................... 167
Package Files ........................................................................................................ 167
Repositorios ........................................................................................................... 167
Dependencias ........................................................................................................ 168
Herramientas del paquete de alta y de baja intensidad ........................................ 168
Tareas de administracin de paquete comn ............................................................ 169
Encontrar un paquete en un repositorio ................................................................ 169
Instalacin de un paquete de un repositorio ......................................................... 169
Instalacin de un paquete de un paquete de archivos .......................................... 170
Eliminacin de un paquete .................................................................................... 170
Actualizacin de paquetes desde un repositorio ................................................... 171
Actualizacin de un paquete desde un archivo de paquete.................................. 171
Listado de paquetes instalados ............................................................................. 172
La determinacin de si un paquete est instalado ................................................ 172
Viendo Info Acerca de un paquete instalado ......................................................... 173
Encontrar a qu paquete instal un archivo .......................................................... 173
Resumiendo ................................................................................................................ 173
El mito de instalacin del software de Linux ..................................................... 174
Lectura adicional ......................................................................................................... 175

15 - Soporte de almacenamiento. .............................................................. 176


Montaje y desmontaje de dispositivos de almacenamiento ....................................... 176
Visualizacin de una lista de sistemas de archivos montados ............................. 178
Por qu es importante la Desmontando ......................................................... 181
Determinacin de nombres de dispositivos ........................................................... 182
Creacin de Nuevos Sistemas de archivos ................................................................ 185
Particiones Manipular con fdisk ............................................................................. 185
La creacin de un nuevo sistema de archivos Con mkfs ...................................... 188
Prueba y reparacin de sistemas de archivos............................................................ 189
Lo que el fsck? .................................................................................................. 189
Formatear disquetes ................................................................................................... 189
Mover los datos directamente a / desde dispositivos ................................................. 190
Creacin de CD-ROM Imgenes ................................................................................ 191
Creacin de una imagen de copia de un CD-ROM ............................................... 191
Creacin de una imagen de una coleccin de archivos ........................................ 191
Un Programa por cualquier otro nombre .......................................................... 192
Escribir CD-ROM Imgenes ....................................................................................... 192
Montaje de una imagen ISO directamente ............................................................ 192
Tapas de CD-ROM Un Re-grabable ..................................................................... 193
Escribiendo Una Imagen ....................................................................................... 193
Resumiendo ................................................................................................................ 193
Lectura adicional ......................................................................................................... 193
Crdito extra ................................................................................................................ 193
vi

16 - Redes. .................................................................................................... 195


El examen y el seguimiento de una Red .................................................................... 196
de ping ................................................................................................................... 196
traceroute ............................................................................................................... 197
netstat .................................................................................................................... 198
Transporte de archivos en una red ............................................................................. 199
ftp ........................................................................................................................... 199
Iftp - A Better ftp ..................................................................................................... 202
wget ........................................................................................................................ 202
Comunicacin segura con hosts remotos................................................................... 202
ssh .......................................................................................................................... 203
Con SSH Tunneling .......................................................................................... 206
SCP y SFTP ........................................................................................................... 207
Un cliente SSH para Windows? ........................................................................ 208
Resumiendo ................................................................................................................ 208
Lectura adicional ......................................................................................................... 208

17 - Bsqueda de archivos......................................................................... 209


Locate - Buscar archivos La Manera Ms Fcil ......................................................... 209
De Dnde Viene La Base de Datos localizar viene? ..................................... 211
Find - Buscar archivos The Hard Way ........................................................................ 211
Pruebas .................................................................................................................. 212
Operadores ............................................................................................................ 214
Acciones predefinidas ............................................................................................ 217
Acciones definidas por el usuario .......................................................................... 219
Mejora de la Eficiencia ........................................................................................... 220
xargs ...................................................................................................................... 220
Lidiando con divertidos nombres de archivo .................................................... 221
Un retorno a la Zona de juegos ............................................................................. 221
Opciones ................................................................................................................ 224
Resumiendo ................................................................................................................ 225
Lectura adicional ......................................................................................................... 225

18 - Archivado y copia de seguridad. ....................................................... 226


Compresin de Archivos ............................................................................................. 226
gzip ......................................................................................................................... 227
bzip2 ....................................................................................................................... 229
No sea la compresin Compulsivo ................................................................... 230
Almacenamiento de archivos ...................................................................................... 230
alquitrn ................................................................................................................. 230
cremallera .............................................................................................................. 236
Sincronizacin de archivos y directorios..................................................................... 238
Usando rsync travs de una red ............................................................................ 240
Resumiendo ................................................................................................................ 241
Lectura adicional ......................................................................................................... 241

19 - Expresiones regulares. ....................................................................... 243


Qu son las expresiones regulares? ...................................................................243
grep ............................................................................................................................. 243
vii
Metacaracteres y literales ........................................................................................... 245

El Cualquier carcter................................................................................................... 246


Anclas......................................................................................................................... 247
Un Crucigrama Helper ...................................................................................... 247
Expresiones soporte y Clases de personajes ............................................................ 248
Negacin ................................................................................................................ 248
Rangos de carcter tradicional .............................................................................. 249
Clases de caracteres POSIX ................................................................................. 250
Volviendo a la tradicional Colacin Orden ........................................................ 253
POSIX bsico vs. Expresiones regulares extendidas ................................................ 254
POSIX ............................................................................................................... 254
Alternancia ................................................................................................................. 255
Cuantificadores ........................................................................................................... 256
? - Un ajuste de cero elemento o Una Hora .......................................................... 256
* - Un ajuste de cero Elemento o ms veces......................................................... 257
+ - Un elemento de ajuste de una o ms veces .................................................... 258
{} - Partido Un elemento Un nmero especfico de veces ..................................... 258
Poner expresiones regulares para trabajar ................................................................ 259
La validacin de una lista de telfonos con grep ................................................... 259
Encontrar nombres de archivo Feo con Buscar .................................................... 260
La bsqueda de archivos con ubicar ..................................................................... 261
Bsqueda de texto con menos y vim ..................................................................... 261
Resumiendo ................................................................................................................ 263
Lectura adicional ......................................................................................................... 263

20 - Procesamiento de Texto. .................................................................... 264


Aplicaciones De Texto ................................................................................................ 264
Documentos ........................................................................................................... 265
Pginas Web .......................................................................................................... 265
Correo electrnico .................................................................................................. 265
Salida de impresora ............................................................................................... 265
Programa de Cdigo Fuente .................................................................................. 265
Revisando algunos viejos amigos .............................................................................. 265
gato......................................................................................................................... 266
MS-DOS Vs. Texto Unix Texto ......................................................................... 267
clase ....................................................................................................................... 267
Uniq ........................................................................................................................ 275
Cortar y rebanar .......................................................................................................... 276
cortada.................................................................................................................... 276
Ampliacin Tabs................................................................................................ 279
pasta ....................................................................................................................... 280
unirse ...................................................................................................................... 281
La comparacin de texto ............................................................................................. 283
comm ...................................................................................................................... 284
diff ........................................................................................................................... 284
parche..................................................................................................................... 287
Edicin On The Fly...................................................................................................... 288
tr.............................................................................................................................. 288
ROT13: El Anillo Decodificador No-Tan-Secreto ............................................. 290
sed .......................................................................................................................... 290
vin
Personas que les gustased

tambin

te

guste

299
aspell ...................................................................................................................... 299
Resumiendo ................................................................................................................ 303
Lectura adicional ......................................................................................................... 303
Crdito extra ................................................................................................................ 304

21 - Formato de salida. ................................................................................305


Herramientas de formato simple ................................................................................. 305
nl - Lneas Nmero ................................................................................................. 305
doblar - Envuelva cada lnea a una longitud especificada .................................... 309
fmt - Un formateador de texto sencillo ................................................................... 309
PR - formato de texto para impresin .................................................................... 313
printf - Formato Y Imprimir datos ........................................................................... 314
Documento Sistemas de formato ................................................................................ 317
Groff........................................................................................................................ 318
Resumiendo ................................................................................................................ 324
Lectura adicional ......................................................................................................... 324

22 - Impresin. .............................................................................................. 326


Una breve historia de la imprenta ............................................................................... 326
Impresin En El Dim Tiempos................................................................................ 326
Impresoras basada en caracteres ......................................................................... 327
Impresoras grficas ................................................................................................ 328
Impresin con Linux .................................................................................................... 329
Preparacin de los ficheros para la impresin ............................................................ 329
PR - Convertir archivos de texto para impresin ................................................... 329
El envo de un trabajo de impresin en una impresora .............................................. 331
IPR - Imprimir archivos (Berkeley Estilo) ............................................................... 331
Ip - Imprimir archivos (System V Estilo) ................................................................. 332
Otra opcin: a2ps ................................................................................................... 333
Seguimiento y control de los trabajos de impresin ................................................... 336
lpstat - pantalla de estado del sistema de impresin ............................................. 336
lpq - Pantalla de estado de la cola de la impresora ............................................... 337
lprm / cancelar - Cancelar trabajos de impresin .................................................. 338
Resumiendo ................................................................................................................ 338
Lectura adicional ......................................................................................................... 338

23 - Programas de Compilacin. ............................................................... 340


Qu est recopilando? .............................................................................................. 340
Se compilan todos los programas?........................................................................ 341
Compilar un programa en C ........................................................................................ 342
Obtencin de El Cdigo Fuente ............................................................................. 342
Examinar el rbol de fuentes ................................................................................. 344
La construccin de El Programa ............................................................................ 346
Instalacin del programa ........................................................................................ 350
Resumiendo ................................................................................................................ 350
Lectura adicional ......................................................................................................... 350

Parte 4 - Escribiendo Shell Scripts .............................................353


ix

24 - Escribir su primer script. .................................................................... 354

Qu son los scripts del Shell? .................................................................................. 354


Cmo escribir un Shell Script...................................................................................... 354
Formato de archivo de secuencias de comandos ...................................................... 355
Permisos de ejecutables ............................................................................................. 356
Ubicacin del archivo de secuencias de comandos ................................................... 356
Buenas ubicaciones para Scripts .......................................................................... 358
Ms trucos de formato ................................................................................................ 358
Nombres opcin larga ............................................................................................ 358
Sangra Y de continuacin de lnea ....................................................................... 358
Configuracin de vim para la escritura de guiones .......................................... 359
Resumiendo ................................................................................................................ 360
Lectura adicional ......................................................................................................... 360

25 - Creacin de un proyecto..................................................................... 361


Primera Etapa: Documento Mnimo ............................................................................ 361
Segunda Etapa: Aadir un poco de datos .................................................................. 363
Variables y constantes ................................................................................................ 364
Asignacin de valores a las variables y constantes .............................................. 367
Aqu Documentos........................................................................................................ 368
Resumiendo ................................................................................................................ 371
Lectura adicional ......................................................................................................... 371

26 - Diseo Top-Down................................................................................. 372


Funciones de Shell...................................................................................................... 373
Variables Locales ........................................................................................................ 376
Mantenga Scripts Ejecucin ....................................................................................... 377
Funciones Shell en su .bashrc Archivo............................................................. 380
Resumiendo ................................................................................................................ 380
Lectura adicional ......................................................................................................... 380

27 - Control de flujo: Bifurcaciones Con ................................................. si.


381
si .................................................................................................................................. 381
Estado de salida .......................................................................................................... 382
prueba ......................................................................................................................... 384
Expresiones de archivos ........................................................................................ 384
Expresiones de Cuerda ......................................................................................... 387
Expresiones enteros .............................................................................................. 388
Una ms moderna versin de prueba ........................................................................ 389
(()) - Diseado para los nmeros enteros ................................................................... 391
Combinando las expresiones...................................................................................... 392
Portabilidad es el duende de las mentes pequeas......................................... 394
Los operadores de control: Otra forma de Rama ....................................................... 394
Resumiendo ................................................................................................................ 395
Lectura adicional ......................................................................................................... 396

28 - Lectura de entrada del teclado........................................................... 397


leer - leer valores de la entrada estndar ................................................................... 398
Opciones ................................................................................................................ 400
x
IFS.......................................................................................................................... 402
Usted no puede leer Pipe ................................................................................. 404

Entrada de Validacin ................................................................................................. 404


Mens .......................................................................................................................... 406
Resumiendo ................................................................................................................ 407
Crdito extra .......................................................................................................... 407
Lectura adicional ......................................................................................................... 408

29 - Control de flujo: Looping Con tiempo / hasta...................................409


Looping ........................................................................................................................ 409
mientras ................................................................................................................. 409
Salir de un bucle ......................................................................................................... 412
hasta ...................................................................................................................... 413
Archivos de la lectura con Loops ................................................................................ 414
Resumiendo ................................................................................................................ 415
Lectura adicional ......................................................................................................... 415

30 - Solucin de problemas. .......................................................................416


Los errores sintcticos ................................................................................................ 416
Falta Cotizaciones ................................................................................................. 417
Fichas faltan o inesperados ................................................................................... 417
Expansiones imprevistos ....................................................................................... 418
Errores lgicos ............................................................................................................ 420
Programacin Defensivo ....................................................................................... 420
Entrada de Verificacin.......................................................................................... 422
El diseo es una funcin del tiempo ................................................................. 422
Pruebas ....................................................................................................................... 422
Casos de prueba.................................................................................................... 423
Depuracin .................................................................................................................. 424
Encontrar el rea del problema ............................................................................. 424
Rastreo................................................................................................................... 424
El examen de Valores durante la ejecucin .......................................................... 427
Resumiendo ................................................................................................................ 427
Lectura adicional ......................................................................................................... 428

31 - Control de flujo: Bifurcaciones Con el caso. ....................................429


caso ............................................................................................................................. 429
Patrones ................................................................................................................. 431
Realizacin de mltiples acciones......................................................................... 433
Resumiendo ................................................................................................................ 434
Lectura adicional ......................................................................................................... 434

32 - Parmetros posicionales. ....................................................................436


Cmo acceder a la lnea de comandos ...................................................................... 436
Determinar el nmero de argumentos ................................................................... 437
cambiar - Conseguir acceso a muchos argumentos ............................................. 438
Aplicaciones sencillas ............................................................................................ 439
Uso de parmetros posicionales Con Funciones Shell......................................... 440
Manipulacin de Parmetros posicionales En Masse ................................................ 441
xi
Una aplicacin ms completa ..................................................................................... 443
Resumiendo ................................................................................................................ 446
Lectura adicional ......................................................................................................... 449

33 - Control de flujo: Con Looping para. .................................................. 450


por: Tradicional Forma Shell ....................................................................................... 450
Por qu yo? ..................................................................................................... 452
por: Formulario C Idioma ............................................................................................ 453
Resumiendo ................................................................................................................ 454
Lectura adicional ......................................................................................................... 455

34 - Cadenas y nmeros. ............................................................................ 456


Expansin Parmetro.................................................................................................. 456
Parmetros bsicos ............................................................................................... 456
Expansiones para gestionar variables vacas ....................................................... 457
Las expansiones que devuelven nombres de variable ......................................... 459
Operaciones de Cuerda ......................................................................................... 459
Caso Conversin ................................................................................................... 462
Evaluacin aritmtica y la expansin .......................................................................... 464
Bases Nmero ....................................................................................................... 465
Operadores unarios ............................................................................................... 465
Aritmtica simple.................................................................................................... 465
Asignacin.............................................................................................................. 467
Operaciones de bits ............................................................................................... 469
Lgica..................................................................................................................... 470
bc - Una precisin arbitraria Calculadora Idioma ....................................................... 473
Usando bc .............................................................................................................. 474
Un script de ejemplo .............................................................................................. 475
Resumiendo ................................................................................................................ 476
Crdito extra ................................................................................................................ 476
Lectura adicional ......................................................................................................... 476

35 - Matrices. ................................................................................................ 478


Qu son las matrices? .............................................................................................. 478
Creacin de un array................................................................................................... 478
Asignacin de valores a una matriz ............................................................................ 479
Acceso a los elementos de matriz .............................................................................. 480
Operaciones de matriz ................................................................................................ 482
Salida de todo el contenido del de una matriz ...................................................... 482
Determinar el nmero de elementos de matriz ..................................................... 482
Encontrar los subndices utilizados por una matriz ............................................... 483
Adicin de elementos al final de una matriz .......................................................... 483
Ordenacin de un conjunto.................................................................................... 484
Eliminacin de una matriz...................................................................................... 484
Las matrices asociativas ............................................................................................. 485
Resumiendo ................................................................................................................ 486
Lectura adicional ......................................................................................................... 486

36 - Exotica. .................................................................................................. 487

xn
Comandos Grupo Y subniveles .................................................................................. 487
Proceso de Sustitucin .......................................................................................... 491
Trampas....................................................................................................................... 493
Archivos temporales .......................................................................................... 495

Ejecucin asncrona.................................................................................................... 496


esperar ................................................................................................................... 496
Canalizaciones con nombre ....................................................................................... 498
Configuracin de una canalizacin con nombre.................................................... 498
El uso de canalizaciones con nombre ................................................................... 499
Resumiendo ................................................................................................................ 499
Lectura adicional ......................................................................................................... 499

ndice. .............................................................................................................. 501

xiii

xiv

Para
Karen

xv

Introduccin
I quiero contarles una historia.
No, no es la historia de cmo, en 1991, Linus Torvalds escribi la primera versin del kernel de
Linux. Usted puede leer esa historia en un montn de libros de Linux. Tampoco voy a contar
la historia de cmo, unos aos antes, Richard Stallman comenz el Proyecto GNU para crear
un Unix libre como sistema operativo. Eso es una historia importante tambin, pero la
mayora de los otros libros de Linux tienen que uno, tambin.
No, yo quiero contar la historia de cmo se puede recuperar el control de su ordenador.
Cuando empec a trabajar con los ordenadores como un estudiante de la universidad a finales
de 1970, hubo una revolucin en marcha. La invencin del microprocesador haba hecho
posible que la gente comn como usted y yo a poseer en realidad un ordenador. Es difcil para
muchas personas hoy en da imaginar lo que era el mundo cuando slo las grandes empresas
y el gran gobierno corran todos los ordenadores. Digamos, no se poda conseguir mucho por
hacer.
Hoy en da, el mundo es muy diferente. Las computadoras estn por todas partes, desde
diminutos relojes de pulsera a los centros de datos gigantes a todo lo dems. Adems de las
computadoras en todas partes, tambin tenemos una red ubicua conectndolos entre s. Esto
ha creado una nueva era maravillosa de empoderamiento personal y la libertad creativa, pero
en el ltimo par de dcadas, otra cosa que ha estado sucediendo. A pocas corporaciones
gigantes han estado imponiendo su control sobre la mayor parte de las computadoras del
mundo y decidir lo que puede y no puede hacer con ellos. Afortunadamente, la gente de todo
el mundo estn haciendo algo al respecto. Ellos estn luchando para mantener el control de
sus computadoras, escribiendo su propio software. Estn construyendo Linux.
Muchas personas hablan de "libertad" con respecto a Linux, pero no creo que la mayora de la
gente sabe lo que esto realmente significa la libertad. La libertad es el poder de decidir lo que
hace el equipo, y la nica manera de tener esta libertad es saber lo que el equipo est haciendo.
La libertad es un equipo que es sin secretos, uno en el que todo puede ser conocido si te
importa lo suficiente para averiguarlo.

Por qu utilizar la lnea de comandos?


Alguna vez has notado en las pelculas, cuando el "super hacker," - ya sabes, el tipo que
puede entrar en el equipo militar ultra-segura en menos de treinta segundos, se sienta frente a
la computadora, que nunca toca un ratn? Es porque los productores de pelculas se dan
cuenta de que nosotros, como seres humanos, instintivamente sabemos que la nica manera
de realmente hacer nada en un equipo

xvi

es escribiendo en un teclado!

La mayora de los usuarios de computadoras de hoy son slo familiarizado con la interfaz
grfica de usuario (GUI) y se les ha enseado por los vendedores y los expertos que la interfaz
de lnea de comandos (CLI) es una cosa aterradora del pasado. Esto es lamentable, porque una
buena interfaz de lnea de comandos es una manera maravillosamente expresiva de la
comunicacin con un ordenador de la misma forma en que la palabra escrita es para los seres
humanos. Se ha dicho que "las interfaces grficas de usuario hacen tareas fciles fcil, mientras
que las interfaces de lnea de comandos hacen tareas difciles posible", y esto es todava muy
cierto hoy en da.
Desde Linux sigue el modelo de la familia Unix de sistemas operativos, que comparte la
misma herencia rica de herramientas de lnea de comandos como Unix. Unix entr en la
prominencia durante la dcada de 1980 (aunque fue desarrollado por primera vez en la
dcada anterior), antes de la adopcin generalizada de la interfaz grfica de usuario y, como
resultado, desarroll una extensa interfaz de lnea de comandos en lugar. De hecho, una de las
razones ms fuertes los primeros usuarios de Linux lo eligieron sobre, por ejemplo, Windows
NT fue el potente interfaz de lnea de comandos que hizo las "tareas difciles posibles."

Lo que trata este libro


Este libro es una visin general de la "vida" en la lnea de comandos de Linux. A diferencia de
algunos libros que se concentran en un solo programa, como el programa de shell, bash, este
libro va a tratar de transmitir cmo llevarse bien con la interfaz de lnea de comandos en un
sentido ms amplio. Cmo lo hace todo el trabajo? Qu puede hacer? Cul es la mejor
manera de usarlo?
Este no es un libro sobre administracin de sistemas Linux. Mientras que cualquier
discusin seria de la lnea de comandos conducir invariablemente a temas de administracin
del sistema, este libro slo se toca en algunos temas de administracin. Ser, sin embargo,
preparar al lector para el estudio adicional, proporcionando una base slida en el uso de la
lnea de comandos, una herramienta esencial para cualquier tarea de administracin del
sistema serio.
Este libro es muy Linux-cntrica. Muchos otros libros tratan de ampliar su atractivo mediante
la inclusin de otras plataformas como Unix genrico y OS X. Al hacerlo, ellos "agua abajo" su
contenido a slo cuentan con temas generales. Este libro, por otro lado, slo cubre las
distribuciones de Linux contemporneos. El noventa y cinco por ciento del contenido es til
para los usuarios de otros sistemas tipo Unix, pero este libro est muy dirigido a los usuarios
de lnea de comandos de Linux moderna.

Quin debe leer este libro


Este libro es para los nuevos usuarios de Linux que han emigrado de otras plataformas. Lo
ms probable es que usted es un "usuario avanzado" de alguna versin de Microsoft
Windows. Tal vez su jefe le ha dicho que administrar un servidor Linux, o tal vez slo eres un
usuario de escritorio que est cansado de todos los problemas de seguridad y quieren dar una
oportunidad Linux. Eso est bien. Todos son bienvenidos aqu.
Dicho esto, no hay acceso directo a Linux iluminacin. El aprendizaje de la lnea de comandos
es difcil y requiere un esfuerzo real. No es que es tan difcil, sino que es tan vasto. El AV-

xvii
tura sistema Linux tiene literalmente miles de programas que usted puede emplear en la lnea
de comandos. Considrese advertido; el aprendizaje de la lnea de comandos no es un
esfuerzo ocasional.
Por otra parte, el aprendizaje de la lnea de comandos de Linux es muy gratificante. Si usted
piensa que usted es un "usuario avanzado" Ahora, slo tiene que esperar. Usted no sabe lo que
el poder real es-todava. Y, a diferencia de muchos otros conocimientos de informtica, el
conocimiento de la lnea de comandos es de larga duracin. Las habilidades aprendidas hoy
todava sern tiles dentro de diez aos. La lnea de comandos ha sobrevivido la prueba del
tiempo.
Tambin se asume que usted no tiene ninguna experiencia en programacin, pero que no se
preocupe, nosotros le empezamos por ese camino tambin.

Qu hay en este libro


Este material se presenta en una secuencia cuidadosamente elegido, al igual que un profesor
que se sienta a tu lado guiando a lo largo. Muchos autores tratan este material de manera
"sistemtica", lo cual tiene sentido desde la perspectiva de un escritor, pero puede ser muy
confuso para los nuevos usuarios.
Otro de los objetivos es que se familiarice con la forma de pensar de Unix, que es diferente de
la forma en que Windows de pensar. En el camino, vamos a ir en un par de viajes de lado para
ayudarle a entender por qu ciertas cosas funcionan de la manera que lo hacen y cmo
consiguieron esa manera. Linux no es slo una pieza de software, es tambin una pequea
parte de la cultura Unix ms grande, que tiene su propio lenguaje y la historia. Yo podra
lanzar en una diatriba o dos, tambin.
Este libro est dividido en cuatro partes, cada una cubriendo algn aspecto de la experiencia
de la lnea de comandos:

Parte 1 - Aprender La Shell comienza nuestra exploracin del lenguaje bsico de la


lnea de comandos que incluye cosas tales como la estructura de los comandos, la
navegacin del sistema de archivos, edicin de lnea de comandos, y la bsqueda de
ayuda y documentacin para los comandos.
Parte 2 - Configuracin y el medio ambiente cubre la edicin de archivos de
configuracin que controlan el funcionamiento de la computadora desde la lnea de
comandos.
Parte 3 - Tareas comunes y herramientas Esenciales explora muchas de las tareas
comunes que se realizan habitualmente desde la lnea de comandos. Sistemas
operativos tipo Unix, como Linux, contienen muchos programas "clsicos" de la lnea
de comandos que se utilizan para llevar a cabo operaciones de gran alcance en los
datos.
Parte 4 - Escribiendo Shell Scripts presenta la programacin de shell, una tcnica
ciertamente rudimentario, pero fcil de aprender, para la automatizacin de muchas
tareas informticas comunes. Al aprender la programacin de shell, usted se
familiarizar con los conceptos que se pueden aplicar a muchos otros lenguajes de
programacin.

Cmo leer este libro


Comience desde el principio del libro y seguirlo hasta el final. No est escrito como una obra
de referencia, que es realmente ms como una historia con un principio, un medio y un fin.
xviii

Requisitos previos
Para utilizar este libro, todo lo que necesita es una instalacin de Linux trabajando. Usted
puede conseguir esto en una de dos maneras:
1. Instalar Linux en una (no tan nuevo) equipo. No importa que la distribucin que
usted elija, aunque la mayora de la gente hoy en da comienzan con cualquiera de
Ubuntu, Fedora, OpenSUSE o. En caso de duda, probar Ubuntu por primera vez. La
instalacin de una moderna distribucin de Linux puede ser ridculamente fcil o
ridculamente difcil dependiendo de su hardware. Sugiero una computadora de
escritorio que es un par de aos de edad y tiene por lo menos 256 megabytes de RAM
y 6 GB de espacio libre en el disco duro. Evite los ordenadores porttiles y redes
inalmbricas, si es posible, ya que estas son a menudo ms difcil conseguir trabajo.
2. Use un "Live CD". Una de las cosas interesantes que puedes hacer con ellos muchas
distribuciones de Linux se ejecuta directamente desde un CD-ROM (o unidad flash
USB) sin instalarlos en absoluto. Slo tienes que ir a la configuracin del BIOS y
configurar su computadora para "Arrancar desde CD-ROM", inserte el CD en vivo, y
reiniciar el sistema. El uso de un CD en vivo es una gran manera de probar un
ordenador para la compatibilidad de Linux antes de la instalacin. La desventaja de
usar un CD en vivo es que puede ser muy lenta en comparacin con tener Linux
instalado en su disco duro. Tanto Ubuntu y Fedora (entre otros) tienen versiones en
CD en vivo.
Independientemente de cmo instalar Linux, usted tendr que tener superusuario ocasional
(es decir, los privilegios administrativos) para llevar a cabo las lecciones de este libro.
Despus de tener una instalacin de trabajo, comenzar a leer y seguir con su propio
ordenador. La mayor parte del material de este libro es "manos en", por lo sentarse y llegar a
escribir!

Por qu no lo llaman "GNU / Linux"


En algunos sectores, es polticamente correcto llamar el sistema operativo Linux el
"sistema operativo GNU / Linux." El problema con "Linux" es que no hay manera
completamente correcta de nombrarlo porque fue escrita por muchas personas
diferentes en un vasto , esfuerzo de desarrollo distribuido. Tcnicamente hablando,
Linux es el nombre del ncleo del sistema operativo, nada ms. El ncleo es muy
importante, por supuesto, ya que hace que el sistema operativo de ir, pero no es
suficiente para formar un sistema operativo completo.
Introduzca Richard Stallman, el genio-filsofo que fund el movimiento del Software
Libre, comenz la Fundacin para el Software Libre, formado el Proyecto GNU,
escribi la primera versin de la GNU C Compiler (GCC), creado la Licencia Pblica
General de GNU (GPL), etc., etc., etc. l insiste en que usted lo llama "GNU / Linux"
para reflejar adecuadamente las contribuciones del proyecto GNU. Mientras que el
Proyecto GNU es anterior a la del ncleo de Linux, y las contribuciones del proyecto
son muy merecedores de reconocimiento, de colocarlos en el nombre es injusto para
todos los dems que hizo significativa
xix

contribuciones. Adems, creo que "Linux / GNU" sera tcnicamente ms preciso, ya


que el ncleo arranca primero y todo lo dems corre encima de l.
En el uso popular, "Linux" se refiere al ncleo y todo el resto del software libre y de
cdigo abierto que se encuentra en la tpica distribucin de Linux; es decir, todo el
ecosistema Linux, no slo los componentes de GNU. El mercado de sistema operativo
parece preferir nombres de una sola palabra, como DOS, Windows, Solaris, Irix, AIX.
He optado por utilizar el popular formato. Sin embargo, si usted prefiere usar "GNU /
Linux" en lugar, realice una bsqueda mentales-y-reemplazar al leer este libro. No me
importa.

Agradecimientos
I quiere agradecer a las siguientes personas, que ayudaron a hacer posible este libro:
Jenny Watson, Adquisiciones Editor en Wiley Publishing que originalmente me sugiri que
escribiera un libro de secuencias de comandos de shell.
John C. Dvorak, seal el columnista y comentarista. En un episodio de su podcast de vdeo,
"Cranky Geeks," Sr. Dvorak describe el proceso de la escritura: "El infierno. Escribir 200
palabras al da y en un ao, usted tiene una novela. "Este consejo me llev a escribir una
pgina al da hasta que tuve un libro.
Dmitri Popov, escribi un artculo en la Revista de Software Libre titulado "Creacin de una
plantilla de libro con Writer", que me inspir a utilizar OpenOffice.org Writer para componer
el texto. Al final result que, funcion maravillosamente.
Marcos Polesky realiza una revisin extraordinaria y prueba del texto.
Jesse Becker, Tomasz Chrzczonowicz, Michael Levin, Spence Minero tambin probaron y
revisaron partes del texto.
Karen M. Shotts aport una gran cantidad de horas, puliendo mi llamado Ingls editando el
texto.
Y por ltimo, los lectores de LinuxCommand.org, Que me han enviado tantos correos
electrnicos amables. Su aliento me dio la idea de que yo estaba realmente en lo cierto!

Su regeneracin es necesaria!
Este libro es un proyecto en curso, al igual que muchos proyectos de software de cdigo
abierto. Si usted encuentra un error tcnico, mndenme una lnea en:
bshotts@users.sourceforge.net
Sus cambios y sugerencias pueden entrar en futuras versiones.

xx

Qu hay de nuevo en la segunda edicin del Internet


Esta versin de la lnea de comandos de Linux ha experimentado un cierto pulimento y
modernizacin adicional. En particular, la versin 4.x de bash se supone que es la versin
estndar y el texto se ha actualizado para reflejar esto. Los nmeros de captulo en la segunda
edicin del Internet ahora se alinean con los de la edicin Sin Almidn de prensa. Tambin me
fij algunos errores;-).
Un agradecimiento especial a las siguientes personas que proporcionaron informacin valiosa
sobre la primera edicin: Adrian Arpidez, Hu Bo, Heriberto Cant, Josu Escamilla, Bruce
Fowler, Ma Jun, Seth King, Mike O'Donnell, Parviz Rasoulipour, Gabriel Stutzman, y
Cristiano Wuethrich.

Lectura adicional
stos son algunos de los artculos de Wikipedia sobre los personajes famosos
mencionados en este captulo: http://en.wikipedia.org/wiki/Linus Torvalds
http://en.wikipedia.org/wiki/Richard Stallman
La Free Software Foundation y el Proyecto GNU:
http://en.wikipedia.org/wiki/Free Software Foundation
http://www.fsf.org
http://www.gnu.org
Richard Stallman ha escrito mucho sobre la "GNU / Linux" cuestin de nomenclatura:
http://www.gnu.org/gnu/why-gnu-linux.html
http://www.gnu.org/gnu/ gnu-linux-faq.html # herramientas

Colofn
Este libro fue escrito originalmente usando OpenOffice.org Writer en fuentes de Liberacin
serif y sans en un Dell Inspiron 530N, fbrica configurados con Ubuntu 8.04. La versin PDF
del texto se genera directamente por OpenOffice.org Writer. La Segunda Edicin de Internet
se produjo en el mismo ordenador usando LibreOffice escritor en Ubuntu 12.04.

xxi

xxii

Parte 1 - Aprender La Shell

1 - Cul es la cscara?

1 - Cul es la cscara?
Cuando hablamos de la lnea de comandos, en realidad estamos hablando de la cscara. El
shell es un programa que toma los comandos del teclado y los pasa al sistema operativo para
llevar a cabo. Casi todas las distribuciones de Linux proporcionan un programa de shell de la
llamada fiesta de Proyecto GNU. El nombre de "fiesta" es un acrnimo de "Bourne Again
Shell", una referencia al hecho de bash es un sustituto mejorado para sh, el programa original
shell de Unix escrito por Steve Bourne.

Los emuladores de terminal


Cuando se utiliza una interfaz grfica de usuario, necesitamos otro programa que se llama un
emulador de terminal para interactuar con el shell. Si miramos a travs de nuestros mens de
escritorio, probablemente encontrar uno. KDE utiliza Konsole y GNOME usa
gnome-terminal, aunque lo ms probable es llamado simplemente "terminal" en nuestro
men. Hay una serie de otros emuladores de terminal disponibles para Linux, pero todos ellos
bsicamente hacen lo mismo; nos dar acceso a la cubierta. Es probable que el desarrollo de
una preferencia por uno u otro en funcin del nmero de campanas y silbatos que tiene.

Sus primeras pulsaciones de teclas


[Me @ linuxbox ~] $
As que vamos a empezar. Inicie el emulador de terminal! Una vez que aparece, deberamos
ver algo como esto:
Esto se conoce como el intrprete de comandos y aparecer cada vez que la cscara est listo
para aceptar la entrada. Si bien puede variar en apariencia un poco dependiendo de la
distribucin, por lo general, incluya su nombre de usuario @ machinename, seguido por el
directorio de trabajo actual (ms sobre esto en un poco) y un signo de dlar.
Si el ltimo carcter de la peticin de orden es un signo de almohadilla ("#") en lugar de un
signo de dlar, la sesin de terminal con privilegios de superusuario. Esto significa que
cualquiera de los dos nos iniciamos una sesin como usuario root o seleccionamos un
emulador de terminal que ofrece superusuario (administrativa) privi2

Sus primeras
pulsaciones de teclas
leges.
Suponiendo que las cosas son buenas hasta ahora, vamos a tratar algunos de mecanografa.
Ingrese algn galimatas en el smbolo de este modo:

[Me @ linuxbox ~] $ kaekfjaeifj


Desde este comando no tiene sentido, el shell nos dir esto y darnos otra oportunidad:

bash: kaekfjaeifj: comando no encontrado [me


@ linuxbox ~] $

Histrico de comandos
Si pulsamos la tecla de flecha hacia arriba, veremos que el comando anterior "kaekfjaeifj"
vuelve a aparecer despus de la solicitud. Esto se llama la historia de comandos. La mayora
de las distribuciones de Linux recuerdan los ltimos 500 comandos por defecto. Pulse la tecla
de flecha hacia abajo y el comando anterior desaparece.

Movimiento del cursor


Recordemos el comando anterior con la tecla de flecha hacia arriba de nuevo. Ahora trata de
las teclas de izquierda y derecha de flecha. Vea cmo podemos posicionar el cursor en
cualquier lugar de la lnea de comandos? Esto hace que los comandos de edicin fcil.

Algunas palabras sobre ratones y enfoque


Mientras que la cscara es todo sobre el teclado, tambin puede utilizar un ratn con
su emulador de terminal. Existe un mecanismo integrado en el Sistema de Ventanas X
(el motor subyacente que hace que la marcha GUI) que soporta una tcnica copiar y
pegar rpido. Si resalta un texto manteniendo pulsado el botn izquierdo del ratn y
arrastrando el ratn sobre ella (o doble clic sobre una palabra), se copia en un bfer
mantenido por X. Al pulsar el botn central del ratn har que el texto que se pega en
la posicin del cursor. Prubalo.
Nota: No tener la tentacin de utilizar las teclas Ctrl-C y Ctrl-V para realizar la
copia y pegar dentro de una ventana de terminal. Ellos no trabajan. Estos
cdigos de control tienen diferentes significados para la cscara y se asignaron
muchos aos antes de que Microsoft Windows.

1 - Cul es la cscara?

Su entorno grfico de escritorio (KDE o GNOME lo ms probable), en un esfuerzo por


comportarse como Windows, probablemente tiene su poltica de enfoque ajustado en
"haga clic para enfocar." Esto significa, por una ventana para conseguir el enfoque (se
activa) es necesario hacer clic en ella. Esto es contrario a la conducta X tradicional de
"foco sigue al ratn", que significa que una ventana se centran simplemente pasando
el ratn sobre l. La ventana no vienen a primer plano hasta que haga clic en l, sino
que ser capaz de recibir la entrada. Establecimiento de la poltica de enfoque a "foco
sigue al ratn" har que la tcnica de copiar y pegar an ms til. Darle una
oportunidad si se puede (algunos entornos de escritorio, tales como la Unidad de
Ubuntu ya no apoyarla). Creo que si le das una oportunidad usted preferira. Va a
encontrar este ajuste en el programa de configuracin para el gestor de ventanas.

Pruebe algunos comandos simples


Ahora que hemos aprendido a escribir, vamos a tratar algunos comandos simples. La primera
de ellas es la fecha. Este comando muestra la hora y fecha actual.

[Me @ linuxbox ~] $ fecha


Jue 25 de octubre 2007 13:51:54
EDT
Un comando relacionado es cal que, por defecto, muestra un calendario del mes en curso.
[Me @
] Cal $
linuxbox
Octubre 2007
Su Mo Tu Nos Th P. Sa
3 4 5 6
1 2 otro
7 8 9s
10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Para ver la cantidad actual de espacio libre en sus unidades de disco, escriba df:

[Me @ linuxbox ~] $ df
Filesystem
/ Dev / sda2
/ Dev / sda5
/ Dev / sda1

1K-blocks
Usado
15115452 5012392
59631908 26545424
147764
17370

Utilice
Disponible %
Montado en
9949716 34 /
% / Home
30008432 47
122765 %
13 / Boot
%

Pruebe algunos comandos


simples
tmpfs

256856

256856

0% / dev / shm

Del mismo modo, para mostrar la cantidad de memoria libre, entre el mandato
libre.
[Me @ linuxbox ~] $ gratis
usado total
Mem: 513712
503976
- / + Buffers / cache: 375748
Intercambio: 1052248 104712

libre
9736
137964
947536

compartid
o
0

tampones
5312

cach
122916

Poner fin a una sesin de terminal


Podemos terminar una sesin de terminal, ya sea el cierre de la ventana de emulador de
terminal, o introduciendo el comando exit en el intrprete de comandos:

[Me @ linuxbox ~] $ exit

La Consola Detrs de la cortina


Incluso si no tenemos un emulador de terminal en funcionamiento, varias sesiones de
terminal seguir funcionando detrs del escritorio grfico. Llamado terminales
virtuales o consolas virtuales, estas sesiones se puede acceder en la mayora de
distribuciones de Linux presionando Ctrl-Alt-F1 a Ctrl-Alt-F6. Cuando se accede a
una sesin, se presenta un indicador de inicio de sesin en el que podemos introducir
nuestro nombre de usuario y contrasea. Para cambiar de una consola virtual a otro,
pulse la tecla Alt y F1-F6. Para volver al escritorio grfico, presione Alt-F7.

Resumiendo
Al comenzar nuestro viaje, se nos presenta a la cscara y vemos la lnea de comandos, por
primera vez y aprender cmo iniciar y finalizar una sesin de terminal. Tambin vemos cmo
emitir algunos comandos simples y realizar un poco de edicin de lnea de comandos de la
luz. Eso no era tan temible era?

1 - Cul es la cscara?

Lectura adicional
Para aprender ms sobre Steve Bourne, padre de la Bourne Shell, consulte este artculo
de Wikipedia:
http://en.wikipedia.org/wiki/Steve Bourne
He aqu un artculo sobre el concepto de conchas en la computacin:
http://en.wikipedia.org/wiki/Shell (informtica)

2 -

Navegacin

2 - Navegacin
Lo primero que tenemos que aprender (adems de slo escribir) es cmo navegar el sistema de
archivos en nuestro sistema Linux. En este captulo vamos a introducir los siguientes
comandos:

pwd - Escriba el nombre de directorio de trabajo actual

CD - Directorio de Cambio

ls - Lista el contenido del directorio

Entender el archivo del rbol de sistemas


Al igual que Windows, un sistema operativo de tipo Unix como Linux organiza sus archivos
en lo que se llama una estructura jerrquica de directorios. Esto significa que se organizan en
un patrn en forma de rbol de directorios (a veces llamados carpetas en otros sistemas), que
pueden contener archivos y otros directorios. El primer directorio en el sistema de archivos se
llama el directorio raz. El directorio raz contiene archivos y subdirectorios, que contienen
ms archivos y subdirectorios y as sucesivamente y as sucesivamente.
Tenga en cuenta que a diferencia de Windows, que tiene un rbol de sistema de archivos
independiente para cada dispositivo de almacenamiento, sistemas de tipo Unix como Linux
siempre tienen un solo rbol del sistema de archivos, independientemente del nmero de
unidades o dispositivos de almacenamiento estn conectados al ordenador. Los dispositivos
de almacenamiento estn conectados (o ms correctamente, montados) en varios puntos en el
rbol de acuerdo a los caprichos del administrador del sistema, la persona (o personas)
responsable del mantenimiento del sistema.

El directorio de trabajo actual


La mayora de nosotros somos probablemente familiar con un administrador de archivos
grfico que representa el rbol del sistema de archivos como en la Figura 1. Tenga en cuenta
que el rbol por lo general se muestran volc, es decir, con la raz en la parte superior y las
diversas ramas que descienden por debajo.
Sin embargo, la lnea de comandos no tiene imgenes, por lo que para navegar por el rbol de
directorios que tenemos que pensar en l de una manera diferente.

2 - Navegacin ____________________________________________________________________
Imagine que el sistema de archivos es una forma de un rbol al revs laberinto y somos
capaces de

Bft / h bin D h CD
de arranque de
exploracin y
produccin de
CD dev $ CD etc
lj casa i CD
bshotts | $ CD ftp
ih CD karen! CD
perdido encontr
+
0 CD .enlightenment r
CD .gnome-escritorio
que CD .gnome

Figura 1: Archivo rbol del sistema, como se


muestra por un administrador de archivos
grfico
pararse en el medio de ella. En un momento dado, estamos dentro de un solo directorio y
podemos ver los archivos contenidos en el directorio y la ruta al directorio por encima de
nosotros (llamado el directorio padre) y los subdirectorios por debajo de nosotros. El
[Me @ linuxbox ~] $ pwd /
home m /
directorio estamos de pie en se llama el directorio de trabajo actual. Para mostrar el directorio
de trabajo actual, utilizamos los comandos pwd (print working directory).
Cuando nos registramos en nuestro sistema (o iniciar una sesin de emulador de terminal)
nuestro directorio de trabajo actual se establece en nuestro directorio home. Cada cuenta de
usuario tiene su propio directorio y es el nico lugar donde se permite a un usuario normal
para escribir archivos.

[me @ linuxbox ~] $ ls
Documentos de Escritorio Msica Fotos Plantillas Pblicos Videos

Aadir el contenido de un directorio


Para una lista de los archivos y directorios en el directorio de trabajo actual, utilizamos el
comando ls.

Aadir el contenido de un directorio


En realidad, podemos usar el comando ls para listar el contenido de cualquier directorio, no
slo el directorio de trabajo actual, y hay muchas otras cosas divertidas que puede hacer
tambin. Vamos a pasar ms tiempo con ls en el prximo captulo.

Cambiar el directorio de trabajo actual


Para cambiar su directorio de trabajo (donde estamos parados en nuestro laberinto en forma
de rbol) utilizamos el comando cd. Para ello, escriba cd seguido de la ruta del directorio de
trabajo deseado. Una ruta de acceso es la ruta que tomamos a lo largo de las ramas del rbol
para llegar al directorio que queremos. Nombres de vas se pueden especificar en una de dos
maneras diferentes; como nombres de ruta absolutos o como rutas relativas. Vamos a tratar
con nombres de ruta absolutos primero.

[Me @ linuxbox ~] $ cd / usr / bin [me


@ bin linuxbox] $ pwd / usr / bin
[Me @ bin linuxbox] $ ls

... Listado de muchos, muchos archivos ...

Rutas absolutas
Una ruta absoluta comienza con el directorio raz y sigue la rama de un rbol por la rama hasta
que se complete la ruta de acceso al directorio o archivo deseado. Por ejemplo, hay un
directorio de su sistema en el que la mayor parte de los programas de su sistema estn
instalados. La ruta de acceso del directorio es / usr / bin. Esto significa que desde el directorio
raz (representado por la barra inicial en el nombre de ruta) hay un directorio llamado "usr",
que contiene un directorio llamado "bin".
Ahora podemos ver que hemos cambiado el directorio de trabajo actual a / usr / bin y que
est lleno de archivos. Observe cmo ha cambiado la lnea de comandos? Para su
conveniencia, por lo general se estableci para mostrar automticamente el nombre del
directorio de trabajo.

Rutas relativas
Cuando una ruta absoluta comienza desde el directorio raz y conduce a su destino, un
nombre de ruta relativa empieza desde el directorio de trabajo. Para ello, utiliza un par de
smbolos especiales para representar posiciones relativas en el rbol del sistema de archivos.
Estos smbolos son especiales "." (Punto) y ".." (punto punto).
El "." smbolo se refiere al directorio de trabajo y el ".." smbolo se refiere a directorio padre del
directorio de trabajo. Aqu es cmo funciona. Vamos a cambiar el directorio de trabajo a
9

2 - Navegacin /
usr / bin de nuevo:
[Me @ linuxbox ~] $ cd / usr / bin [me
@ bin linuxbox] $ pwd / usr / bin

Bien, ahora vamos a decir que queramos cambiar el directorio de trabajo al padre de / usr /
bin, que es / usr. Podramos hacer que dos maneras diferentes. Ya sea con una ruta absoluta:

[Me @ linuxbox bin] $ cd / usr


[Me @ linuxbox usr] $ pwd
/ Usr
O, con una ruta de acceso relativa:
[Me @ linuxbox bin] $ cd ..
[Me @ linuxbox usr] $ pwd
/ Usr
Dos mtodos diferentes con resultados idnticos. Cul debemos utilizar? La que
requiere la menor mecanografa!
Del mismo modo, podemos cambiar el directorio de trabajo de / usr a / usr / bin en dos
maneras diferentes. O bien utilizando una ruta absoluta:

[Me @ linuxbox usr] $ cd / usr / bin [me


@ bin linuxbox] $ pwd / usr / bin

O, con una ruta de acceso


relativa:
[Me @ linuxbox usr] $ cd ./bin [me
@ bin linuxbox] $ pwd / usr / bin

Ahora, hay algo importante que debo sealar aqu. En casi todos los casos, se puede

10

[Me @ linuxbox usr] bin $ cd

Cambiar el directorio de trabajo actual

omitir el "./". Se da a entender. Mecanografa:


hace lo mismo. En general, si no se especifica una ruta de acceso a algo, se supone que el

Datos importantes sobre nombres de archivo


1. Los nombres de archivo que comienzan con un carcter de punto estn ocultos.
Esto slo significa que ls no enumerarlos a menos que usted dice ls -a. Cuando se
Tabla 2-1:
Mtodos
abreviados
dearchivos
cd
cre
su cuenta,
varios
ocultos fueron colocados en el directorio de inicio
cosas por su cuenta. Ms tarde vamos a echar un vistazo ms
Atajopara configurar lasResultado
de
cerca
a
algunos
de estos
archivosdepara
ver alcmo
se puede
el
CD
Cambia
el directorio
trabajo
directorio
de tupersonalizar
casa.
entorno. Adems, algunas aplicaciones colocan sus archivos de configuracin y
personal
comode
archivos
cd - ajustes en su directorio
Cambia
el directorio
trabajoocultos.
al directorio de trabajo anterior.
2. Los nombres de archivo y comandos en Linux, como Unix, maysculas y
cd ~ minsculas. Los Cambia
nombres
de archivo
"archivol"
y "archivol"
se de
refieren a
el directorio
de trabajo
al directorio
principal
nombre_usuario
diferentes archivos.
nombre_usuario. Por ejemplo, cd ~ bob cambiar el directorio para
3. Linux no tiene ningn
concepto
una del
"extensin
archivo" como algunos otros
el directorio
dede
inicio
usuariode
"bob".
sistemas operativos. Es posible que el nombre de los archivos como quieras. Los
contenidos y / o funcin de un archivo se determina por otros medios. Aunque el
sistema operativo similar a Unix no utilice
directorio de trabajo.

Algunos atajos tiles


En la Tabla 2-1 vemos algunas maneras tiles el directorio de trabajo actual se pueden cambiar
rpidamente.

11

las extensiones de archivo para determinar el contenido / el propsito de


archivos, algunos programas de aplicacin hacen.
4. Aunque Linux soporta nombres de archivo largos que pueden contener espacios
incrustados y caracteres de puntuacin, limitar los caracteres de puntuacin en
los nombres de archivos se crea a perodo, guiones y subrayados. Lo ms
importante, no incrustar espacios en los nombres de archivo. Si desea representar
espacios entre palabras en un nombre de archivo, utilice caracteres de subrayado.
Usted se agradecer ms tarde.
2 - Navegacin

Resumiendo
En este captulo hemos visto cmo la cscara trata la estructura de directorios del sistema.
Aprendimos sobre nombres de ruta absolutos y relativos y los comandos bsicos que se
utilizan para moverse por esa estructura. En el prximo captulo vamos a utilizar este
conocimiento para ir en un tour de un moderno sistema Linux.

12

3 Exploracin
sistema

del

- Exploracin del sistema

Ahora que sabemos cmo mover todo el sistema de archivos, es el momento para una visita
guiada de nuestro sistema Linux. Antes de empezar, sin embargo, vamos a aprender algunos
comandos ms que sern tiles a lo largo del camino:

ls - Lista el contenido del directorio

expediente - Determinar el tipo de archivo

menos - Ver el contenido del archivo

[me @ linuxbox ~] $ ls
Documentos de Escritorio Msica Fotos Plantillas Pblicos Videos

Adems del directorio de trabajo actual, podemos especificar el directorio a la lista, as:
me @ linuxbox
] $ Ls / usr
~
juegos bin
kerberos libexec
sbin
src
etc incluyen
lib
local
cuota
tmp

Ms diversin con ls
El comando ls es probablemente el comando ms utilizado, y por una buena razn. Con l,
podemos ver el contenido del directorio y determinar una variedad de atributos de archivos y
directorios importantes. Como hemos visto, podemos simplemente entrar ls para ver una lista
de archivos y subdirectorios contenidos en el directorio de trabajo actual:

O incluso especificar varios directorios. En este ejemplo vamos a enumerar tanto el directorio
del usuario domstico (simbolizada por el carcter "~") y el directorio / usr:

[Me @ linuxbox ~] $ ls ~ / usr /


home / me:

13

3 - la exploracin del
sistema
Documentos de Escritorio Msica Fotos Plantillas Pblicos Videos

/ Usr:
papelera
src
etc
incluir

juegos

kerberos

libexec sbin

lib

local

cuota

tmp

Tambin podemos cambiar el formato de la salida a revelar ms detalles:


[Me @ linuxbox ~] $ Ls -l
total de 56
drwxrwxr-x 2 m m 4096 2007-10-26 17:20 Escritorio
drwxrwxr-x 2 m m 4096 2007-10-26 17:20 Documentos
drwxrwxr-x 2 m m 4096 2007-10-26 17:20 Msica
drwxrwxr-x 2 m m 4096 2007-10-26 17:20 Imgenes
drwxrwxr-x 2 m m 4096 2007-10-26 17:20 Pblico
drwxrwxr-x 2 m m 4096 2007-10-26 17:20 Plantillas
drwxrwxr-x 2 m m 4096 2007-10-26 17:20 Vdeos
Mediante la adicin de "-l" para el comando, cambiamos la salida al formato largo.

Opciones y argumentos
Esto nos lleva a un punto muy importante sobre el funcionamiento de la mayora de los
comandos. Comandos suelen ir seguidas de una o ms opciones que modifican su
comportamiento, y, adems, por uno o ms argumentos, los artculos sobre los que los actos
de comando. As que la mayora de los comandos se ven un poco como esto:

comando -Opciones
argumentos
La mayora de los comandos utilizan las opciones que consisten de un solo carcter precedido
por un guin, por ejemplo, "-l", pero muchos de los comandos, entre ellos los del Proyecto
GNU, tambin admiten opciones largas, que consiste en una palabra precedida de dos
guiones. Adems, muchos comandos permiten mltiples opciones cortas que se encadenan
juntos. En este ejemplo, el comando ls se le da dos opciones, la opcin "l" para producir la
salida de formato largo, y la opcin de "t" para ordenar el resultado por hora de modificacin
del archivo.
[Me @ linuxbox ~] $ ls -lt

14

[Me @ linuxbox ~] $ ls -lt --reverse

Ms diversin con ls

Vamos a aadir la opcin larga "--reverse" para invertir el orden de la clase:

Tenga en cuenta que las opciones de comando, al igual que los nombres de archivos en
Linux, entre maysculas y minsculas.
El comando ls tiene un gran nmero de opciones posibles. Los ms comunes se enumeran en
la Tabla 3-1.
Tabla 3-1: Es comn Opciones

Opcin
-a

Largo Opcin
--all

-A

--casi todo-

Descripcin
Haga una lista de todos los archivos, incluso los
que tienen nombres que comienzan con un
perodo, que normalmente no figuran (es decir,
oculto).
Al igual que la opcin -a anterior, excepto que no
lista. (Directorio actual) y .. (directorio padre).

-d
--directory
Normalmente, si se especifica un directorio, LS
listar el contenido del directorio, no el propio directorio. Utilice esta opcin junto con la
opcin -l para ver detalles sobre el directorio en lugar de su contenido.
-F
--classify
Esta opcin aadir un carcter indicador hasta el
final de cada nombre de la lista. Por ejemplo, un "/"
si el nombre es un directorio.
-h
---human legible
En los listados de formato largo, mostrar tamao
de los archivos en formato legible para las
personas en lugar de en bytes.
-l
Mostrar resultados en formato largo.
-r
--reverse
Mostrar los resultados en orden inverso.
Normalmente, ls muestra sus resultados en orden
alfabtico ascendente.
-S
-t

15

Ordenar los resultados por tamao de archivo.


Ordenar por fecha de modificacin.

3 - Exploracin del sistema


Una mirada a ms largo At Long Formato
Como vimos antes, los "-l" causas opcin ls para mostrar sus resultados en formato largo. Este
formato contiene una gran cantidad de informacin til. Aqu es el directorio de ejemplos de
un sistema Ubuntu:
-rw-r
-rw-r
-rw-r
-rw-r
-rw-r
-rw-r
-rw-r
-rw-r
-rw-r
-rw-r
-rw-r

-r--r--r--r--r--r--r--r--r--r--r--

1 raz raz
3576296 2007-04-03 11 05 Experiencia ubuntu.ogg
1 raz raz
1186219 2007-04-03 11 05 kubuntu-leaflet.png
1 raz raz
47584 2007-04-03 11 05 logo-Edubuntu.png
1 raz raz
44355 2007-04-03 11 05 logo-Kubuntu.png
1 raz raz
34391 2007-04-03 11 05 logo-Ubuntu.png
1 raz raz
32059 2007-04-03 11 05 oo-cd-cover.odf
1 raz raz
159744 2007-04-03 11 05 oo-derivatives.doc
1 raz raz
27837 2007-04-03 11 05 oo-maxwell.odt
1 raz raz
98816 2007-04-03 11 05 oo-trig.xls
453764 2007-04-03 11 05 oo-welcome.odt
1 raz raz
358374 2007-04-03 11 05 ubuntu Sax.ogg
1 raz raz
Echemos un vistazo a los diferentes campos de uno de los archivos y examinar sus
significados:
Tabla 3-2: Es campos Listing largas

Campo
-rw-r - r--

raz

Significado
Los derechos de acceso al archivo. El primer carcter indica el
tipo de archivo. Entre los diferentes tipos, un guin que lleva
significa un archivo normal, mientras que una "d" indica un
directorio. Los siguientes tres caracteres son los derechos de
acceso para el propietario del archivo, el prximo tres son
para los miembros del grupo del archivo, y la final tres son
para todos los dems. El significado completo de esto se
discute en el Captulo 9 - Permisos.
Nmero de archivo de enlaces duros. Vase el anlisis de los
vnculos ms adelante en este captulo.
El nombre de usuario del propietario del archivo.

raz

El nombre del grupo que posee el archivo.

32059
2007-04-03 11:05
oo-cd-cover.odf

Tamao de archivo en bytes.


Fecha y hora de la ltima modificacin del archivo.
Nombre del archivo.

16

Determinar el tipo de un archivo con el archivo

Determinar el tipo de un archivo con el archivo


A medida que exploramos el sistema ser til para saber qu contienen los archivos. Para ello
vamos a utilizar el comando file para determinar el tipo de un archivo. Como hemos
comentado anteriormente, los nombres de archivos en Linux no son necesarios para reflejar el
contenido de un archivo. Mientras que normalmente se esperara que un nombre de fichero

archivo de
nombre de
archivo
como "picture.jpg" para contener una imagen JPEG comprimida, no se requiere que en Linux.
Podemos invocar el comando de archivo de esta manera:

[Me @ linuxbox ~] imagen.jpg $ archivo


picture.jpg: datos de imagen JPEG, JFIF estndar 1.01
Cuando se invoca, el comando file imprimir una breve descripcin del contenido del archivo.
Por ejemplo:
Hay muchos tipos de archivos. De hecho, una de las ideas comunes de los sistemas operativos
tipo Unix como Linux es que "todo es un archivo." A medida que avanzamos con nuestras

Qu es el "texto"?
Hay muchas formas de representar la informacin en un ordenador. Todos los
mtodos implican la definicin de una relacin entre la informacin y algunos
nmeros que se utilizarn para representarla. Computadoras, despus de todo, slo
entienden nmeros y todos los datos se convierten a la representacin numrica.
Algunos de estos sistemas de representacin son muy complejos (como los archivos
de vdeo comprimido), mientras que otros son bastante simples. Uno de los primeros
y ms simple se llama texto ASCII. ASCII (pronunciado "Como-Key") es la abreviatura
de American Standard
lecciones, veremos qu tan cierto que la declaracin es.
Mientras que muchos de los archivos en su sistema son familiares, por ejemplo MP3 y JPEG,
hay muchos tipos que son un poco menos obvio y algunos que son bastante extraa.

Viendo el contenido del archivo Con menos


El comando less es un programa para ver archivos de texto. A lo largo de nuestro sistema
Linux, hay muchos archivos que contienen texto legible. Cuanto menos programa
proporciona una manera conveniente para examinarlos.

17

3 - la exploracin del
sistema
Cdigo para el Intercambio de Informacin. Se trata de un esquema de codificacin
simple que fue utilizado por primera vez en las mquinas de teletipo para mapear los
caracteres del teclado a los nmeros.
El texto es una sencilla asignacin uno a uno de los personajes a los nmeros. Es muy
compacto. Cincuenta caracteres de texto se traduce a cincuenta bytes de datos. Es
importante entender que slo texto contiene un mapeo simple de caracteres que
nmeros. No es lo mismo que un documento de procesador de textos, como uno
creado por OpenOffice.org Writer o Microsoft Word. Esos archivos, en contraste con
texto ASCII simple, contienen muchos elementos no son de texto que se utilizan para
describir su estructura y formato. Archivos de texto plano ASCII contienen slo los
propios y unos cdigos de control rudimentarias como tabuladores, retornos de carro
y avances de lnea caracteres.
A lo largo de un sistema Linux, muchos archivos se almacenan en formato de texto y
hay muchas herramientas de Linux que trabajan con archivos de texto. Incluso
Windows reconoce la importancia de este formato. El programa NOTEPAD.EXE bien
es unaeditor
deexaminar
archivos de
ASCIIde
sintexto?
formato.
Porconocido
qu bamos
querer
lostexto
archivos
Debido a que muchos de los
archivos que contienen los ajustes del sistema (llamados archivos de configuracin) se
almacenan en este formato, y ser capaz de leerlos nos da una idea de cmo funciona el
sistema. Adems, muchos de los programas reales que utiliza el sistema (llamados scripts) se
almacenan en este formato. En captulos posteriores, vamos a aprender cmo editar archivos
de texto con el fin de modificar la configuracin de los sistemas y escribir nuestros propios
guiones, pero por ahora nos limitaremos a mirar su contenido.
El comando se utiliza menos como esto:

menos el
nombre de
archivo
Una vez iniciado, el programa less le permite desplazarse hacia adelante y hacia atrs a travs
de un archivo de texto. Por ejemplo, para examinar el archivo que define todas las cuentas de
usuario del sistema, escriba el siguiente comando:

[Me @ linuxbox ~] $ less / etc / passwd


Una vez que el programa se inicia menos, podemos ver el contenido del archivo. Si el archivo
es ms de una pgina, que puede desplazarse hacia arriba y hacia abajo. Para salir menos,
pulse la tecla "q".
La siguiente tabla muestra los comandos de teclado ms comunes utilizadas por menos.

18

Menos es ms
Cuanto menos programa fue diseado como un reemplazo de la mejora de un
programa anterior de Unix llamada ms. El nombre de "menos" es un juego en la frase
"menos es ms" -a lema de arquitectos modernistas y diseadores.
menos cadas en la clase de programas llamados programas que permiten la fcil
Tabla
3-3: Comandos
visualizacin
demenos
documentos de texto largo en una pgina por pgina de manera
"buscapersonas". Considerando que el programa podra ms adelante slo la pgina,
Comando
Accin
el programa permite menos
paginacin tanto hacia delante como hacia atrs y tiene
muchas
tambin.
Pg
o b otras caractersticas
Vaya
a la pgina anterior
Av Pg o espacio

Avanzar una pgina

Flecha arriba
Flecha abajo
G

Desplazarse una lnea hacia arriba


Desplazarse una lnea hacia abajo
Ir al final del archivo de texto

1G o g

Ir al principio del archivo de texto

/ caracteres

Buscar en adelante a la siguiente aparicin de personajes

Busca la siguiente aparicin de la bsqueda anterior

Visualizar la pantalla de ayuda

Salga menos

Viendo el contenido del archivo Con menos

Una visita guiada


El diseo del sistema de archivos en el sistema Linux es muy similar a la encontrada en otros
sistemas Unix. El diseo es en realidad especificado en una norma publicada llamado el
sistema de archivos estndar de jerarqua Linux. No todas las distribuciones de Linux se
ajustan a la norma exactamente pero la mayora vienen bastante cerca.
A continuacin, vamos a pasear por el sistema de archivos a nosotros mismos para ver lo que
hace que nuestro sistema Linux garrapata. Esto le dar la oportunidad de practicar sus
habilidades de navegacin. Una de las cosas que vamos a descubrir es que muchos de los
archivos interesantes estn en texto legible por humanos llanura. A medida que avanzamos en
nuestro recorrido, pruebe lo siguiente:
19

3 - la exploracin del sistema


1. CD en un directorio dado
2. Liste el contenido del directorio con ls -l
3. Si ve un archivo interesante, determinar su contenido con archivo
4. Si parece que puede ser texto, trate de verlo con menos

Recuerde que el copiar y pegar truco! Si est utilizando un ratn, puede hacer doble clic
en un nombre de archivo para copiarlo y medio haga clic para pegarlo en comandos.
Al pasear, no tengas miedo de mirar a las cosas. Los usuarios normales estn en gran medida
prohibidos de ensuciar las cosas. Ese es el trabajo de los administradores de sistema! Si un
comando se queja de algo, simplemente pasar a otra cosa. Pasa algn tiempo mirando a su
alrededor. El sistema es el nuestro para explorar. Recuerde, en Linux, no hay secretos!
Tabla 3-4 enumera slo algunos de los directorios que podemos explorar. Sintase libre de
probar ms!
Tabla 3-4: Directorios encontrados en sistemas Linux

Directorio
/
/ Bin

Comentarios
El directorio raz. Dnde empieza todo.
Contiene binarios (programas) que deben estar presentes para
que el sistema arranque y funcionamiento.
Contiene el kernel de Linux, imagen de disco RAM inicial (para
los conductores necesarios en el arranque), y el gestor de
arranque.

/ Boot

Archivos de inters:

/ Dev

/boot/grub/grub.conf o menu.lst, que se utilizan para


configurar el gestor de arranque.
/ Boot / vmlinuz, el kernel de Linux
Este es un directorio especial que contiene nodos de dispositivos.
"Todo es un archivo" tambin se aplica a los dispositivos. Aqu es
donde el kernel mantiene una lista de todos los dispositivos que
entiende.

20
Una visita guiada

Directorio
/ Etc

Comentarios
El / etc directorio contiene todos los archivos de configuracin
de todo el sistema. Tambin contiene una coleccin de scripts de
shell que se inician cada uno de los servicios del sistema en el
arranque. Todo en este directorio debe ser un texto legible.

/ Home

/ Lib
/ Perdido
encontrado +

/ medios

/ Mnt

/ Opt

Archivos interesantes: Aunque todo en / etc es interesante, aqu


estn algunos de mis favoritos de todos los tiempos:
/ Etc / crontab, un archivo que define cuando los
trabajos se ejecutarn automatizados.
/ Etc / fstab, una tabla de dispositivos de
almacenamiento y sus puntos de montaje asociados.
/ Etc / passwd, una lista de las cuentas de usuario.

En configuraciones normales, cada usuario se le da un directorio


en / home. Los usuarios normales slo pueden escribir archivos
en sus directorios de inicio. Esta limitacin protege el sistema de
la actividad del usuario errante.
Contiene los archivos de bibliotecas compartidas utilizadas por
los programas del sistema base. Estos son similares a los
archivos DLL de Windows.
Cada particin con formato o dispositivo mediante un sistema de
archivos de Linux, tales como ext3, tendr este directorio. Se utiliza en
el caso de una recuperacin parcial de un evento de corrupcin del
sistema de archivo.
A menos que algo realmente malo le ha sucedido a su sistema,
este directorio se mantendr vaca.
En los sistemas Linux modernos el directorio / media contendr
los puntos de montaje para medios extrables, como unidades
USB, CD-ROM, etc., que se montan automticamente en la
insercin.
En los sistemas Linux de ms edad, el directorio / mnt contiene
los puntos de montaje para los dispositivos extrables que han
sido montadas manualmente.
El / opt directorio se utiliza para instalar el software "opcional".
Esto se utiliza principalmente para mantener los productos de
software comerciales que puedan estar instalados en su sistema.

21

3 - la exploracin del sistema


Directorio
Comentarios
/ Proc
El / proc directorio es especial. No es un sistema de archivos real
en el sentido de los archivos almacenados en su disco duro. Ms
bien, es un sistema de archivos virtual mantenida por el kernel
de Linux. Los "archivos" que contiene son mirillas en el propio
ncleo. Los archivos se pueden leer y le dar una idea de cmo el
ncleo ve su computadora.
/ Root
/ Sbin

/ Tmp

/ Usr

/ Usr / bin

/ Usr / lib
/ Usr / local

/ Usr / sbin
/ Usr / share

/ Usr / share / doc

22

Este es el directorio inicial de la cuenta de root.


Este directorio contiene los binarios del "sistema". Estos son
programas que realizan tareas vitales del sistema que son
generalmente reservados para el superusuario.
El directorio / tmp est destinado para el almacenamiento de
archivos temporales, transitorios creados por diferentes
programas. Algunas configuraciones causan este directorio para
ser vaciado cada vez que se reinicia el sistema.
El directorio / usr rbol de directorios es probablemente el ms
grande en un sistema Linux. Contiene todos los archivos y
programas de apoyo utilizados por los usuarios regulares.
/ Usr / bin contiene los programas ejecutables instalados por su
distribucin de Linux. No es poco comn para este directorio
para almacenar miles de programas.
Las bibliotecas compartidas para los programas en / usr / bin.
El directorio / usr / local rbol es donde se instalan los
programas que no estn incluidos con su distribucin sino que
se destinan para el uso de todo el sistema. Programas
compilados desde el cdigo fuente normalmente se instalan en /
usr / local / bin. En un sistema Linux recin instalado, existe
este rbol, pero estar vaca hasta que el administrador del
sistema pone algo en ella.
Contiene ms programas de administracin del sistema.
/ Usr / share contiene todos los datos compartidos utilizados
por los programas en / usr / bin. Esto incluye cosas como los
archivos de configuracin por defecto, los iconos, fondos de
pantalla, archivos de sonido, etc.
La mayora de los paquetes instalados en el sistema incluirn
algn tipo de documentacin. En / usr / share / doc, vamos a
encontrar los archivos de documentacin organizados por
paquete.

Una visita guiada

Directorio
/ Var

Comentarios
Con la excepcin de / tmp y / home, los directorios que hemos
visto hasta el momento siguen siendo relativamente esttico, es
decir, sus contenidos no cambian. El rbol de directorios / var es
donde se almacenan los datos que es probable que cambie.
Varias bases de datos, archivos de cola, correo de usuario, etc., se
encuentran aqu.
/ Var / log contiene archivos de registro, registros de diversas
actividades del sistema. Estos son muy importantes y deben ser
vigilados de vez en cuando. La ms til es / var / log /
messages. Tenga en cuenta que por razones de seguridad en
algunos sistemas, debe ser superusuario para ver los archivos de
registro.

/ Var / log

Enlaces simblicos
Al mirar alrededor, que es probable que veamos un listado de directorios con una entrada
como esta:
lrwxrwxrwx 1 raz

raz 11 2007-08-11 07:34 libc.so.6 -> libc-2.6.so

Note como la primera letra de la lista es "l" y la entrada parece tener dos nombres de archivo?
Este es un tipo especial de un archivo llamado un enlace simblico (tambin conocido como
enlace blando o enlace bolo.) En sistemas ms Unix que es posible tener un archivo
referenciado por varios nombres. Mientras que el valor de este puede no ser obvio, es
realmente una caracterstica til.
Imagnese este escenario: Un programa requiere el uso de un recurso compartido de una
especie que figura en un archivo llamado "foo", pero "foo" tiene cambios de versin frecuentes.
Sera bueno incluir el nmero de versin en el nombre del archivo para que el administrador u
otra parte interesada poda ver qu versin de "foo" se instala. Esto presenta un problema. Si
cambiamos el nombre del recurso compartido, tenemos que localizar a cada programa que
pueda usarlo y modificarlo para buscar un nuevo nombre de recurso cada vez que se instala
una nueva versin del recurso. Eso no suena como la diversin en absoluto.
Aqu es donde los enlaces simblicos salvar el da. Digamos que instalar la versin 2.6 de
"foo", que tiene el nombre de archivo "foo-2.6" y luego crear un enlace simblico llamado
simplemente "foo" que apunta a "foo-2.6." Esto significa que cuando un programa se abre el
archivo " foo ", en realidad est abriendo el archivo" foo-2.6 ". Ahora todo el mundo es feliz.
Los programas que se basan en "foo" pueden encontrarlo y todava podemos ver lo que la
versin actual instalada. Cuando es el momento de actualizar a "foo-2.7," que acabamos de
agregar el archivo a nuestro sistema, eliminar el enlace simblico "foo" y crear una nueva que
apunta a la nueva versin. Esto no slo resuelve el problema de la actualizacin de la versin,
sino que tambin nos permite mantener ambas versiones en nuestra mquina. Imagina que
"foo-2.7" tiene un error (maldita aquellos desarrolladores!) Y tenemos que volver a la versin
antigua. Una vez ms, acabamos de eliminar el vnculo simblico que apunta a la nueva
versin y crear una nueva

23
3 - Exploracin del sistema ________________________________________________________
enlace simblico que apunta a la versin antigua.
El listado del directorio anterior (desde el directorio / lib de un sistema Fedora) muestra un
enlace simblico llamado "libc.so.6" que apunta a un archivo de biblioteca compartida
denominada "libc-2.6.so." Esto significa que los programas en busca de " libc.so.6 "en realidad
obtener el archivo" libc-2.6.so. "Vamos a aprender cmo crear enlaces simblicos en el
prximo captulo.

Enlaces duros
Ya que estamos en el tema de los vnculos, tenemos que mencionar que hay un segundo tipo
de enlace llamado un enlace duro. Los enlaces duros tambin permitir que los archivos que
tienen varios nombres, pero lo hacen de una manera diferente. Hablaremos ms sobre las
diferencias entre los enlaces simblicos y duros en el prximo captulo.

Resumiendo
Con nuestro tour detrs de nosotros, hemos aprendido mucho acerca de nuestro sistema.
Hemos visto varios archivos y directorios y sus contenidos. Una cosa que usted debe tomar
distancia de todo esto es el grado de apertura del sistema es. En Linux hay muchos archivos
importantes que son texto sin formato legible por humanos. A diferencia de muchos sistemas
propietarios, Linux hace todo lo disponible para su examen y estudio.

Lectura adicional

24

La versin completa de la jerarqua del sistema de ficheros estndar de Linux se puede


encontrar aqu: http://www.pathname.com/fhs/

Un artculo sobre la estructura de directorios de los sistemas Unix y tipo Unix:


http://en.wikipedia.org/wiki/Unix estructura de directorios

Una descripcin detallada del formato de texto


ASCII: http://en.wikipedia.org/wiki/ASCII

4 - Manipulacin
directorios

de

archivos

4 - Manipulacin de archivos y directorios


En este punto, estamos listos para un trabajo de verdad! Este captulo introducir los
siguientes comandos:

cp - Copia de archivos y directorios

mv - Mover / renombrar archivos y directorios

m k d i r - Crear directorios

rm - Eliminar los archivos y directorios

ln - Crear enlaces duros y simblicos


Estos cinco comandos estn entre los comandos de Linux de uso ms frecuente. Se utilizan
para la manipulacin de archivos y directorios.
Ahora, para ser franco, algunas de las tareas realizadas por estos comandos son ms fciles de
hacer con un administrador de archivos grfico. Con un administrador de archivos, podemos
arrastrar y soltar un archivo de un directorio a otro, cortar y pegar archivos, eliminar archivos,
etc Por lo tanto por qu usar estos viejos programas de lnea de comandos?
La respuesta es el poder y la flexibilidad. Si bien es fcil de realizar manipulaciones de
archivos simples con un gestor de archivos grfico, tareas complicadas puede ser ms fcil con
los programas de lnea de comandos. Por ejemplo, cmo podramos copiar todos los archivos
HTML a partir de un directorio a otro, pero slo copiar los archivos que no existen en el

-u cp * .html destino
directorio de destino o son ms recientes que las versiones en la carpeta de destino? Bastante
duro con un administrador de archivos. Bastante fcil con la lnea de comandos:

Los comodines
Antes de comenzar el uso de nuestros comandos, tenemos que hablar de una funcin de shell
que hace que estos comandos de manera poderosa. Desde el shell utiliza nombres de archivo
tanto, proporciona caracteres especiales para ayudarle a especificar rpidamente grupos de
nombres de archivo. Estos caracteres especiales son
25

4 - Manipulacin de archivos y directorios llamados comodines. Uso de comodines (que


tambin se conoce como comodines) le permiten seleccionar los nombres de archivo basado en
patrones de caracteres. La siguiente tabla muestra los caracteres comodn y lo que seleccione:
Tabla 4-1: Los comodines

Comodn
*

Significado
Coincide con cualquier carcter

Coincide con cualquier carcter individual


Coincide con cualquier carcter que es un miembro de los
personajes de ajuste
Coincide con cualquier carcter que no sea un miembro de los
personajes de ajuste

[personajes]
[! caracteres]
[[: Clase:]]

Tabla 4-2 enumera los


ms

Coincide con cualquier carcter que es miembro de la clase


especificada

comnmente utilizado clases de personajes:

Tabla 4-2: Clases de personajes ms utilizadas

Carcter de clase

Significado

[: Alnum:]

Coincide con cualquier carcter alfanumrico

[: Alpha:]

Coincide con cualquier carcter alfabtico

[: Dgito:]

Coincide con cualquier nmero

[: Lower:]
[: Upper:]

Coincide con cualquier letra minscula


Coincide con cualquier letra mayscula

El uso de comodines hace posible la construccin de criterios de seleccin muy sofisticados


para los nombres de archivo. He aqu algunos ejemplos de patrones y lo que coinciden:
Tabla 4-3: Ejemplos de comodines

Patrn
*

Cerillas
Todos los archivos

g*

Cualquier archivo que comienzan con "G"


Cualquier archivo que comienzan con "b"
seguido por
cualquier carcter y terminando con ".txt"

b * .txt

26

Los comodines
Datos ???
[Abc] *
COPIA DE SEGURIDAD. [0-9]
[0-9] [0-9]
[[: Upper:]] *
[[: Dgito:]] *
* [[: Lower:] 123]

Cualquier archivo que comienzan con "datos",


seguido de exactamente tres personajes
Cualquier archivo que comienza con una "A",
"B", o una "c"
Cualquier archivo que comienzan con "COPIA
DE SEGURIDAD.", Seguido de exactamente
tres
nmeros
Cualquier
archivo que comienzan con una letra
mayscula
Cualquier archivo que no empiece con un
numeral
Cualquier archivo que termina con una letra
minscula o los nmeros "1", "2" o "3"

Los comodines se pueden usar con cualquier comando que acepta nombres de archivo como
argumentos, pero vamos a hablar ms sobre esto en el captulo 7.

Rangos de caracteres
Si usted viene de otro entorno Unix o ha estado leyendo algunos otros libros sobre
este tema, es posible que haya encontrado el [AZ] o los [AZ] notaciones rango de
caracteres. Estas son las notaciones tradicionales de Unix y trabajaron en las versiones
anteriores de Linux tambin. An as, pueden trabajar, pero hay que tener mucho
cuidado con ellos porque no van a producir los resultados esperados a menos que se
configura correctamente. Por ahora, usted debe evitar el uso de ellos y utilizar clases
de caracteres en lugar.

Los comodines trabajar en la interfaz grfica de usuario


Demasiado
Los comodines son especialmente valiosos no slo porque se utilizan con tanta
frecuencia en la lnea de comandos, pero tambin son apoyados por algunos
administradores de archivos grficos.
En Nautilus (el gestor de archivos para GNOME), puede seleccionar archivos
utilizando el / Seleccionar opcin de men Pattern Edit. Slo tienes que
introducir un patrn de seleccin de archivos con comodines y los archivos en el
directorio que se est viendo se resaltar para la seleccin.
En algunas versiones de Dolphin y Konqueror (los administradores de archivos
para KDE), puede introducir comodines directamente en la barra de direcciones.
Por ejemplo, si desea ver todos los archivos a partir de una minscula "u" en el
directorio / usr / bin, escriba "/ usr / bin / u *" en la barra de direcciones y se
mostrar el resultado.
27

Muchas ideas originalmente se encuentran en la interfaz de lnea de comandos se


abren camino en la interfaz grfica, tambin. Es una de las muchas cosas que hacen
que el escritorio de Linux tan poderoso.
4 - Manipulacin de archivos y directorios

mkdir - Crea Directorios


El comando mkdir se utiliza para crear directorios. Funciona as:

mkdir directorio ...


Una nota sobre la notacin: Cuando tres perodos siguen un argumento en la descripcin de
un comando (como arriba), significa que el argumento se puede repetir, por lo tanto:
mkdir dirl
creara un nico directorio llamado "dirl", mientras
mkdir dirl dir2 directorio3
creara tres directorios llamados "dirl", "dir2", y "directorio3".

cp - copia ficheros y directorios


El comando cp copia archivos o directorios. Se puede utilizar de dos maneras

diferentes: cp iteml item2


para copiar el archivo o directorio nico "iteml" para el archivo o directorio
"elemento2" y: cp artculo ... directorio
copiar varios elementos (ya sean archivos o directorios) en un directorio.

28

cp - copia ficheros y directorios

Opciones tiles y ejemplos


Estas son algunas de las opciones de uso comn (a corto y la opcin larga equivalente) para
cp:
Tabla 4-4: Opciones cp
Opcin
Significado
-a, --archive
Copie los archivos y directorios y todos sus atributos,
incluyendo propiedades y permisos. Normalmente, las
copias adquieren los atributos por defecto del usuario que
realiza la copia.
-i, --interactive
Antes de sobrescribir un archivo existente, pedir
confirmacin al usuario. Si no se especifica esta opcin, cp
silenciosamente sobrescribir archivos.
-r, --recursive
Recursivamente copiar directorios y sus contenidos. Esta
opcin es necesaria (o la opcin -a) al copiar directorios.
-u, --update

-v, --verbose

Al copiar archivos de un directorio a otro, slo copiar los


archivos que, o bien no existen, o son ms recientes que los
archivos correspondientes ya existentes, en el directorio de
destino.
Mostrar mensajes informativos como se realiza la copia.

Tabla 4-5: Ejemplos cp


Comando
cp archivol archivo2

cp -i archivol archivo2
cp archivol archivo2 dirl
dirl cp / * dir2

Resultados
Copie archivo1 a archivo2. Si existe archivo2, se sobrescribe
con el contenido de archivol. Si archivo2 no existe, se crea.

Igual que el anterior, excepto que si existe archivo2, se


solicita al usuario antes de que se sobrescribe.
Copie archivo1 archivo2 y en el directorio dir1. dir1 ya
debe existir.
El uso de un comodn, todos los archivos se copian en
dir1 dir2. dir2 ya debe existir.

29

4 - La manipulacin de archivos y directorios


cp -r dirl dir2

Copie el contenido del directorio dirl al directorio


dir2. Si dir2 directorio no existe, se crea y, despus de la
copia, contendr el mismo contenido que el directorio
dirl.
Si no existe el directorio dir2, entonces dirl directorio (y
sus contenidos) se copiarn en dir2.

mv - Mover y renombrar archivos


El comando mv realiza tanto archivo de movimiento y cambiar el nombre de archivo,
dependiendo de cmo se utiliza. En cualquier caso, el nombre de archivo original ya no existe
mv itemi
elemento2

elemento mv ...
directorio
despus de la operacin. mv se utiliza en la misma forma como cp:
mover o cambiar el nombre de archivo o directorio "itemi" a "elemento2" o:
para mover uno o ms objetos de un directorio a otro.

Opciones tiles y ejemplos


acciones mv muchas de las mismas opciones que cp:
Tabla 4-6: Opciones mv

Opcin
-i, --interactive

-u, --update

-v, --verbose
30

Significado
Antes de sobrescribir un archivo existente, pedir
confirmacin al usuario. Si no se especifica esta opcin, se
mv silencio sobrescribir archivos.
Al mover archivos de un directorio a otro, slo mover
archivos que o bien no existen, o son ms recientes que los
archivos correspondientes existentes en el directorio de
destino.
Mostrar mensajes informativos como el movimiento es

mv - Mover y renombrar archivos

elemento
rm ...

realizado.

Tabla 4-7: Ejemplos mv

Comando
archivo2 mv archivol

mv -i archivol archivo2

Resultados
Mueva archivo1 a archivo2. Si existe archivo2, se sobrescribe
con el contenido de archivol. Si archivo2 no existe, se crea. En
cualquier caso, archivol deja de existir.
Igual que el anterior, excepto que si existe archivo2, se
solicita al usuario antes de que se sobrescribe.

mv archivol archivo2 dirl


mv dirl dir2

Mueva archivo1 archivo2 y en el directorio dir1. dir1 ya


debe existir.
Si dir2 directorio no existe, crear el directorio dir2 y
mover el contenido del directorio dir1 en dir2 y borrar
directorio dir1.
Si no existe el directorio dir2, mover dir1 directorio (y
sus contenidos) en el directorio dir2.

rm - Quitar los archivos y directorios

El comando rm se utiliza para eliminar (borrar) los archivos y directorios:

donde "elemento" es uno o ms archivos o directorios.

Opciones tiles y ejemplos


Estas son algunas de las opciones comunes para rm:
Tabla 4-8: Opciones rm

Opcin
Significado
-i, --interactive Antes de borrar un archivo existente, solicitar al usuario
confirmacin. Si no se especifica esta opcin, rm
silenciosamente eliminar archivos.
31

4 - La manipulacin de archivos y directorios


-r, --recursive
Recursivamente borrar directorios. Esto significa que si se
elimina un directorio tiene subdirectorios, eliminarlos
tambin. Para borrar un directorio, esta opcin se debe
especificar.
-f, --force
Ignorar archivos inexistentes y no se pedir. Esto anula la
opcin - -interactive.
-v, --verbose
Mostrar mensajes informativos como se lleva a cabo la
eliminacin.

Tabla 4-9: Ejemplos rm


Comando
archivol rm
rm -i archivol

rm -r archivol dirl
rm -rf archivol dirl

Resultados
Eliminar archivol silencio.
Igual que el anterior, excepto que se solicita al usuario
que confirme antes de realizar la eliminacin.
Eliminar archivol y dirl y su contenido.
Igual que el anterior, excepto que si bien archivol o dirl
no existen, rm continuar en silencio.

Tenga cuidado con


rm!
Sistemas operativos tipo Unix como Linux no tienen un comando de recuperar. Una
vez que se elimina algo con rm, que se ha ido. Linux asume que eres inteligente y
sabes lo que ests haciendo.
Tenga especial cuidado con comodines. Considere este ejemplo clsico. Digamos que
usted quiere eliminar slo los archivos HTML en un directorio. Para ello, escriba: rm *
.html
que es correcta, pero si se coloca accidentalmente un espacio entre el "*" y el ".html",
as: rm * .html
el comando rm eliminar todos los archivos del directorio y luego se quejan de que no
hay un archivo llamado ".html".
He aqu un consejo til. Siempre que utilice los comodines con rm (adems de
una revisin cuidadosa de su escritura!), Probar el comodn primero con ls. Esto
le permitir ver el

32

archivos que se eliminarn. A continuacin, pulse la tecla de flecha hacia arriba para
recuperar el comando y vuelva a colocar los ls con rm.
rm - Quitar los archivos y directorios

ln - Crear enlaces
El comando ln se utiliza para crear vnculos, ya sea duro o simblicos. Se utiliza en una de dos

vnculo de
archivo ln

enlace elemento
ln -s
maneras:
para crear un enlace duro, y:
para crear un enlace simblico donde "elemento" es un archivo o un directorio.

Enlaces duros
Los enlaces duros son la manera original de Unix de crear vnculos, en comparacin con los
enlaces simblicos, que son ms modernos. De forma predeterminada, cada archivo tiene un
nico vnculo fsico que da el archivo su nombre. Cuando creamos un vnculo fsico, creamos
una entrada de directorio adicional para un archivo. Los enlaces duros tienen dos limitaciones
importantes:
1. Un enlace duro no puede hacer referencia a un archivo fuera de su propio sistema de
archivos. Esto significa que un enlace no puede hacer referencia a un archivo que no
est en la misma particin de disco como el propio enlace.
2. Un enlace duro no puede hacer referencia a un directorio.
Un enlace duro es indistinguible de la del propio archivo. A diferencia de un enlace simblico,
cuando la lista de un directorio que contiene un enlace duro ver ninguna indicacin especial
del enlace. Cuando se elimina un enlace duro, se quita el enlace, pero se borran los contenidos
del archivo en s siguen existiendo (es decir, su espacio no se desasigna) hasta que todos los
vnculos al archivo.
Es importante ser consciente de los vnculos fsicos, ya que podra encontrarse con ellos de vez
en cuando, pero la prctica moderna prefiere enlaces simblicos, que vamos a cubrir la
prxima.

Enlaces simblicos
Los enlaces simblicos se crearon para superar las limitaciones de los enlaces duros. Los
enlaces simblicos de trabajo mediante la creacin de un tipo especial de archivo que contiene
un puntero de texto al archivo o referencia
33

4 - La manipulacin de archivos y directorios directorio. En este sentido, funcionan casi de la


misma manera que un acceso directo de Windows aunque, por supuesto, que son anteriores a
la caracterstica de Windows por muchos aos;-)
Un archivo al que apunta un enlace simblico, y el propio enlace simblico son en gran
medida indistinguibles el uno del otro. Por ejemplo, si escribes algo al enlace simblico, el
archivo de referencia se escribe. Sin embargo, cuando se elimina un enlace simblico, slo se
elimina el enlace, no el archivo en s. Si el archivo se elimina antes de que el enlace simblico,
el enlace seguir existiendo, pero apuntar a nada. En este caso, se dice que el enlace no estar
funcionando. En muchas implementaciones, el comando ls mostrar enlaces rotos en un color
distintivo, como el rojo, para revelar su presencia.
El concepto de vnculos puede parecer muy confuso, pero colgar en l. Vamos a tratar de
todas estas cosas y ser, con suerte, claro.

Vamos a construir una Zona de juegos


Dado que vamos a hacer un poco de manipulacin de archivos reales, vamos a construir un
lugar seguro para "jugar" con nuestros comandos de manipulacin de archivos. En primer
lugar necesitamos un directorio para trabajar. Vamos a crear una en nuestro directorio home y
lo llamamos "patio de recreo".

[Me @ linuxbox ~] $ cd [me @ linuxbox ~] $


mkdir parque infantil

Creacin de directorios
El comando mkdir se utiliza para crear un directorio. Para crear nuestro directorio patio que
primero se asegurar de que estamos en nuestro directorio home y crear el nuevo directorio:

[Me @ linuxbox ~] patio $ cd [me @ patio linuxbox] $


mkdir dirl dir2
Para hacer que nuestro parque un poco ms interesante, vamos a crear un par de directorios
dentro de l denomina "dirl" y "dir2". Para ello, vamos a cambiar nuestro directorio de trabajo
actual de parque infantil y ejecutar otro mkdir:
Observe que el comando mkdir aceptar mltiples argumentos que nos permite crear dos
directorios con un solo comando.

Copia de archivos
A continuacin, vamos a obtener algunos datos en nuestro patio de recreo. Haremos esto
mediante la copia de un archivo. Uso de la 34

__________________________________________________________ Vamos a construir una


Zona de juegos
comando cp, vamos a copiar el archivo passwd del directorio / etc al directorio de trabajo
actual:
[Me @ linuxbox parque infantil] $ cp / etc / passwd.
Observe cmo utilizamos la abreviatura de la actual directorio de trabajo, el punto final nico.
As que ahora si realizamos un ls, veremos nuestro archivo:

[Me @ patio linuxbox] $ ls -l total de 12


drwxrwxr-x 2
m m 4096 2008-01-10
drwxrwxr-x 2
m m 4096 2008-01-10
- r w - r - r - - 1 m m 1650 2008-01-10

16:40 dirl
16:40 dir2
16:07 passwd

Ahora, slo por diversin, vamos a repetir la copia mediante la opcin "-v" (detallado) para
ver lo que hace:
[Me @ linuxbox parque infantil] $ cp -v / etc / passwd. '/ Etc
/ passwd' -> './passwd'
El comando cp realiza la copia de nuevo, pero esta vez aparece un mensaje conciso indicando
qu operacin que estaba realizando. Observe que cp sobrescribi la primera copia sin
ninguna advertencia. Una vez ms se trata de un caso de cp asumiendo que sabes lo que ests
haciendo. Para obtener una advertencia, vamos a incluir la opcin "-i" (interactivo):

[Me @ linuxbox parque infantil] $ cp -i / etc / passwd. cp:


sobrescribir './passwd'?
En respuesta a la solicitud mediante la introduccin de una "y" har que el archivo sea
sobrescrito, cualquier otro carcter (por ejemplo, "n") causar cp a dejar el archivo solo.

Mover y renombrar archivos


Ahora, el nombre de "passwd" no parece muy juguetn y esto es un patio de recreo, as que
vamos a cambiar a otra cosa:

[Me @ patio linuxbox] $ diversin passwd mv

35

4 - La manipulacin de archivos y
directorios
Vamos a pasar a la diversin en torno a un poco moviendo nuestro archivo renombrado a
cada uno de los directorios y de vuelta:

[Me @ patio linuxbox] $ mv diversin diri


para moverlo primero al directorio diri,
entonces:
[Me @ patio linuxbox] diri $ mv / dir2 diversin
para moverlo de diri a dir2, a
continuacin:
[Me @ patio linuxbox] $ mv dir2 / diversin.
para finalmente traerlo de vuelta al directorio de trabajo actual. A continuacin, vamos a ver
el efecto de la mv en directorios. En primer lugar vamos a mover nuestro archivo de datos en
dirl de nuevo:
[Me @ patio linuxbox] $ mv diversin diri
a continuacin, pasar dirl en dir2 y confirmarlo con ls:

[Me @ patio linuxbox] $ mv diri dir2 [me @ linuxbox parque


infantil] $ ls -l dir2 total de 4
drwxrwxr-x me 2 me 4096 2008-01-11 06:06 diri [me @ parque
infantil linuxbox] $ ls -l dir2 / diri total de 4
-rw-r - r-- m me 1 1650 2008-01-10 16:33
diversin

Tenga en cuenta que, dado que ya exista dir2, mv traslad dirl en dir2. Si no hubieran
existido dir2, mv habra cambiado el nombre a dirl dir2. Por ltimo, vamos a poner todo de
vuelta:
[Me @ patio linuxbox] $ mv dir2 / diri. [Me @ patio
linuxbox] $ mv diri / diversin.

36

Vamos a construir una Zona de juegos

Crear enlaces duros


Ahora vamos a tratar de algunos enlaces. Primero los enlaces duros. Vamos a crear algunos
enlaces a nuestro archivo de datos, as:
As que ahora tenemos cuatro instancias del archivo "diversin". Echemos un vistazo nuestro
[Me @ linuxboxzona de juegos] $ lndiversindiversin
duro
[Me @ linuxboxzona de juegos] $ lndiversindirl
/
[Me
@ patioduro
linuxbox] $ ls -l total de
diversin
16
[Me @ linuxboxzona de juegos] $ lndiversindir2
/
drwxrwxr-x 2 m
m
4096 2008-01-14 16:17 2008-01-14
diversin duro
drwxrwxr-x 2 m
m
4096 16:17 diri dir2 2008-01-10 16:33
-rw-r - r-- 4 m
m
1650 2008-01-10 16:33 diversin
-rw-r - r-- 4 m
m
1650 divertido duro
directorio parque infantil:
Una cosa que se nota es que el segundo campo en la lista para la diversin y la diversin duro
que ambos contienen un "4", que es el nmero de enlaces duros que existen actualmente para
el archivo. Vas a recordar que un archivo se escapadas tener por lo menos un enlace porque el
nombre del archivo se crea por un enlace. As que, cmo sabemos que la diversin y la
diversin-dura son, de hecho, el mismo archivo? En este caso, ls no es muy til. Si bien
podemos ver que la diversin y la diversin duro son ambos el mismo tamao (campo 5),
nuestro anuncio no proporciona ninguna manera de estar seguro. Para resolver este problema,
vamos a tener que cavar un poco ms profundo.
Al pensar en los vnculos fsicos, es til imaginar que los archivos se componen de dos partes:
la parte de datos que contiene el contenido del archivo y la parte del nombre que tiene el
nombre del archivo. Cuando creamos enlaces duros, en realidad estamos creando piezas de
nombre adicionales que todos se refieren a la misma parte de datos. El sistema asigna una
cadena de bloques de disco a lo que se llama un nodo-i, que se asocia entonces con la parte del
nombre. Por tanto, cada enlace duro se refiere a un inodo especfica que contiene el contenido
del archivo.
El comando ls tiene una manera de revelar esta informacin. Se invoca con la opcin "-i":

[Me @ patio linuxbox] $ ls -li total de 16


12353539 drwxrwxr-x
2 m
m 4096
12353540 drwxrwxr-x
2 m
m 4096
12353538 -rw-r - r-4 m
m 1650
diversin

2008-01-14 16:17 dir1


2008-01-14 16:17 dir2
2008-01-10 16:33

37

4 - La manipulacin de archivos y
directorios
12353538 -rw-r - r-- me 4 me 1650 2008-01-10 16:33-diversin duro
En esta versin de la lista, el primer campo es el nmero de inodo y, como podemos ver, a la
vez divertido y compartir la diversin dura el mismo nmero de inodo, lo que confirma que
son el mismo archivo.

La creacin de enlaces simblicos


Los enlaces simblicos se crearon para superar las desventajas de los dos enlaces duros: Los
enlaces duros no pueden abarcar los dispositivos fsicos y enlaces duros no pueden hacer
referencia a directorios, slo los archivos. Los enlaces simblicos son un tipo especial de
archivo que contiene un puntero de texto para el archivo de destino o el directorio.
La creacin de enlaces simblicos es similar a crear enlaces duros:

[Me @ patio linuxbox] $ ln -s fun fun-sym [me @ patio linuxbox] $ ln


-s ../fun dirl / diversin-sym [me @ patio linuxbox] $ ln -s ../fun dir2
/ diversin -sym
El primer ejemplo es muy sencillo, simplemente aadimos la opcin "-s" para crear un enlace
simblico en lugar de un enlace duro. Pero qu pasa con los dos siguientes? Recuerde,
cuando creamos un enlace simblico, estamos creando una descripcin de texto de que el
archivo de destino es en relacin con el vnculo simblico. Es ms fcil ver si nos fijamos en la
salida de ls:
[Me @ patio linuxbox] $ ls -l dirl total de 4
- r w - r - r - - m 4 m
1650 01/10/2008 16:33 diversin duro
lrwxrwxrwx me 1
m
6 2008-01-15 15:17 divertido-sym -> . . / f u n

La lista para la diversin-sym en dir1 muestra que es un enlace simblico de la "l" que lleva en
el primer campo y que apunte a "../fun", lo cual es correcto. En relacin con la ubicacin de la
diversin-sym, diversin est en el directorio por encima de ella. Observe tambin que la
duracin del archivo de enlace simblico es 6, el nmero de caracteres en el "../fun" cadena en
lugar de la longitud del archivo al que se est apuntando.
Al crear enlaces simblicos, puede utilizar nombres de ruta absolutos:

ln -s / home / me / patio / dirl diversin /


diversin-sym

38

Vamos a construir una Zona de juegos


o rutas relativas, como lo hicimos en nuestro ejemplo anterior. El uso de nombres de ruta
relativos es ms deseable, ya que permite un directorio que contiene enlaces simblicos para
cambiar el nombre y / o se mueve sin romper los vnculos.
Adems de los archivos regulares, enlaces simblicos tambin pueden hacer referencia a
directorios:
[Me @ patio linuxbox] $ ln -s diri dirl-sym [me @ patio
linuxbox] $ ls -l total de 16
drwxrwxr-x 2
lrwxrwxrwx 1
drwxrwxr-x 2
-rw-r - r-- 4
-rw-r - r-- 4
lrwxrwxrwx 1

m
m
m
m
m
m

m
m
m
m
m
m

4096 2008
4 2008
4096 2008
1650 2008
1650 2008
3 2008

01-15 15:17 dir1


01-16 14:45 dir1-sym -> dir1
01-15 15:17 dir2
01-10 16:33 diversin
01-10 16:33 de diversin duro
01-15 15:15 de diversin sym ->
diversin

La eliminacin de archivos y directorios


Como hemos cubierto anteriormente, el comando rm se utiliza para borrar archivos y
directorios. Vamos a usarlo para limpiar nuestro patio de juegos un poco. En primer lugar,
vamos a eliminar uno de nuestros enlaces duros:
[Me @ patio linuxbox] $ rm-diversin duro [me
@ linuxbox parque infantil] $ ls -l total de 12
01-15 15:17 dir1
01-16 14:45 dir1-sym -> dir1
01-15 15:17 dir2
01-10 16:33 diversin
01-15 15:15 de diversin sym ->
diversin
[Me @ linuxbox parque infantil] $ rm rm -i
diversin: eliminar el archivo 'diversin'
regular?
Eso funcion como se esperaba. El archivo se ha ido-diversin duro y el nmero de enlaces se
muestra para la diversin se reduce de cuatro a tres, como se indica en el segundo campo de la
lista de directorios. A continuacin, vamos a borrar el archivo de la diversin, y slo para el
disfrute, vamos a incluir la opcin "-i" para mostrar lo que hace:
Escriba "y" en el indicador y se elimina el archivo. Pero echemos un vistazo a la salida de ls
ahora. Not lo que pas a la diversin-sym? Ya que es un enlace simblico que apunta a un
archivo, ahora inexistente, se romper el vnculo:
drwxrwxr-x 2
lrwxrwxrwx 1
drwxrwxr-x 2
-rw-r - r-- 3
lrwxrwxrwx 1

m
m
m
m
m

m
m
m
m
m

4096 2008
4 2008
4096 2008
1650 2008
3 2008

39

4 - La manipulacin de archivos y directorios


La mayora de las distribuciones Linux configuran ls para visualizar los enlaces rotos. En un
[Me @ patio linuxbox] $ ls -l total de 8
drwxrwxr-x 2
m m
lrwxrwxrwx 1
m m
4096 01/15/2008
15:17 dir1
drwxrwxr-x 2
m m
4 2008-01-16
14:45 dir1-sym -> dir1
lrwxrwxrwx
1 linuxbox]
m $
mmenos
4096
01/15/2008
15:17 dir2
[Me @ patio
divertido-sim-sim
3 2008-01-15
15:15 diversin-sym
->
diversin: No existe el fichero o directorio
diversin
cuadro de Fedora, enlaces rotos se muestran en texto parpadeante de color rojo! La presencia
de un enlace roto no es, en s mismo peligroso, pero es ms bien desordenado. Si tratamos de
utilizar un enlace roto veremos esto:
Vamos a limpiar un poco. Vamos a eliminar los vnculos simblicos:
Una cosa para recordar acerca de los enlaces simblicos es que la mayora de las operaciones
[Me @ patio linuxbox] $ rm diversin-sym sym-dirl [me @
patio linuxbox] $ ls -l total de 8
drwxrwxr-x 2 me
m
4096 01/15/2008 15:17 dir1
drwxrwxr-x 2 me
m
4096 01/15/2008 15:17 dir2
de archivo se llevan a cabo en el objetivo del enlace, no el propio enlace. rm es una excepcin.
Cuando se elimina un eslabn, que es el vnculo que se elimina, no el objetivo.
Por ltimo, vamos a retirar nuestro patio de recreo. Para ello, vamos a volver a nuestro
directorio home y usar rm con la opcin recursiva (-r) para borrar parque infantil y todos sus
contenidos, incluidos sus subdirectorios:
[Me @ linuxbox parque infantil] $ cd [me @
linuxbox ~] $ rm -r parque infantil

La creacin de enlaces simblicos con la GUI


Los administradores de archivos en GNOME y KDE proporcionan un mtodo fcil y
automtica de la creacin de enlaces simblicos. Con GNOME, la celebracin de las
teclas Shift + Ctrl
40

mientras arrastra un archivo se crear un enlace en lugar de copiar (o mover) el


archivo. En KDE, un pequeo men aparece siempre que se deja caer un archivo, que
ofrece una opcin de copiar, mover o vincular el archivo.
Vamos a construir una Zona de juegos

Resumiendo
Hemos cubierto mucho terreno aqu y va a tomar un tiempo para hundirse completamente en.
Realizar el ejercicio parque infantil y otra vez hasta que tiene sentido. Es importante obtener
una buena comprensin de los comandos bsicos de manipulacin de archivos y comodines.
No dude en ampliar el ejercicio parque aadiendo ms archivos y directorios, utilizando
comodines para especificar archivos para diversas operaciones. El concepto de enlaces es un
poco confuso al principio, pero se toma el tiempo para aprender cmo funcionan. Ellos
pueden ser un verdadero salvavidas.

Lectura adicional
Una discusin de los enlaces simblicos: enlace http://en.wikipedia.org/wiki/Symbolic

41

5 - Trabajar con los comandos

5 - Trabajar con los comandos


Hasta este punto, hemos visto una serie de rdenes misteriosas, cada uno con sus propias
opciones de misteriosas y argumentos. En este captulo, vamos a tratar de quitar un poco de
ese misterio e incluso crear algunos de nuestros propios comandos. Los comandos
introducidos en este captulo son:

t i p o - Indique cmo se interpreta un nombre de comando

q u e - Display que se ejecutar el programa ejecutable

a y u d a r - Obtenga ayuda para rdenes internas del shell

hombre - Visualizar la pgina del manual de un comando

a p r o p s i t o - Mostrar una lista de comandos apropiados

i n f o - Mostrar la informacin de entrada de un comando

w h a t i s - Mostrar una muy breve descripcin de un comando

a l i a s - Crear un alias de un comando

Qu son exactamente los comandos?


Un comando puede ser una de cuatro cosas diferentes:
1. Un programa ejecutable como todos aquellos archivos que vimos en / usr / bin.
Dentro de esta categora, los programas pueden ser compilados binarios, tales como
los programas escritos en C y C ++, o programas escritos en lenguajes de script como
shell, Perl, Python, Ruby, etc.
2. Un comando integrado en el propio depsito . Bash es compatible con una
serie de comandos llamados internamente rdenes internas del shell. El comando cd,
por ejemplo, es una orden interna del shell.
3. Una funcin de shell. Estos son secuencias de comandos shell en miniatura
incorporados en el medio ambiente. Nosotros cubriremos la configuracin del medio
ambiente y la escritura de funciones de shell en captulos posteriores, pero por ahora,
acaba de ser conscientes de que existen.
4. Un alias. Los comandos que podemos definir nosotros mismos, construidos a partir
de otros comandos.

42

La identificacin de los
comandos

La identificacin de los comandos


A menudo es til saber exactamente cul de los cuatro tipos de comandos se utiliza y Linux
ofrece un par de formas de averiguarlo.

Tipo - Muestra el tipo de un comando


El comando tipo es una orden interna del shell que muestra el tipo de comando de la shell se
ejecutar, dado un nombre de comando en particular. Funciona as:

escriba
command
donde "comando" es el nombre del comando que desea examinar. He aqu algunos ejemplos:

[Me @ linuxbox ~] $ tipo tipo tipo es una


orden interna del shell [me @ linuxbox ~] $
ls tipo es alias de 'ls -color = tty' [me @
linuxbox ~] Tipo de $ cp cp es / bin / cp

Aqu vemos los resultados para tres comandos diferentes. Tenga en cuenta que el de ls
(tomado de un sistema Fedora) y cmo el comando ls es en realidad un alias para el comando
ls con la "- color = tty" opcin aaden. Ahora sabemos por qu la salida de ls se muestra en
color!

que - Ubicacin de la pantalla de un ejecutable


A veces hay ms de una versin de un programa ejecutable instalado en un sistema. Si bien
esto no es muy comn en los sistemas de escritorio, no es inusual en los grandes servidores.
Para determinar la ubicacin exacta de un ejecutable dado, el cual se utiliza el comando:

[me @ linuxbox ~] $ que ls / bin /


ls
que slo funciona para los programas ejecutables, no rdenes internas ni
alias que son sustitutos de los programas ejecutables reales. Cuando
tratamos de utilizar que en una orden interna del shell, por ejemplo, cd,
ya sea que obtenemos ninguna respuesta o un mensaje de error:
43

5 - Trabajar con comandos


[Me @ linuxbox ~] $ cd que
/ Usr / bin / que: ningn CD en (/opt/jre1.6.0_03/bin:/usr/lib/qt3,3 / bin: / usr / kerberos / bin: /opt/jre1.6.0_03/bin: / usr / lib / ccache: / usr / l
vecinal / bin: / usr / bin: / bin: / home / me / bin)
que es una forma elegante de decir "comando no
encontrado".

Obtencin de documentacin de un comando


Con este conocimiento de lo que es un comando, ahora podemos buscar la documentacin
disponible para cada tipo de comando.

ayuda - Obtener Ayuda Para Shell elementos includos


Bash tiene un centro de ayuda integrada disponible para cada una de las
rdenes internas del shell. Para utilizarlo, escriba "help" seguido por el
nombre de la orden interna del shell. Por ejemplo:
[Me @ linuxbox ~] $ cd cd ayuda: cd [-L | [-P [-e]]] [dir]
Cambie el directorio de trabajo del shell.
Cambie el directorio actual a DIR. El DIR predeterminado es el valor de la variable HOME
cscara.
El CDPATH variable define la ruta de bsqueda para el directorio que contiene DIR.
Nombres de directorios alternativos en CDPATH estn separados por dos puntos (:). Un
nombre de directorio nula es el mismo que el directorio actual. Si DIR comienza con una
barra (/), entonces no se utiliza CDPATH.
Si el directorio no se encuentra, y '' cdable_vars la opcin del shell se establece, la palabra
se supone que es un nombre de variable. Si esa variable tiene un valor, su valor se utiliza
para DIR.
Opciones:
-L Forzar enlaces simblicos a seguir
-P Utilizar la estructura de directorios fsica sin seguir enlaces simblicos
-e si la opcin -P se suministra, y el directorio de trabajo actual no se puede determinar con
xito, salir con un estado distinto de cero
El valor por defecto es seguir enlaces simblicos, como si se especifica '-L'.
Salir Estado:
Devuelve 0 si se cambia el directorio, y si $ PWD se establece con xito cuando se utiliza
-P; no cero en caso contrario.

44

Obtencin de documentacin de un comando

Una nota sobre la notacin: Cuando corchetes aparecen en la descripcin de la sintaxis de


un comando, que indican elementos opcionales. Un carcter de barra vertical indica elementos
mutuamente excluyentes. En el caso del comando cd arriba:
cd [-L | [-P [-e]]] [dir]
Esta notacin dice que el comando cd puede estar seguido opcionalmente por cualquiera de
una "L" o una "P" y, adems, si la opcin "-P" se especifica la opcin "-e" puede tambin ser
incluido seguido por la opcional argumento "dir".
Mientras que la salida de la ayuda para el cd comandos es concisa y exacta, es de ningn
modo Tutorial y como podemos ver, tambin parece hablar de un montn de cosas que no
hemos hablado todava! No te preocupes. Vamos a llegar all.

--help - Pantalla de informacin de uso


Muchos programas ejecutables apoyan una opcin "--help" que muestra una descripcin de la
sintaxis y las opciones con el apoyo del comando. Por ejemplo:
Algunos programas no son compatibles con la opcin "--help", pero tratan de todos modos. A
[Me @ linuxbox ~] $ mkdir --help Uso: mkdir [OPCIN] DIRECTORIO ...
Crear el directorio (es), si es que an no existen.
-Z, --context = Contexto de seguridad CONTEXTO (SELinux) conjunto con el
contexto argumentos obligatorios para las opciones largas son obligatorios para las
opciones cortas tambin.
-m, --mode = -p
modo de archivo de conjunto (como en chmod), no a = rwx MODO, --parents
umask ningn error si existente, hacer directorios padre, segn
sea necesario
-v, --verbose --help
imprimir un mensaje para cada directorio creado
--version
mostrar esta ayuda y salir
salida de informacin de la versin y salir

Informe de errores a <bug-coreutils@gnu.org>.


menudo resulta en un mensaje de error que revelar la misma informacin de uso.

hombre - Muestra el Manual del Programa Una Pgina


La mayora de los programas ejecutables para uso de lnea de comandos proporcionan una
pieza formal de documentacin llamado una pgina de manual o de origen humano. Un
programa especial llamado hombre de paginacin se utiliza para verlas. Se usa as:

45

programa
man
5 - Trabajar con los comandos
donde "programa" es el nombre del comando para ver.
Las pginas man varan un poco en el formato, pero generalmente contienen un ttulo, un
resumen de la com - sintaxis del comando, una descripcin del propsito de la orden, y una
lista y descripcin de cada una de las opciones del comando. Las pginas man, sin embargo,
[me @ linuxbox ~] $ man ls
no suelen incluir ejemplos, y pretenden ser una referencia, no un tutorial. Como ejemplo,
vamos a intentar ver la pgina del manual para el comando ls:
En la mayora de los sistemas Linux, el hombre utiliza menos para mostrar la pgina de
manual, por lo que todos los familiares menos comandos funcionan mientras se visualiza la
pgina.
Los "manuales" que el hombre muestra se divide en secciones y no slo abarca los comandos
del usuario, sino tambin los comandos de administracin de sistemas, interfaces de
programacin, formatos de archivos y mucho ms. La siguiente tabla describe el diseo del
manual:
Tabla 5-1: Hombre Organizacin Pgina

Secci
n
1

Contenido
Los comandos de usuario

Interfaces de programacin de las llamadas al sistema del kernel

Programacin de interfaces para la biblioteca C

4
5

Archivos especiales, como los nodos y los controladores de dispositivos


Formatos de archivo

6
7

Juegos y entretenimientos tales como protectores de pantalla

Miscelneo
Comandos de administracin del sistema

A veces tenemos que mirar en una seccin especfica del manual para encontrar lo que
estamos buscando. Esto es particularmente cierto si estamos buscando un formato de archivo
que es tambin el nombre de un comando. Sin especificar un nmero de seccin, siempre
vamos a obtener la primera instancia de un partido, probablemente en el apartado 1. Para
especificar un nmero de seccin, utilizamos hombre como este: 46

Obtencin de documentacin de un
comando

seccin de hombre
SEARCH_TERM
Por ejemplo:

[Me @ linuxbox ~] $ man 5 passwd


Esto mostrar la pgina del manual que describe el formato de archivo del archivo / etc
/ passwd.

a propsito - Mostrar comandos apropiados


Tambin es posible buscar la lista de pginas de manual para posibles coincidencias sobre la
base de un trmino de bsqueda. Es muy crudo pero a veces til. He aqu un ejemplo de una
bsqueda de pginas man utilizando el trmino de bsqueda "floppy":

~] $ A
[Me @ linuxbox
propsito flexible
create_floppy_devices (8)
- Llamada udev para crear todo posible dispositivo de
disco flexible en funcin del tipo CMOS
fdformat
(8)
- Bajo nivel de formato a un disquete
flexible
(8)
- discos de formato de disquete
gfloppy
(1)
- Un formateador de disquetes simple para GNOME
mbadblocks
(1)
- Pruebas de un disquete, y marca los bloques daados
en la FAT
mformat
(1)
- Aadir un sistema de archivos MS-DOS en un disquete
formateado de bajo nivel
El primer campo de cada lnea de la salida es el nombre de la pgina de manual, el segundo
campo muestra la seccin. Tenga en cuenta que el comando man con la opcin "-k" realiza la
misma funcin exacta como a propsito.

whatis - Muestra una descripcin muy breve de un comando


El programa whatis muestra el nombre y una descripcin de una lnea de
una pgina del manual de juego una palabra clave especificada:

[Me @ linuxbox ~] $ ls whatis


ls
(1)

- contenido del directorio lista

47

5 - Trabajar con comandos

El hombre ms Brutal Pgina de todos ellos


Como hemos visto, las pginas de manual suministrado con Linux y otros sistemas
Unix estn concebidos como documentacin de referencia y no como tutoriales.
Muchas pginas de manual son difciles de leer, pero creo que el gran premio de
dificultad tiene que ir a la pgina del manual de bash. Como yo estaba haciendo mi
investigacin para este libro, se lo di revisin cuidadosa para asegurarse de que estaba
cubriendo la mayor parte de sus temas. Cuando se imprime, es ms de 80 pginas de
largo y extremadamente densa, y su estructura no tiene ningn sentido para un nuevo
usuario.
Por otro lado, es muy precisa y concisa, as como ser extremadamente completa. As
que chale un vistazo si te atreves y esperamos el da en que usted puede leerlo y todo
tiene sentido.

info - Muestra la informacin de entrada de un programa de


El proyecto GNU proporciona una alternativa a las pginas de manual para sus programas,
llamada "informacin." Info pginas se muestran con un programa lector llamado, muy
apropiadamente, informacin. Info pginas son hipervnculos al igual que las pginas web.
He aqu una muestra:
Archivo: coreutils.info, Node: ls invocacin, Siguiente: invocacin dir, Up: lista
Directorio

10.1 'ls': Lista el contenido del directorio

El programa 'ls' contiene informacin sobre los archivos (de cualquier tipo, incluyendo
directorios). Opciones y argumentos de archivo se pueden mezclar de manera arbitraria,
como de costumbre.

Para que no sean opciones argumentos de lnea de comandos que son directorios,
listas predeterminadas por 'ls' el contenido de los directorios, no de forma recursiva y
archivos omitiendo con nombres que comienzan con '.'. Para otros argumentos que no
sean opciones, por listas predeterminadas 'ls' slo el nombre de archivo. Si no se
especifica ningn argumento que no es opcin, 'ls' opera en el directorio actual, actuando
como si hubiera sido invocada con un solo argumento de '.'.

48

Obtencin de documentacin de un comando


El programa info lee archivos de informacin, que son rbol estructurado en nodos
Por defecto, la salida est ordenada alfabticamente, de acuerdo con la
--zz-Info: (coreutils.info.gz) ls invocacin, 63 lneas --Top
individuales, cada uno contiene un solo tema. Ficheros Info contienen hipervnculos que le
puede pasar de un nodo a otro. Un hipervnculo puede ser identificado por su asterisco lder, y
se activa al colocar el cursor sobre ella y pulsando la tecla Intro.
Para invocar informacin, escriba "informacin", seguido opcionalmente por el nombre de un
programa. A continuacin se muestra una tabla de comandos que se utilizan para controlar el
lector mientras se muestra una pgina de informacin:
Tabla 5-2: Comandos info

Comando
?

Accin
Mandato Visualizar ayuda

Re Pg o Retroceso

Visualizar la pgina anterior

AvPg o Espacio

Visualizar la pgina siguiente

Siguiente - Muestra el siguiente nodo

p
u

Anterior - Mostrar el nodo anterior

Entrar

Siga el hipervnculo en la posicin del cursor

Dejar de

Up - Muestra el nodo padre del nodo que se muestra


actualmente, por lo general un men.

La mayora de los programas de lnea de comandos que hemos discutido hasta ahora son
parte del paquete "coreutils" del Proyecto GNU, por lo que escribir:
[Me @ linuxbox ~] $
Informacin

coreutils

se mostrar una pgina de men con enlaces a cada programa que figura en el paquete
coreutils.

README y otros archivos de documentacin del programa


Muchos paquetes de software instalados en el sistema de archivos de documentacin tienen
que residen en el directorio / usr / share / doc. La mayora de stos se almacenan en formato
de texto sin formato y lata

49

5 - Trabajar con comandos


ser visto con menos. Algunos de los archivos estn en formato HTML y se pueden ver con un
navegador web. Podemos encontrar algunos archivos que terminan con la extensin ".gz".
Esto indica que se han comprimido con el programa de compresin gzip. El paquete gzip
incluye una versin especial del menor llamado zless que mostrar el contenido de archivos
de texto comprimido gzip-.

Crear sus propios comandos con alias


Ahora, para nuestra primera experiencia con la programacin! Vamos a crear un comando de
nuestro propio utilizando el comando alias. Pero antes de empezar, tenemos que revelar una
pequea lnea de comandos truco. Es posible poner ms de un comando en una lnea
separando cada comando con un carcter de punto y coma. Funciona as:

commandl; comando2; command3 ...

Aqu est el ejemplo vamos a utilizar:


[Me @ linuxbox ~] $ Cd / usr; ls; CD
juegos bin
kerberos lib64
etc incluyen
libexec lib
/ Home / me
[Me @ linuxbox ~] $

_
tmp compartido local
sbin src

Como podemos ver, hemos combinado tres comandos en una sola lnea. Primero cambiamos
el directorio / usr entonces la lista del directorio y, finalmente, volver al directorio original
(mediante el uso de 'CD -') por lo que terminamos donde empezamos. Ahora pasemos esta
secuencia en un nuevo comando utilizando alias. Lo primero que tenemos que hacer es soar
un nombre para nuestro nuevo comando. Vamos a tratar de "prueba". Antes de hacer eso,
sera una buena idea para saber si ya se est utilizando el nombre de "prueba". Para
averiguarlo, podemos utilizar el comando de nuevo tipo:
[Me @ linuxbox ~] test test $ type
es una orden interna del shell
Huy! El nombre de "prueba" ya est en uso. Vamos a
tratar de "foo":
[Me @ linuxbox ~] $ foo tipo
bash: Tipo: foo: No encontrado

50

Crear sus propios comandos con alias


Genial! "Foo" no se toma. As que vamos a crear
nuestro alias:
[Me @ linuxbox ~] $ alias foo '= cd / usr; ls; cd - '
Observe la estructura de este comando:

nombre de alias =
'cadena'
Despus de que el "alias" de comandos que le damos un nombre de alias seguido
inmediatamente (sin espacio en blanco permitido) por un signo igual, seguido
inmediatamente por una cadena entre comillas que contiene el significado que se asignar al
nombre. Despus definimos nuestros alias, se puede utilizar en cualquier lugar de la cscara
esperara un comando. Vamos a intentarlo:
[Me @ linuxbox ~] $ Foo
juegos bin
kerberos
etc incluyen
lib
/ Home / me
[Me @ linuxbox ~] $

lib64
libexec

tmp compartido local


sbin src

Tambin podemos utilizar el comando tipo de nuevo para ver nuestras alias:

[Me @ linuxbox ~] $ tipo foo


foo es un alias para cd / usr; ls; cd - '
Para eliminar un alias, se utiliza el comando unalias, as:

[Me @ linuxbox ~] $ foo unalias [me


@ linuxbox ~] $ foo tipo bash: Tipo:
foo: No encontrado
Aunque hemos evitado deliberadamente nombrar nuestro alias con un nombre de la orden
existente, no es raro que lo haga. Esto se hace a menudo para aplicar una opcin comnmente
deseado para cada invocacin de un comando comn. Por ejemplo, hemos visto cmo el
comando ls es a menudo un alias para aadir soporte de color:

51

[Me @ linuxbox ~] $ alias alias l. = 'Ls -d.


* --color
= Tty' alias
'ls -l --color = tty'
[me
@ linuxbox
~] $llls=tipo
LS
eslsalias
'ls -color
alias
= 'ls de
-color
= tty' = tty'
5 - Trabajar con los comandos
Para ver todos los alias definidos en el medio ambiente, utilice el comando alias sin
argumentos. stos son algunos de los alias definidos de forma predeterminada en un sistema
Fedora. Tratar de averiguar lo que todos hacen:
Hay un pequeo problema con la definicin de alias en la lnea de comandos. Ellos
desaparecen cuando finaliza su sesin de shell. En un captulo posterior, veremos cmo
aadir nuestros propios alias para los archivos que establecen el medio ambiente cada vez que
inicia la sesin, pero por ahora, disfrutar el hecho de que hemos dado nuestro primer, aunque
pequeo, paso en el mundo de la cscara la programacin!

Resumiendo
Ahora que ya hemos aprendido cmo encontrar la documentacin de comandos, vaya y vea la
documentacin para todos los comandos que hemos encontrado hasta ahora. Estudiar qu
opciones adicionales estn disponibles y probarlos!

Lectura adicional
Hay muchas fuentes en lnea de documentacin para Linux y la lnea de comandos. stos son
algunos de los mejores:

52

El Manual de Referencia de Bash es una gua de referencia para el shell bash. Sigue
siendo una obra de referencia, pero contiene ejemplos y es ms fcil de leer que la
pgina
de
manual
de
bash.
http://www.gnu.org/software/bash/manual/bashref.html

El Bash FAQ contiene respuestas a las preguntas ms frecuentes en relacin con bash.
Esta lista tiene como objetivo intermedio para usuarios avanzados, pero contiene una
gran cantidad de buena informacin.
http://mywiki.wooledge.org/BashFAQ

El proyecto GNU proporciona una extensa documentacin de sus programas, que


forman el ncleo de la experiencia de la lnea de comandos de Linux. Usted puede ver
una lista completa aqu: http://www.gnu.org/manual/manual.html

Wikipedia tiene un artculo interesante sobre pginas de manual:


http://en.wikipedia.org/wiki/Man pgina

6 Redireccin

- Redireccin

En esta leccin vamos a dar rienda suelta a lo que puede ser la mejor caracterstica de la lnea
de comandos. Se llama redireccin de E / S. El "I / O" significa de entrada / salida y con esta
instalacin se puede redirigir la entrada y la salida de los comandos hacia y desde archivos,
as como conectar varios comandos juntos en potentes tuberas de mando. Para mostrar esta
instalacin, vamos a introducir los siguientes comandos:

gato - Concatenar archivos

c l a s e - Ordenar las lneas de texto

U n i q - Informe o omitir lneas repetidas

g r e p - Lneas de impresin que coincidan con un patrn

wc - de nueva lnea de impresin, palabra, y los recuentos de bytes para cada archivo

c a b e z a - Salida de la primera parte de un archivo

c o l a - Salida de la ltima parte de un archivo

tee - Leer de la entrada estndar y escribir en la salida estndar y archivos

Estndar de entrada, salida y error


Muchos de los programas que hemos utilizado hasta ahora producir una salida de algn tipo.
Esta salida se compone a menudo de dos tipos. En primer lugar, tenemos los resultados del
programa; es decir, los datos que el programa est diseado para producir, y en segundo
lugar, tenemos los mensajes de estado y de error que nos dicen cmo el programa est
recibiendo a lo largo. Si nos fijamos en un comando como ls, podemos ver que muestra sus
resultados y sus mensajes de error en la pantalla.
Siguiendo con el tema de Unix de "todo es un archivo," programas como ls envan realmente
sus resultados a un archivo especial denominado salida estndar (a menudo expresada como
la salida estndar) y sus mensajes de estado a otro archivo llamado error estndar (stderr). Por
defecto, tanto en la salida estndar y el error estndar estn vinculados a la pantalla y no se
guardan en un archivo de disco.
Adems, muchos programas tienen entrada de un centro de llamadas de entrada estndar
(stdin), que es, por defecto, atado al teclado.

53

6 - redireccin
E / S de redireccin permite que cambiemos donde la produccin va y de donde viene la
entrada de. Normalmente, la produccin va a la pantalla de entrada y viene desde el teclado,
pero con E / S de la redireccin, podemos cambiar eso.

Redireccin de la salida estndar


E / S redireccin nos permite redefinir donde la salida estndar pasa. Para redirigir la salida
estndar a otro archivo en lugar de la pantalla, se utiliza el ">" operador de redireccin
seguido del nombre del archivo. Por qu querramos hacer esto? A menudo es til para
almacenar la salida de un comando en un archivo. Por ejemplo, podramos decir la cscara
para enviar la salida del comando ls en el fichero de ls-output.txt lugar de la pantalla:

[Me @ linuxbox ~] $ ls -l / usr / bin> ls-output.txt


Aqu, hemos creado un listado largo del directorio / usr / bin, y envi a los resultados en el
fichero de ls-output.txt. Vamos a examinar la salida redirigida del comando:

[Me @ linuxbox ~] $ ls -l ls-output.txt


-rw-rw-r-- 1 me me 167878 2008-02-01 15:07 ls-output.txt
Bueno; un bonito, grande, archivo de texto. Si nos fijamos en el archivo con menos, vamos a
ver que el archivo ls-output.txt efectivamente incluye los resultados de nuestro comando ls:

[Me @ linuxbox ~] $ Menos ls-output.txt


Ahora, vamos a repetir nuestra prueba de redireccin, pero esta vez con un toque. Vamos a
cambiar el nombre del directorio a uno que no existe:

[Me @ linuxbox ~] $ ls -l / bin / usr> ls-output.txt


ls: no se puede acceder / bin / usr: No existe el fichero o directorio
Recibimos un mensaje de error. Esto tiene sentido ya que especificamos la inexistente
directorio / bin / usr, pero por qu fue el mensaje de error aparece en la pantalla en lugar de
ser redirigida al archivo ls-output.txt? La respuesta es que el programa ls no enva sus
mensajes de error en la salida estndar. En lugar de ello, al igual que los programas de Unix
ms bien escritos, que enva sus mensajes de error al error estndar. Ya que slo redirige la
salida estndar y el error no estndar, el mensaje de error an se enva a la pantalla. Vamos a
ver cmo
54

_______________________________________________________Redireccin
estndar

de

la

salida

para redirigir el error estndar en un minuto, pero en primer lugar, echemos un vistazo a lo
que ocurri en nuestro archivo de salida:
[Me @ linuxbox ~] $ ls -l ls-output.txt
-rw-rw-r-- m me 1 0 2008-02-01 15:08 ls-output.txt
El archivo ahora tiene longitud cero! Esto se debe a que, cuando nos redirigir la salida con el
">" operador de redireccin, el archivo de destino est siempre reescrito desde el principio.
Desde nuestro comando ls genera ningn resultado y slo un mensaje de error, la operacin
de redireccin comenz a reescribir el archivo y luego se detuvo a causa del error, lo que
resulta en su truncamiento. De hecho, si alguna vez necesitamos para truncar en realidad un
archivo (o crear un archivo nuevo, vaco) podemos utilizar un truco como esto:

[Me @ linuxbox ~] $> ls-output.txt


Simplemente usando el operador de redireccin sin comando anterior se truncar un archivo
existente o crear un archivo nuevo, vaco.
As que, cmo podemos anexar redirigido la salida a un archivo en lugar de sobrescribir el
archivo desde el principio? Para ello, utilizamos el ">>" operador de redireccin, as:

[Me @ linuxbox ~] $ ls -l / usr / bin >> ls-output.txt


Utilizando el ">>" operador dar lugar a la salida se anexa al archivo. Si el archivo no existe,
se crea como si se hubiera utilizado el operador ">". Vamos a ponerlo a prueba:

[Me @ linuxbox ~] $ ls -l / Usr / bin


>>
ls-output.txt
[Me @ linuxbox ~] $ ls -l / Usr / bin
>>
ls-output.txt
[Me @ linuxbox ~] $ ls -l / Usr / bin
>>
ls-output.txt
[Me @ linuxbox ~] $ ls -l ls-output.txt
-rw-rw-r--el1 comando
me me 503634
2008-02-01
15:45
ls-output.txt
Repetimos
tres veces
resultando
en un
archivo de salida tres veces ms
grande.

La reorientacin de error estndar


Reorientacin de error estndar carece de la facilidad de un operador de redireccin dedicada.
Para redirigir
55

6 - Error estndar de redireccin que debe referirse a su descriptor de fichero. Un programa

puede producir una salida en cualquiera de varias secuencias de archivo numerados. Si bien
nos hemos referido a los tres primeros de estos flujos de archivos como estndar de entrada,
salida y error, los internamente referencias shell como descriptores de archivo 0, 1 y 2,
[Me @ linuxbox ~] $ ls -l / bin / usr 2> ls-error.txt
respectivamente. El shell proporciona una notacin para la reorientacin de archivos
utilizando el nmero de descriptor de archivo. Desde error estndar es el mismo que el
descriptor de archivo nmero 2, podemos redirigir el error estndar con esta notacin:
El descriptor de archivo "2" se coloca inmediatamente antes de que el operador de redireccin
para llevar a cabo la reorientacin de error estndar para el archivo ls-error.txt.

Redireccin de la salida estndar y el error estndar en un archivo


Hay casos en los que es posible que desee para capturar toda la salida de un comando a un
nico archivo. Para ello, tenemos que redirigir tanto la salida estndar y el error estndar al
[Me @ linuxbox ~] $ ls -l / bin / usr> ls-output.txt 2> & 1
mismo tiempo. Hay dos maneras de hacer esto. En primer lugar, la forma tradicional, que
trabaja con las versiones antiguas de la shell:
Usando este mtodo, realizamos dos redirecciones. En primer lugar, redirigir la salida
estndar al archivo ls-output.txt y luego redirigimos descriptor de archivo 2 (error estndar)
para presentar un descriptor (salida estndar), utilizando la notacin 2> & 1.

Observe que el orden de las redirecciones es significativo. La redireccin de


error estndar siempre debe ser posterior a la reorientacin de la salida estndar o no
funciona. En el ejemplo anterior,
> L s - 0 u t p u t . t x t 2> & 1
redirige error estndar en el fichero de ls-salida.txt, pero si se cambia el orden de 2> & 1
error estndar> ls-salida.txt est dirigida a la pantalla.
Las versiones recientes de fiesta ofrecen un segundo mtodo, ms gil para llevar a cabo este
56

La reorientacin de error
estndar
redireccin
combinado:
[Me @ linuxbox ~] $ ls -l / bin / usr y> ls-output.txt
En este ejemplo, utilizamos la nica notacin y> para redirigir tanto la salida estndar y error
estndar para el archivo ls-output.txt. Tambin puede aadir los flujos de salida y de error
estndar estndar en un solo archivo de este modo:

[Me @ linuxbox ~] $ ls -l / bin / usr y >> ls-output.txt

Cmo deshacerse de la produccin no deseado


A veces "el silencio es oro", y no queremos que la salida de un comando, slo queremos tirarlo
a la basura. Esto se aplica particularmente a error y mensajes de estado. El sistema
proporciona una manera de hacer esto mediante la reorientacin de salida a un archivo
especial llamado "/ dev / null". Este archivo es un dispositivo de sistema llamado un cubo de
bits que acepta la entrada y no hace nada con l. Para suprimir mensajes de error de un
comando, hacemos esto:
[Me @ linuxbox ~] $ ls -l / bin / usr 2> / dev / null

/ Dev / null En Unix Cultura


El cubo de bits es un antiguo concepto de Unix y debido a su universalidad, que ha
aparecido en muchas partes de la cultura Unix. Cuando alguien dice que l / ella est
enviando sus comentarios a / dev / null, que ya sabes lo que significa. Para ms
ejemplos, ver el Artculo de Wikipedia sobre "/ dev / null".

Reorientacin de la entrada estndar


Hasta ahora, no hemos encontrado ningn comando que hacen uso de la entrada estndar (en
realidad tenemos, pero vamos a revelar que sorpresa un poco ms tarde), as que tenemos que
introducir uno.

gato - Concatenar archivos


El comando cat lee uno o ms archivos y los copia en la salida estndar de este modo:
57

6 - redireccin

gato [archivo
...]
En la mayora de los casos, se puede pensar de gato como anloga al comando TYPE de DOS.
Se puede utilizar para mostrar los archivos sin paginacin, por ejemplo:

[Me @ linuxbox ~] $ cat ls-output.txt


se mostrar el contenido del archivo ls-output.txt. gato se utiliza a menudo para mostrar
archivos de texto cortos. Desde gato puede aceptar ms de un archivo como un argumento,
sino que tambin puede ser utilizado para unir archivos juntos. Digamos que hemos
descargado un archivo de gran tamao que se ha dividido en varias partes (archivos
multimedia a menudo se dividen de esta manera en Usenet), y queremos unirnos a ellos de
nuevo juntos. Si se nombraron los archivos:
movie.mpeg.001 movie.mpeg.002 ... movie.mpeg.099
podramos unirlos de nuevo juntos con este comando:

movie.mpeg.0 gato *>


movie.mpeg
Desde comodines siempre se expanden en forma ordenada, los argumentos sern dispuestos
en el orden correcto.
Esto es todo muy bien, pero qu tiene esto que ver con la entrada estndar? Nada todava,
pero vamos a intentar algo ms. Qu sucede si entramos "gato" sin argumentos:

[Me @ linuxbox ~] $ cat


No pasa nada, que slo se sienta all como si estuviera colgado. Puede parecer de esa manera,
pero est realmente haciendo exactamente lo que se supone que.
Si no se da ningn argumento gato, se lee de la entrada estndar, y desde la entrada estndar
es, por defecto, atado al teclado, que est esperando que nosotros escribimos algo! Trate de
aadir el siguiente texto y pulsar Intro:

[Me @ linuxbox ~] $ cat


El rpido zorro marrn salt sobre el perro
perezoso.
A continuacin, escriba un Ctrl-D (o sea, mantenga pulsada la tecla Ctrl y pulse "D") para
contar gato que tiene
58

Reorientacin de la entrada
estndar
final alcanzado de archivo (EOF) en la entrada
estndar:
[Me @ linuxbox ~] $ cat
El rpido zorro marrn salt sobre el perro
perezoso.
El rpido zorro marrn salt sobre el perro perezoso.
A falta de argumentos de nombre de archivo, gato copias de entrada estndar a la salida
estndar, por lo que vemos nuestra lnea de texto repetido. Podemos utilizar este
comportamiento para crear archivos de texto cortos. Digamos que hemos querido crear un
archivo llamado "lazy_dog.txt" que contiene el texto en nuestro ejemplo. Queremos hacer esto:

[Me @ linuxbox ~] $ cat> lazy_dog.txt


El rpido zorro marrn salt sobre el perro
perezoso.
Escriba el comando seguido del texto que queremos en colocar en el archivo. Recuerde que
debe pulsar Ctrl-d al final. Usando la lnea de comandos, hemos implementado procesador de
textos ms tonto del mundo! Para ver nuestros resultados, podemos utilizar el gato para
copiar el archivo a la salida estndar una vez ms:
[Me @ linuxbox ~] $ lazy_dog.txt gato
El rpido zorro marrn salt sobre el perro perezoso.
Ahora que sabemos cmo gato acepta la entrada estndar, adems de los argumentos de
nombre de archivo, vamos a tratar de redirigir la entrada estndar:

[Me @ linuxbox ~] $ cat <lazy_dog.txt


El rpido zorro marrn salt sobre el perro perezoso.
Utilizando el "<" operador de redireccin, cambiamos la fuente de la entrada estndar desde
el teclado a la lazy_dog.txt archivo. Vemos que el resultado es el mismo que el de pasar un
solo argumento de nombre de archivo. Esto no es particularmente til en comparacin con
pasar un argumento de nombre de archivo, pero sirve para demostrar el uso de un archivo
como una fuente de entrada estndar. Otros comandos de hacer un mejor uso de la entrada
estndar, como pronto veremos.
Antes de continuar, echa un vistazo a la pgina del manual para el gato, ya que tiene varias
opciones interesantes.

Tuberas
La capacidad de los comandos para leer datos de la entrada estndar y enviar a la salida
estndar es
59

6 - redireccin
utilizado por una funcin de shell llamado tuberas. Usando el operador de la tubera "|"
(barra vertical), la salida estndar de un comando se puede canalizar en la entrada estndar
de otro:
commandl | Comando2

Para demostrar plenamente esto, vamos a necesitar algunos comandos. Recuerdas cmo nos
dijeron que no haba uno que ya saban que acepta la entrada estndar? Es menos. Podemos
usar menos para mostrar, pgina por pgina, la salida de cualquier comando que enva sus
resultados a la salida estndar:

[Me @ linuxbox ~] $ ls -l / usr / bin | menos


Esto es muy prctico! Usando esta tcnica, podemos examinar convenientemente la salida de
cualquier comando que produce la salida estndar.

La diferencia entre> y |
A primera vista, puede ser difcil de entender la redireccin realizada por el operador
de canalizacin | frente al operador de redireccin>. En pocas palabras, el operador
de redireccin conecta un comando con un archivo mientras que el operador de la
tubera se conecta la salida de un comando con la entrada de un segundo mandato.
commandl > Archivol
commandl | comando2
Mucha gente va a tratar lo siguiente cuando estn aprendiendo acerca de los
oleoductos, "slo para ver qu pasa."
commandl > Command2
Respuesta: A veces algo realmente malo.
He aqu un ejemplo real presentado por un lector que se administra un dispositivo de
servidor basado en Linux. Como superusuario, lo hizo:
# cd / usr / bin
# ls> menos

60

El primer comando lo puso en el directorio donde se almacenan la mayora de los


programas y el segundo comando le dijo a la shell para sobrescribir el archivo menos
con la salida del comando ls. Desde el directorio / usr / bin ya contena un archivo
llamado "menos" (el programa less), el segundo comando sobrescribi el archivo de
programa de menos con el texto de ls destruyendo as el menor programa en su
sistema.
La leccin aqu es que el operador de redireccin en silencio crea o sobrescribe los
archivos, por lo que necesita para tratar con mucho respeto.
Tuberas

Filtros
Las tuberas se utilizan a menudo para llevar a cabo operaciones complejas en los datos. Es
posible poner varios comandos juntos en un oleoducto. Con frecuencia, los comandos que se
utilizan de esta manera se conocen como filtros. Filtros toman de entrada, cambiar de alguna
manera y luego la salida l. El primero de ellos vamos a tratar es una especie. Imaginemos que
[Me @ linuxbox ~] $ ls / bin / usr / bin | sort | menos
queramos hacer una lista combinada de todos los programas ejecutables en / bin y / usr /
bin, ponerlos en orden y ordenada visualizarla:
Dado que especificamos dos directorios (/ bin y / usr / bin), la salida de ls habra consistido
en dos listas ordenadas, una para cada directorio. Con la inclusin de una especie en nuestra
cartera, hemos cambiado los datos para producir una sola, lista ordenada.

Lneas Reportar u omitir Repetido - Uniq


El comando Uniq se utiliza a menudo en conjuncin con tipo. Uniq acepta una lista ordenada
de los datos, ya sea de entrada estndar o un solo argumento de nombre de archivo (consulte
la pgina de manual Uniq para ms detalles) y, de forma predeterminada, elimina los
duplicados de la lista. Por lo tanto, para asegurarse de que nuestra lista no tiene duplicados
[Me @ linuxbox ~] $ ls / bin / usr / bin | sort | Uniq | menos
(es decir, cualquier programa del mismo nombre que aparecen en los directorios / bin y / usr
/ bin directorios) aadiremos Uniq a nuestra cartera:
En este ejemplo, utilizamos Uniq para eliminar los duplicados de la salida del comando sort.
Si queremos ver la lista de duplicados en cambio, le aadimos la opcin "-d" para Uniq de este
modo:
61

6 - redireccin
[Me @ linuxbox ~] $ ls / bin / usr / bin | sort | Uniq -d | menos

wc - Imprimir lnea, palabra y Nmero total de bytes


El comando wc (word count) se utiliza para mostrar el nmero de lneas, palabras y bytes
contenidos en archivos. Por ejemplo:

[Me @ linuxbox ~] $ ls wc-output.txt


7902 64566 503634 ls-output.txt
En este caso se imprime tres nmeros: lneas, palabras y bytes contenidos en ls-salidas put.txt.
Al igual que nuestros comandos anteriores, si se ejecuta sin argumentos de lnea de
comandos, wc acepta la entrada estndar. La opcin "-l" limita su produccin a slo las lneas
de informe. Adicin a una tubera es una manera prctica de contar las cosas. Para ver el
nmero de elementos que tenemos en nuestra lista ordenada, podemos hacer esto:

[Me @ linuxbox ~] $ ls / bin / usr / bin | sort | Uniq | wc -l


2728

Lneas de impresin coinciden con un patrn - grep


grep es un potente programa utilizado para encontrar patrones de
texto dentro de los archivos. Se usa as:
patrn grep [archivo ...]
Cuando grep encuentra con un "patrn" en el archivo, imprime las lneas que lo contienen. Los
patrones que grep puede coincidir pueden ser muy complejos, pero por ahora nos
concentraremos en los partidos de texto simple. Vamos a cubrir los patrones avanzados,
llamados expresiones regulares en un captulo posterior.
Digamos que queramos para encontrar todos los archivos en la lista de programas que tenan
la palabra "postal" incrustado en el nombre. Esta bsqueda nos puede dar una idea de algunos
de los programas en nuestro sistema que tenan algo que ver con la compresin de archivos.
Queremos hacer esto:
[Me @ linuxbox ~] $ ls / bin / usr / bin | sort | Uniq | grep postal

62

bunzip2
bzip2
gunzip
gzip
abrir la
cremallera
cremallera
zipcloak
zipgrep
zipinfo
zipnote
zipsplit

Tuberas

Hay un par de opciones tiles para grep: "-i", que hace que grep para ignorar el caso cuando se
realiza la bsqueda (normalmente bsquedas entre maysculas y minsculas) y "-v", que le
dice a grep para slo las lneas de impresin que no coinciden con el patrn.

cabeza / cola - Imprimir Primera / ltima parte de Archivos


A veces uno no quiere que todo la salida de un comando. Es posible que slo quieren las
primeras lneas o las ltimas lneas. El comando head imprime las primeras diez lneas de un
archivo y el comando tail imprime las ltimas diez lneas. Por defecto, ambos comandos
imprimen diez lneas de texto, pero esto se puede ajustar con la opcin "-n":
[Me @ linuxbox ~] $ Cabeza -n 5 ls-output.txt
total de 343.496
raz raz
31316 2007-12-05
-rwxr-xr-x 1
-rwxr-xr-x 1
raz raz
8240 2007-12-09
-rwxr-xr-x 1
raz raz
111276 2007-11-26
-rwxr-xr-x 1
raz raz
25368 2006-10-06
~]
$
Tail
-n
5
ls-output.txt
[Me
@
linuxbox
[Me @ linuxbox ~] $ ls / usr / bin | tail -n 5 Nueva
-rwxr-xr-x
1
raz raz
5234 2007-06-27
zonetab2pot.py
-rwxr-xr-x
1
raz
raz
691 10.09.2005
zonetab2pot.pyc
-rw-r
r-1
raz
raz
930 2007-11-01
zonetab2pot.pyo
-rw-r - r-- 1
raz raz
930 2007-11-01
lrwxrwxrwx 1
raz raz
6 2008-01-31
Estos pueden ser usados en las tuberas, as:

8:58 [
13:39 411toppm
14:27 a2p
20:16 a52dec
10:56
04:21
12:23
12:23
5:22

Nueva
zonetab2pot.py
zonetab2pot.pyc
zonetab2pot.pyo
zsoelim -> soelim

63

[me @ linuxbox ~] $ tail -f / var / log / messages


08 de febrero 13:40:05 twin4 dhclient: DHCPACK desde 192.168.1.1
08 de febrero 13:40:05 twin4 dhclient: obligado a 192.168.1.4 - renovacin en
1652 segundos.
08 de febrero 13:55:32 twin4 mountd [3953]: / var / NFSv4 / musicbox exportado a ambos
192.168.1.0/24
y twin7.localdomain en 192.168.1.0/24,twin7.localdomain
zsoelim
08 de febrero 14:07:37 twin4 dhclient: DHCPREQUEST sobre eth0 a 192.168.1.1 puerto
67
08 de febrero 14:07:37 twin4 dhclient: DHCPACK desde 192.168.1.1
08 de febrero 14:07:37 twin4 dhclient: obligado a 192.168.1.4 - renovacin en
1771 segundos.
08 de febrero 14:09:56 twin4 smartd [3468]: Dispositivo: / dev / hda, SMART prefallo
Atributo: 8 Seek_Time_Performance cambi 237-236 08 de febrero 14:10:37 twin4
mountd [3953]: / var / NFSv4 / musicbox exportado a ambos 192.168.1.0/24 y
twin7.localdomain en 192.168.1.0/24,twin7.localdomain
08 de febrero sshd 14:25:07 twin4 (pam_unix) [29234]: La sesin se abri para m por
usuario (UID = 0)
08 de febrero 14:25:36 twin4 su (pam_unix) [29279]: La sesin se abri para el usuario
root por m (uid = 500)
6 - Redireccin
c o l a tiene una opcin que le permite ver los archivos en tiempo real. Esto es til para ver el
progreso de los archivos de registro a medida que se escriben. En el siguiente ejemplo, vamos
a ver en el archivo de mensajes en / var / log (o el directorio / var / log archivo / syslog si los
mensajes le falta). Privilegios de superusuario estn obligados a hacer esto en algunas
distribuciones de Linux, ya que el directorio / var / log archivo / mensajes pueden contener
informacin de seguridad:
El uso de la opcin "-f", la cola sigue supervisando el archivo y cuando se aaden nuevas
lneas, que aparecer inmediatamente en la pantalla. Esto contina hasta que escriba Ctrl-c.

tee - Leer de la entrada estndar y la salida a stdout y Archivos


De acuerdo con nuestra metfora de fontanera, Linux proporciona un llamado tee comando
que crea un "tee" de ajuste en nuestra tubera. El programa tee lee la entrada y lo copia en
tanto la salida estndar (que permite que los datos continan por la tubera) y para uno o
varios archivos estndar. Esto es til para capturar el contenido de una tubera en una etapa
intermedia del procesamiento. Aqu repetimos uno de nuestros ejemplos anteriores, esta vez
incluyendo camiseta para capturar todo el listado del directorio a la ls.txt archivo antes grep
filtra el contenido del oleoducto: 64

Tuberas
[Me @ linuxbox ~] $ ls / usr / bin | tee ls.txt | grep postal
bunzip2
bzip2
gunzip
gzip
abrir la cremallera
cremallera
zipcloak
zipgrep
zipinfo
zipnote
zipsplit

Resumiendo
Como siempre, echa un vistazo a la documentacin de cada uno de los comandos que hemos
cubierto en este captulo. Slo hemos visto su uso ms bsico. Todos ellos tienen una serie de
opciones interesantes. A medida que adquirimos experiencia en Linux, veremos que la
funcin de redireccin de la lnea de comandos es extremadamente til para la solucin de
problemas especializados. Hay muchos comandos que hacen uso de la entrada y salida
estndar, y casi todos los programas de lnea de comandos utilizan error estndar para
mostrar sus mensajes informativos.

Linux es la imaginacin
Cuando se me pide que explique la diferencia entre Windows y Linux, a menudo
utilizo una analoga juguete.
Windows es como una Game Boy. Vas a la tienda y comprar uno totalmente nuevo y
brillante en el cuadro. Usted toma a su casa, lo enciende y jugar con l. Bonitos
grficos, sonidos lindos. Despus de un tiempo, sin embargo, usted se cansa del juego
que vino con l por lo que ir de nuevo a la tienda y comprar otro. Este ciclo se repite
una y otra. Por ltimo, usted va a la tienda y decir a la persona detrs del mostrador,
"Quiero un juego que hace esto!", Slo para que le dijeran que no existe tal juego,
porque no hay "demanda del mercado" por ello. Entonces usted dice: "Pero yo slo
necesita cambiar una cosa!" La persona detrs del mostrador dice que no puedes
cambiarlo. Los juegos estn sellados en sus cartuchos. Usted descubre que su juguete
se limita a los juegos que otros han decidido que usted necesita y no ms.
Linux, en cambio, es como el ms grande del mundo Set Erector. Lo abres y es slo
una enorme coleccin de piezas. Una gran cantidad de puntales de acero, tornillos,
tuercas, engranajes, poleas, motores y algunas sugerencias sobre lo que debe
construir. As que empiezas a jugar con l. Usted construye una de las sugerencias y
luego otro. Despus de un tiempo se descubre

65

6 - redireccin

que tiene sus propias ideas de lo que debe hacer. No siempre tiene que volver a la
tienda, como usted ya tiene todo lo que necesita. El juego de construccin adquiere la
forma de su imaginacin. Se hace lo que quiere.
La eleccin de los juguetes es, por supuesto, una cosa personal, por lo que habra que
encontrar el juguete ms satisfactorio?

66

7 - Al ver el mundo como la Shell lo ve

7 - Al ver el mundo como la Shell lo ve


En este captulo vamos a ver algunas de la "magia" que se produce en la lnea de comandos
cuando se pulsa la tecla Intro. Si bien vamos a examinar varias caractersticas interesantes y
complejas de la cscara, lo haremos con un solo nuevo comando:
echo - Muestra una lnea de texto

Expansin
Cada vez que escriba una lnea de comandos y pulsa la tecla Intro, Bash realiza varios
procesos sobre el texto antes de que se lleve a cabo su mandato. Hemos visto un par de casos
de cmo una secuencia de caracteres simples, por ejemplo, "*", puede tener mucho significado
a la cscara. El proceso que hace que esto suceda se llama expansin. Con la expansin, se
introduce algo y se expande en otra cosa antes de que los actos de concha sobre ella. Para
demostrar lo que queremos decir con esto, vamos a echar un vistazo a el comando echo. eco es
[Me @ linuxbox ~] $ echo esto es una prueba
esta es una prueba
una orden interna del shell que realiza una tarea muy simple. Se imprime sus argumentos de

[Me @ linuxbox ~] $ echo *


Escritorio Documentos ls-Output.txt Msica Imgenes Plantillas Pblica Videos
texto en la salida estndar:
Eso es bastante sencillo. Cualquier argumento que se pasa a hacerse eco se mostrar.
Probemos otro ejemplo:
Entonces, qu ha pasado? Por qu no hacerse eco de impresin "*"? Como recordarn de
nuestro trabajo con comodines, el carcter "*" significa que coincida con cualquier carcter en
un nombre de archivo, pero lo que no vimos en nuestra discusin original era cmo la cscara
hace eso. La respuesta simple es que el shell expande el "*" en otra cosa (en este caso, los
nombres de los archivos de la
67

7 - Al ver el mundo como la Shell lo ve


directorio de trabajo actual) antes de que el comando echo se ejecuta. Cuando se pulsa la tecla
Intro, el shell expande automticamente los caracteres de clasificacin en la lnea de comandos
antes de que el comando se lleva a cabo, por lo que el comando echo nunca vio el "*", slo su
resultado ampliada. Sabiendo esto, podemos ver que el eco se comportaron como se esperaba.

La expansin del nombre de ruta


El mecanismo por el cual comodines trabajo se llama la expansin ruta. Si tratamos algunas de
las tcnicas que hemos empleado en nuestros captulos anteriores, veremos que en realidad
son expansiones. Dado un directorio principal que se parece a esto:

[me @ linuxbox ~] $ ls
Escritorio ls-output.txt
Documentos Msica

Imgenes
Pblico

Plantillas
Vdeos

podramos llevar a cabo las siguientes ampliaciones:

[me @ linuxbox ~] $ echo D *


Documentos de Escritorio
y:

[me @ linuxbox ~] $ echo * s Documentos


Imgenes Plantillas Videos
o
incluso:
[Me @ linuxbox ~] $ echo [[: upper:]] *
Documentos de Escritorio Msica Fotos Plantillas Pblicos Videos
y mirando ms all de nuestro directorio
home:
[Me @ linuxbox ~] $ echo / usr / * / share / usr /
kerberos / share / usr / local / share

68

Expansin

Nombre de ruta de expansin de archivos ocultos


Como sabemos, los nombres de archivo que comienzan con un carcter de punto
estn ocultos. La expansin del nombre de ruta tambin respeta este comportamiento.
Una expansin como: echo *
no revela los archivos ocultos.
Podra parecer a primera vista que podramos incluir archivos ocultos en una
expansin iniciando el patrn con un punto inicial, como esto:. Eco *
Casi funciona. Sin embargo, si examinamos los resultados de cerca, veremos que los
nombres "." Y ".." sern tambin aparecer en los resultados. Puesto que estos nombres
se refieren al directorio de trabajo actual y su directorio padre, utilizando este patrn
es probable producir un resultado incorrecto. Podemos ver esto si tratamos el
comando:. * Ls -d | menos
Para llevar a cabo una mejor expansin ruta en esta situacin, tenemos que emplear
un patrn ms especfico:. Eco * [!].
Este patrn se expande en cada nombre de archivo que comienza con un perodo, no
incluye un segundo perodo, y seguida de cualquier otro carcter. Esto funciona
correctamente con la mayora de los archivos ocultos (aunque todava no incluir los
nombres de archivo con mltiples perodos principales). El comando ls con la opcin
-A ("casi todo") proporcionar una lista correcta de los archivos ocultos: ls -A

Expansin Tilde
Como se recordar de nuestra introduccin al comando cd, el carcter de tilde ("~") tiene un
significado especial. Cuando se usa al principio de una palabra, que se expande en el nombre
del directorio de inicio del usuario llamado, o si no hay ningn usuario llamado, el directorio
de inicio del usuario actual:

[Me @ linuxbox ~] $ echo ~ /


home / me
Si el usuario "foo" tiene una cuenta,
a continuacin:
[Me @ linuxbox ~] $ echo ~ foo /
home / foo

69

7 - Al ver el mundo como la Shell lo ve

Expansin aritmtica
El depsito permite la aritmtica que se realizar por la expansin. Esto nos permite usar la
lnea de comandos como una calculadora:
[Me @ linuxbox ~] $ echo $ ((2 + 2))
4
Expansin aritmtica utiliza el formulario:
$ ((Expresin))
donde la expresin es una expresin aritmtica que consiste en valores y operadores
aritmticos.
Expansin aritmtica slo admite nmeros enteros (nmeros enteros, sin decimales), pero
puede llevar a cabo un buen nmero de diferentes operaciones. Aqu estn algunos de los
operadores compatibles:
Tabla 7-1: Operadores aritmticos

Operador
+

Descripcin
Adicin

Sustraccin

/
%
**

Multiplicacin
Divisin (pero recuerde, ya que la expansin slo es compatible con la
aritmtica de enteros, los resultados son nmeros enteros.)
Modulo, que simplemente significa, "resto".
Exponenciacin

[Me @ linuxbox ~] $ echo $ (($ ((5 ** 2)) * 3))


75
Los espacios no son significativos en las expresiones aritmticas y expresiones pueden
anidarse. Por ejemplo, para multiplicar 5 al cuadrado por 3:
Parntesis individuales pueden utilizarse para agrupar varias subexpresiones. Con esta
tcnica, podemos reescribir el ejemplo anterior y obtener el mismo resultado utilizando una
nica expansin en lugar de dos:

70

Expansin
[Me @ linuxbox ~] $ echo $ (((5 ** 2) * 3))
75
Aqu est un ejemplo utilizando los operadores de divisin y resto. Observe el efecto de la
divisin entera:

[Me @ linuxbox ~] $ echo Cinco dividido por dos es igual a $ ((5/2))


Cinco dividido por dos es igual a 2
[Me @ linuxbox ~] $ echo con $ ((5% 2)) de sobra.
con 1 sobra.
Expansin aritmtica se cubre en mayor detalle en el Captulo 34.

Expansin Brace
Quizs la expansin ms extraa se llama la expansin de llaves. Con l, usted puede crear
varias cadenas de texto de un patrn que contiene tirantes. He aqu un ejemplo:

[Me @ linuxbox ~] $ echo Front- {A, B, C} -Volver


Frente-A-Back Front-B-Back Front-C-Back
Patrones para ser cors ampliado puede contener una porcin delantera llamado un
prembulo y una parte trasera llamado una posdata. La misma expresin cors puede
contener una lista separada por comas de cadenas, o un rango de nmeros enteros o caracteres
individuales. El patrn no puede contener espacios en blanco incrustados. Aqu hay un
ejemplo usando un rango de enteros:
[Me @ linuxbox ~] $ echo Number_ {1..5}
Nmero_1 NUMBER_2 NUMBER_3 Number_4
Number_5
Los enteros tambin pueden ser acolchado
cero de este modo:
[Me @ linuxbox ~] $ echo {01..15}
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 [me @ linuxbox ~] $ echo
{001..15}
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015
Una serie de letras en orden
inverso:
71

7 - Al ver el mundo como la Shell lo ve


Expansiones de llaves pueden anidarse:
[Me @ linuxbox ~] $ echo {a..z}
ZYXWVUTSRQPONMLKJIHGF
EDCBA
[Me @ linuxbox ~] $ echo un {A {1,2},
B {3,4}} b
aA1b aA2b aB3b aB4b
Entonces, qu es esto bueno? La aplicacin ms comn es hacer listas de archivos o
directorios que se creen. Por ejemplo, si nos quedamos fotgrafos y tena una gran coleccin
de imgenes que queramos organizar en aos y meses, lo primero que podemos hacer es
crear una serie de directorios nombrados en formato numrico "Ao-Mes". De esta manera,
los nombres de directorio ordenar en orden cronolgico. Podramos escribir una lista
completa de los directorios, pero eso es un montn de trabajo y es propenso a errores tambin.
En su lugar, podramos hacer esto:
[me @ linuxbox ~] $ mkdir Fotos [me @ linuxbox ~] $ cd Fotos
[Me @ linuxbox Fotos] $ mkdir {2007..2009} - {01..12}
[Me @ linuxbox Fotos] $ ls
2007-01 2007-07 2008-01 2008-07 2009-01 2009-07
2007-02 2007-08 2008-02 2008-08 2009-02 2009-08
2007-03 2007-09 2008-03 2008-09 2009-03 2009-09
2007-04 2007-10 2008-04 2008-10 2009-04 2009-10
2007-05 2007-11 2008-05 2008-11 2009-05 2009-11
2007-06 2007-12 2008-06 2008-12 2009-06 2009-12
Mancha Pretty!

Expansin Parmetro
Slo vamos a hablar brevemente sobre la expansin de parmetro en este captulo, pero
vamos a estar cubriendo ampliamente ms adelante. Es una caracterstica que es ms til en
scripts de shell que directamente en la lnea de comandos. Muchos de sus capacidades tienen
que ver con la capacidad del sistema para almacenar pequeas cantidades de datos y dar a
cada trozo un nombre. Muchos de estos trozos, ms correctamente llamados variables, estn
disponibles para su examen. Por ejemplo, la variable denominada "USUARIO" contiene su
nombre de usuario. Para invocar la expansin de parmetro y revelar el contenido de usuario
que haga lo siguiente:

[Me @ linuxbox ~] $ echo $


USUARIO
72

Expansin
m
Para ver una lista de las variables
disponibles, intente lo siguiente:
[Me @ linuxbox ~] $ printenv | less
Usted puede haber notado que con otros tipos de expansin, si se escribe incorrectamente un
patrn, la ampliacin no tendr lugar y el comando echo simplemente mostrar el patrn
escrito mal. Con la expansin de parmetro, si se escribe incorrectamente el nombre de una
variable, la expansin se llevar a cabo todava, pero dar lugar a una cadena vaca:

[Me @ linuxbox ~] $ echo $ SUER


[me @ linuxbox ~] $

Comando Sustitucin
Sustitucin de comandos nos permite usar la salida de un comando como una
expansin:
[Me @ linuxbox ~] $ echo $ (ls)
Escritorio Documentos ls-Output.txt Msica Imgenes Plantillas Pblica Videos

Uno de mis favoritos es algo como esto:

[Me @ linuxbox ~] $ ls -l $ (que cp)


-rwxr-xr-x 1 root root 71516 2007-12-05 08:58 / bin / cp
Aqu pasamos cuyos resultados cp como argumento para el comando ls, consiguiendo de esta
manera la lista de del programa cp sin necesidad de conocer su ruta completa. No estamos
limitados a slo simples comandos. Tuberas enteras se pueden usar (slo salida parcial se
muestra):

[Me @ linuxbox ~] $ archivo $ (ls -d / usr / bin / * | grep zip)


/ Usr / bin / bunzip2:
enlace simblico a bzip2 '

73

7 - Al ver el mundo como la Shell lo ve


/ Usr / bin / bzip2:
ELF 32-bits LSB ejecutable, Intel 80386,
Versin 1 (SYSV), vinculado dinmicamente (usos libreras compartidas), para
GNU / Linux 2.6.9, despojados
/ Usr / bin / bzip2recover: ELF 32-bits LSB ejecutable, Intel 80386, versin 1
(SYSV), vinculado dinmicamente (usos libs compartido), para GNU / Linux 2.6.9,
despojada
/ Usr / bin / funzip:
ELF 32-bits LSB ejecutable, Intel 80386,
Versin 1 (SYSV), vinculado dinmicamente (usos libreras compartidas), para
GNU / Linux 2.6.9, despojados
/ Usr / bin / gpg-zip:
Bourne shell script ejecutable texto
/ Usr / bin / gunzip:
simblico enlace
a
'../../bin/gunzip'
/ Usr / bin / gzip:
simblico enlace
a
'../../bin/gzip'
/ Usr / bin / mzip:
simblico enlace
a
'mtools'
En este ejemplo, los resultados de la tubera se convirtieron en la lista de argumentos del
comando file.
Existe una sintaxis alternativa para la sustitucin de comandos de shell en programas de
mayor edad que tambin se apoy en bash. Utiliza copias de cotizaciones en lugar del signo
de dlar y parntesis:
[Me @ linuxbox ~] $ ls -l 'que cp'
-rwxr-xr-x 1 root root 71516 2007-12-05 08:58 / bin / cp

Citando
Ahora que hemos visto cmo muchas maneras la cscara puede realizar expansiones, es hora
de aprender cmo podemos controlarlo. Tomemos, por ejemplo:

[Me @ linuxbox ~] $ echo esto es una prueba


esta es una prueba
o:

[Me @ linuxbox ~] $ echo El total es de $ 100.00


El total es de 00.00
En el primer ejemplo, la palabra de reparto por el cascarn espacios en blanco extra de la lista
del comando echo de argumentos. En el segundo ejemplo, la expansin de parmetro
sustituido una cadena vaca para el valor de "$ 1" porque era una variable no definida. El shell
proporciona un mecanismo llamado citando a suprimir selectivamente las expansiones no
deseados.
74

Citando

Doble Cotizaciones
El primer tipo de citar vamos a ver es entre comillas dobles. Si coloca texto entre comillas
dobles, todos los caracteres especiales utilizados por el shell pierden su significado especial y
se tratan como caracteres normales. Las excepciones son "$", "\" (barra invertida), y "'" (comilla
inversa). Esto significa que la palabra de reparto, la expansin ruta, la expansin de tilde, y la
expansin de llaves se suprimen, pero la expansin de parmetro, expansin aritmtica, y la
sustitucin de comandos an se llevan a cabo. El uso de comillas dobles, podemos hacer frente
a los nombres de archivo que contienen espacios incrustados. Decir que nos quedamos la
desafortunada vctima de un archivo llamado dos words.txt. Si tratamos de utilizar esto en la
lnea de comandos, palabra-divisin causara que esto se trata como dos argumentos
separados en lugar de solo el argumento deseado:
[Me @ linuxbox ~] $ ls -l dos words.txt
ls: no se puede acceder a dos: No hay tales ls archivo o directorio: no
pueden acceder a words.txt: No existe el fichero o directorio
Mediante el uso de comillas dobles, dejamos la palabra de divisin y obtenemos el resultado
deseado; an ms, incluso podemos reparar el dao:

[Me @ linuxbox ~] $ ls -l "dos words.txt"


-rw-rw-r-- 1 me me 18 2008-02-20 13:03 dos words.txt [me @ linuxbox ~]
$ mv two_words.txt "dos words.txt"
Hay! Ahora no tenemos que seguir escribiendo esas comillas molestos.
Recuerde, la expansin de parmetro, expansin aritmtica, y la sustitucin de comandos
todava tener lugar dentro de las comillas dobles:

[Me @ linuxbox ~] $ echo "$ USER $ ((2 + 2)) $ (cal)"


me 04 de febrero 2008 Do Lu Ma Mi Ju Vi Sa 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

Debemos tomar un momento para mirar el efecto de comillas dobles en la sustitucin de


comandos. En primer lugar vamos a ver un poco ms cmo funciona la divisin de palabras.
En nuestro ejemplo anterior, vimos cmo aparece la palabra-divisin para eliminar espacios
adicionales en nuestro texto:
75

[Me @ linuxbox ~] $ echo esto es una prueba


esta es una prueba
7 - Al ver el mundo como la Shell lo ve
Por defecto, la palabra-divisin busca la presencia de espacios, tabuladores y saltos de lnea
(caracteres de avance de lnea) y los trata como delimitadores entre las palabras. Esto quiere
decir que no cotizados espacios, tabuladores y saltos de lnea no son considerados como parte
del texto. Slo sirven como separadores. Desde que se separan las palabras en diferentes
argumentos, nuestra lnea de ejemplo de comandos contiene un comando seguido de cuatro
argumentos distintos. Si aadimos comillas dobles:
~] $$ echo
Echo$"esto
prueba "
[Me@
@linuxbox
linuxbox~]
[Me
(cal) es un
esta es 2008
una Do Lu
prueba
Febrero
Ma Mi Ju Vi Sa 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 [me @ linuxbox ~] $ echo "$ (cal ) "
Febrero 2008 Do Lu
Ma Mi Ju Vi Sa 1 2
3 4
5 6 7 8 9
10 11
1213 14 15 16
17 18
1920 21 22 23
24 25
2627 28 29
palabra-divisin se suprime y los espacios incrustados no son tratados como delimitadores, y
no pasan a formar parte del argumento. Una vez que se agregan las comillas dobles, nuestra
lnea de comandos contiene un comando seguido de un solo argumento.
El hecho de que los saltos de lnea se consideran delimitadores por el mecanismo de reparto
de la palabra provoca una interesante, aunque sutil, el efecto sobre la sustitucin de
comandos. Considere lo siguiente:
En el primer caso, la sustitucin de comandos no cotizado result en una lnea de comandos
que contiene 38 argumentos. En el segundo, una lnea de comandos con un argumento que
incluye espacios incrustados y la nuevas lneas.

Soltero Cotizaciones
Si tenemos que suprimir todas las expansiones, usamos comillas simples. He aqu una
comparacin de, comillas dobles no cotizadas, y las comillas simples: 76

Citando
[Me @ linuxbox ~] $ texto eco ~ / *. Txt {a, b} $ (foo eco) $ ((2 + 2)) $ USUARIO
texto /home/me/ls-output.txt a b foo 4 me
[Me @ linuxbox ~] $ echo "texto ~ / *. Txt {a, b} $ (foo eco) $ ((2 + 2)) $ USER"
texto ~ / *. txt {a, b} foo 4 me
[Me @ linuxbox ~] $ echo "texto ~ / *. Txt {a, b} $ (foo eco) $ ((2 + 2)) $ USER '
texto ~ / *. txt {a, b} $ (foo eco) $ ((2 + 2)) $ USUARIO
Como podemos ver, con cada nivel sucesivo de citar, ms y ms de las expansiones se
suprimen.

Escapar Personajes
A veces slo queremos citar un solo carcter. Para ello, podemos preceder a un personaje con
una barra invertida, que en este contexto se llama el carcter de escape. A menudo esto se hace
dentro de las comillas dobles para evitar una expansin selectiva:

[Me @ linuxbox ~] $ echo "El balance para el usuario $ usuario es: \ $ 5,00"
El balance para m usuario es: $ 5.00
Tambin es comn el uso de escape para eliminar el significado especial de un carcter en un
nombre de archivo. Por ejemplo, es posible utilizar caracteres en los nombres de archivo que
normalmente tienen un significado especial para el shell. Estos incluyen "$", "!", "&", "", Y
otros. Para incluir un carcter especial en un nombre de archivo que pueda para esto:

[Me @ linuxbox ~] $ mv malo \ & nombre de archivo


good_filename
Para permitir que un carcter de barra invertida aparezca, escapar de ella escribiendo "\\".
Tenga en cuenta que dentro de comillas simples, la barra invertida pierde su significado
especial y se trata como un carcter ordinario.

Secuencias de escape barra diagonal inversa


Adems de su papel como el carcter de escape, la barra invertida tambin se utiliza
como parte de una notacin para representar determinados caracteres especiales
conocidos como cdigos de control. Los primeros 32 caracteres en el esquema de
codificacin ASCII se utilizan para transmitir rdenes a teletipo-como los
dispositivos. Algunos de estos cdigos son familiares (pestaa, retroceso, avance de
lnea y retorno de carro), mientras que otros no lo son (nulo, al final de la transmisin,
y reconocen).

77

La tabla anterior muestra algunas de las secuencias de escape de barra invertida


comn. La idea detrs de esta representacin mediante la barra invertida se origin en
el lenguaje de programacin C y ha sido adoptado por muchos otros, incluyendo la
cscara.
Secuencia de Escape Significado
Adicin de la opcin "-e" hacer eco permitir la interpretacin de secuencias de
\A
Bell ("Alerta" - hace que el equipo emita un pitido)
escape. Tambin puede colocarlos en el interior $ ' '. Aqu, utilizando el c o m a n d o
Retroceso
d e l s u e o , u\nBa s i m
N slo espera a que el nmero especificado de segundos y luego sale,
programa PLE \que
Newline. En los sistemas Unix, esto produce un
podemos crear una primitiva temporizador de cuenta atrs: el sueo de 10; echo -e "de
salto de lnea.
Time hasta \ a"
Tambin podramos
\ R hacer esto: Retorno de carro
dormir 10; echo
tiempo" $ '\ a'
\ T "Se acab elLengeta
7 - Al ver el mundo como la Shell lo ve

Resumiendo
A medida que avanzamos con el uso de la cscara, nos encontraremos con que las expansiones
y de cotizacin se utiliza cada vez con mayor frecuencia, as que tiene sentido para obtener
una buena comprensin de la forma en que trabajan. De hecho, se podra argumentar que son
los temas ms importantes para aprender acerca de la cscara. Sin una comprensin adecuada
de la expansin, la cscara siempre ser una fuente de misterio y confusin, y gran parte de
ella poder potencial desperdiciado.

Lectura adicional
La pgina de manual de bash tiene grandes secciones en tanto la expansin como la
que citando a cubrir estos temas de una manera ms formal.
El Manual de Referencia Bash tambin contiene captulos sobre la expansin y
citando: http://www.gnu.org/software/bash/manual/bashref.html

78

8 - Trucos
teclado

avanzadas

del

8 - Trucos avanzadas del teclado


A menudo me describo en broma Unix como "el sistema operativo para las personas que les
gusta escribir." Por supuesto, el hecho de que incluso tiene una lnea de comandos es un
testimonio de ello. Pero los usuarios de la lnea de comandos no les gusta escribir mucho. Por
qu si tantos comandos tienen nombres tan cortos como cp, ls, mv, y rm? De hecho, uno de los
objetivos ms preciados de la lnea de comandos es la pereza; haciendo la mayor parte del
trabajo con el menor nmero de golpes de teclado. Otra meta es nunca tener que levantar los
dedos del teclado, nunca alcanza para el ratn. En este captulo, vamos a ver las caractersticas
de bash que hacen uso del teclado ms rpido y ms eficiente.
Los siguientes comandos harn acto de presencia:

c l a r o - Borrar la pantalla

h i s t o r i a - Mostrar el contenido de la lista del historial

De lnea de comandos de edicin


B a s h utiliza una biblioteca (una coleccin compartida de rutinas que los diferentes
programas se pueden utilizar) llama Readline para implementar la edicin de lnea de
comandos. Ya hemos visto algo de esto. Sabemos, por ejemplo, que las teclas de flecha
mueven el cursor, pero hay muchas ms caractersticas. Piense en estas herramientas como
adicionales que podemos emplear en nuestro trabajo. No es importante aprender de todos
ellos, pero muchos de ellos son muy tiles. Seleccionar y elegir si lo deseas.

Nota: Algunas de las secuencias de teclas de abajo (en particular los que utilizan la
tecla Alt) pueden ser interceptados por la interfaz grfica de usuario para otras
funciones. Todas las secuencias de teclas debera funcionar correctamente cuando se
utiliza una consola virtual.

Movimiento del cursor


La siguiente tabla muestra las teclas que se utilizan para mover el cursor:

79

8 - Trucos de teclado Avanzada


Tabla 8-1:

Cursor comandos de movimiento

Clave

Accin

Ctrl-a
Ctrl-e

Mover el cursor al principio de la lnea.


Mover el cursor hasta el final de la lnea.

Ctrl-b
Alt-f

Mueve el cursor un carcter hacia adelante; mismo que la tecla de flecha


derecha.
Mueve el cursor hacia atrs un carcter; mismo que la tecla de flecha
izquierda.
Mueve el cursor una palabra hacia delante.

Alt-b

Mueve el cursor hacia atrs una palabra.

Ctrl-l

Desactive la pantalla y mover el cursor a la esquina superior izquierda.


El comando clear hace lo mismo.

Ctrl-f

Modificacin del texto


Tabla 8-2 enumera los comandos del teclado que se utilizan para editar los caracteres en la
lnea de comandos. Tabla 8-2: Comandos de edicin de texto

Clave
Ctrl-D
Ctrl-t

Alt-t
Alt-l
Alt-u

Accin
Eliminar el carcter situado en la posicin del cursor
Transpose (cambio) el carcter en la posicin del cursor con el que le
precede.
Transposicin de la palabra en la posicin del cursor con el que le
precede.
Convertir los caracteres de la posicin del cursor hasta el final de la
palabra a minsculas.
Convertir los caracteres de la posicin del cursor hasta el final de la
palabra a maysculas.

Cortar y pegar (destruir y tirar) Texto


La documentacin de Readline utiliza los trminos destruir y tirar para referirse a lo que
comnmente llamaramos cortar y pegar. Los productos que se cortan se almacenan en un
buffer llamado killring.

80

De lnea de comandos
de edicin
Tabla 8-3: cortar y pegar los comandos

Clave
Ctrl-k

Accin
Matar texto desde la posicin del cursor hasta el final de la lnea.

Ctrl-u
Alt-d

Matar texto desde la posicin del cursor hasta el principio de la lnea.


Matar texto desde la posicin del cursor hasta el final de la palabra
actual.
Matar texto desde la posicin del cursor hasta el principio de la palabra
actual. Si el cursor se encuentra al comienzo de una palabra, matar a la
palabra anterior.

Alt
Retroceso

Ctrl-y

Yank texto desde el histrico de recortes y la inserta en la posicin del


cursor.

La tecla Meta
Si se aventura en la documentacin de Readline, que se puede encontrar en la seccin
READLINE de la pgina de manual de bash, se encontrar con el trmino "tecla meta."
En los teclados modernos esto se asigna a la tecla Alt, pero no siempre fue as. Ya en
los tiempos oscuros (antes de las PC, pero despus de Unix) no todo el mundo tena su
propio ordenador. Lo que ellos podran haber tenido era un dispositivo llamado un
terminal. Un terminal era un dispositivo de comunicacin que cont con una pantalla
de visualizacin de texto y un teclado y suficiente dentro de la electrnica para
mostrar caracteres de texto y mover el cursor alrededor. Se adjunta (generalmente por
cable en serie) a un ordenador ms grande o la red de comunicacin de un ordenador
ms grande. Haba muchas marcas diferentes de terminales y todos ellos tenan
diferentes teclados y conjuntos de caractersticas de visualizacin. Ya que todos
tendan a por lo menos entender ASCII, los desarrolladores de software que desean
aplicaciones porttiles escribieron al mnimo comn denominador. Sistemas Unix
tienen una forma muy elaborada de hacer frente a las terminales y sus diferentes
caractersticas de visualizacin. Dado que los desarrolladores de Readline no podan
estar seguros de la presencia de una tecla de control adicional dedicado, inventaron
uno y lo llamaron "meta". Si bien la tecla Alt sirve como la tecla meta en los teclados
modernos, puede tambin pulsar y soltar la tecla Esc clave para conseguir el mismo
efecto que mantiene pulsada la tecla Alt si usted todava est utilizando un terminal
(que todava se puede hacer en Linux!).

Terminacin
Otra forma en que la cscara puede ayudar es a travs de un mecanismo llamado finalizacin.
Finalizacin se produce cuando se pulsa la tecla de tabulacin mientras se escribe un
comando. Vamos a ver cmo funciona esto. Dado un directorio principal que se parece a esto:
81

8 - Trucos de teclado Avanzada


[me @ linuxbox ~] $ ls
Escritorio ls-output.txt
Documentos Msica

Fotos Plantillas
Pblico

Vdeos

Pruebe a escribir lo siguiente pero no presione la tecla Intro:

[me @ linuxbox ~] $ ls l
A continuacin, pulse
la tecla de tabulacin:
[Me @ linuxbox ~] $ ls-output.txt
Vea cmo la cscara complet la lnea para usted? Vamos a probar otra. Una vez ms, no
pulse Intro:

[Me @ linuxbox ~] $ ls D
Pulse la
ficha:
[Me @ linuxbox ~] $ ls D
Sin terminar, slo un pitido. Esto sucedi porque "D" coincide con ms de una entrada en el
directorio. Para completar para tener xito, la "idea" le dar lo que tiene que ser inequvoco. Si
vamos ms all:

[Me @ linuxbox ~] $ ls Do
A continuacin,
pulse la ficha:
[me @ linuxbox ~] $ ls Documentos
La conclusin es exitosa.
Aunque este ejemplo muestra la terminacin de nombres de ruta, que es su uso ms comn,
82

Terminacin
finalizacin tambin trabajar en las variables (si el principio de la palabra es un "$"), nombres
de usuario (si la palabra comienza con "~"), los comandos (si la palabra es la primera palabra
en la lnea.) y los nombres de host ( si el comienzo de la palabra es "@"). Terminacin de
nombre de host slo funciona para los nombres de host que figuran en el / etc / hosts.

Finalizacin
Tabla
8-4: Comandos deprogramable
finalizacin
Las versiones recientes de fiesta tienen una instalacin llamada finalizacin
Clave
Accin
programable. Finalizacin
programable le permite (o, ms probablemente, su
Aproveedor
lt?
Mostrar la lista
terminaciones
posibles.
En la mayora
de losPor
sistemas
de distribucin)
paradeagregar
reglas de
terminacin
adicionales.
lo
tambin
puede
hacer esto
la tecla
de tabulacin
una segunda
general, esto se hace
para se
aadir
soporte
parapulsando
aplicaciones
especficas.
Por ejemplo,
es
aadir lasvez,
terminaciones
de la lista
opciones de un comando o que coincida
lo que es mucho
ms de
fcil.
Aposible
lt *
Insertar todas las terminaciones posibles. Esto es til cuando se desea
con determinados tipos de archivo que soporta una aplicacin. Ubuntu tiene una
utilizar ms de una posible coincidencia.
bastante grande conjunto definido de forma predeterminada. Finalizacin
programable se implementa mediante funciones de shell, una especie de mini-shell
script que vamos a cubrir en los prximos captulos. Si eres curioso, pruebe: set | less
y ver si usted puede encontrarlos. No todas las distribuciones los incluyen por
defecto.
Hay un nmero de control y meta secuencias de teclas que estn asociadas con la terminacin:
Hay unos cuantos ms que me parece ms bien oscuro. Usted puede ver una lista en la pgina
de manual de bash en "READLINE".

Uso del historial


Como descubrimos en el captulo 1, golpe mantiene un historial de los comandos que se han
introducido. Esta lista de comandos se guarda en el directorio de inicio en un archivo llamado
.bash_history. La instalacin de la historia es un recurso til para reducir la cantidad de
escribir lo que tienes que hacer, especialmente cuando se combina con la edicin de lnea de
comandos.

83

8 - Trucos de teclado Avanzada

Historia bsqueda
En cualquier momento, podemos ver el contenido de la lista
de la historia a travs de:
[Me @ linuxbox ~] $ historia | menos
De forma predeterminada, golpe almacena los ltimos 500 comandos que ha introducido.
Vamos a ver cmo ajustar este valor en un captulo posterior. Digamos que queremos
encontrar los comandos que usamos para listar / usr / bin. Una manera de que pudiramos
hacer esto:
[Me @ linuxbox ~] $ historia | grep / usr / bin
Y digamos que entre los resultados que conseguimos una lnea que contiene un comando
interesante como esto:
88 ls -l / usr / bin> ls-output.txt
El nmero "88" es el nmero de lnea del comando en la lista del historial. Podramos utilizar
este inmediatamente utilizando otro tipo de expansin llamado expansin de historia. Para
usar nuestra lnea descubrimos que podamos hacer esto:

[Me @ linuxbox ~] $ 88
Bash se expandir "88" en el contenido de la Octogsima octava lnea en
la lista de historial. Hay otras formas de expansin de historia que vamos
a cubrir un poco ms tarde.
Bash tambin proporciona la capacidad de buscar en la lista de la historia
de forma incremental. Esto signific a que podemos decirle a bash para
buscar en la lista de la historia a medida que entramos personajes, con
cada personaje adicional refinar an ms nuestra bsqueda. Para iniciar
la bsqueda incremental pulse Ctrl -r seguido del texto que busca.
Cuando lo encuentre, puede pulsar Enter para ejecutar el comando o
pulse Ctrl-J para copiar la lnea de la lista de la historia a la lnea de
comandos actual. Para buscar la siguiente aparicin del texto (que se
m[Me
u e v@
e linuxbox
" h a c i a ~]
a r $r i b a " l a l i s t a d e l h i s t o r i a l ) , p u l s e C t r l - r d e n u e v o . P a r a
salir de la bsqueda, pulse Ctrl -g o Ctrl-C. Aqu lo vemos en accin:
Primero, pulse Ctrl-r:

84

(Reverse-i-bsqueda) ''

Uso del historial

Los rpidos cambios que indican que estamos llevando a cabo una bsqueda incremental
inversa. Se trata de "revertir" porque estamos en busca de "ahora" para algn momento en el
(Reverse-i-bsqueda) '/ usr / bin': ls -l / usr / bin> ls-output.txt
pasado. A continuacin, empezamos a escribir nuestro texto de bsqueda. En este ejemplo "/
usr / bin":
Inmediatamente, la bsqueda devuelve nuestro resultado. Con nuestro resultado, podemos
[Me @ linuxbox ~] $ ls -l / usr / bin> ls-output.txt
ejecutar el comando pulsando Enter, o podemos copiar el comando a nuestra lnea de
comando actual para su posterior edicin pulsando Ctrl-j. Vamos a copiarlo. Presione Ctrl-j:
Nuestros shell prompt devoluciones y nuestra lnea de comandos, se haya
cargado y listo para la accin! La siguiente tabla muestra algunas de las
pulsaciones de teclas que se utilizan para manipular la lista de la historia:
Tabla 8-5: Comandos de historia

Clave
Ctrl-p
Ctrl-n
Alt <
Alt>
Ctrl-r
Alt-p
Alt-N
Ctrl-O

85

Accin
Mover a la entrada de la historia anterior. La misma accin como la
flecha hacia arriba.
Mover a la siguiente entrada de la historia. La misma accin como la
flecha hacia abajo.
Ir al principio (arriba) de la lista del historial.
Mover a la final (abajo) de la lista del historial, es decir, la lnea de
comandos actual.
Invierta bsqueda incremental. Busca en forma incremental desde la
lnea de comandos actual hasta la lista del historial.
Bsqueda hacia atrs, no incremental. Con esta clave, escriba la cadena
de bsqueda y pulse enter antes de realizar la bsqueda.
Bsqueda hacia adelante, no incremental.
Ejecute el elemento actual de la lista de la historia y avanzar a la
siguiente. Esto es til si usted est tratando de volver a ejecutar una
secuencia de comandos en la lista del historial.

8 - Trucos avanzadas del teclado

Historia de Expansin
La cscara ofrece un tipo especializado de expansin para los elementos de la lista del historial
mediante el uso de la "!" Carcter. Ya hemos visto cmo el signo de exclamacin puede ser
seguido por un nmero de insertar una entrada de la lista del historial. Hay un nmero de
otras caractersticas de expansin:
Tabla 8-6: Comandos Historia de expansin

Secuencia
Accin
!! Repetir el ltimo comando. Es probablemente ms fcil que pulsar la flecha hacia arriba
y entrar.
! nmero

Historia nmero elemento de la lista de repeticin.


Repetir el ltimo elemento de la lista la historia comenzando con una
Cadena!
cuerda.
! ?guin
Cadena
Repetir el ltimo elemento de la lista que contiene la historia de la
cadena.
Adems de la funcin de historial de comandos en bash, la mayora de las
distribuciones Linux incluyen un programa llamado secuencia de comandos que se
puede utilizar para grabar una sesin de toda la cscara y guardarlo en un archivo. La
sintaxis bsica del comando es: guin [archivo]
donde archivo es el nombre del archivo que se utiliza para almacenar la grabacin. Si
no se especifica ningn archivo, se utiliza el archivo de texto mecanografiado. Vea la
pgina man guin para una lista completa de opciones y caractersticas del programa.
Quisiera advertir contra el uso de la "cadena!" Y "!? Cadena" formas a menos que est
absolutamente seguro de los contenidos de los elementos de la lista de historia.
Hay muchos ms elementos disponibles en el mecanismo de expansin de historia, pero este
tema ya es demasiado arcana y nuestras cabezas pueden explotar si continuamos. La seccin
EXPANSIN historia de la pgina del manual de bash entra en todos los detalles sangrientos.
Sintase libre de explorar!

Resumiendo
En este captulo hemos cubierto algunos de los trucos de teclado que la cscara proporciona
para ayudar a los mecangrafos del hardcore reducir sus cargas de trabajo. Sospecho que a
medida que pasa el tiempo y que involucrarse ms con la lnea de comandos, se le consulte de
nuevo a este captulo para recoger a 86

Resumiendo
ms de estos trucos. Por ahora, considerarlos opcional y potencialmente til.

Lectura adicional
La Wikipedia tiene un buen artculo sobre terminales de ordenador:
http://en.wikipedia.org/wiki/Computer terminales

87

9 - Permisos

9 - Permisos
Los sistemas operativos en la tradicin Unix difieren de las de la tradicin de MS-DOS, ya que
son no slo los sistemas multitarea, sino tambin los sistemas multi-usuario, as.
Qu significa exactamente esto? Esto significa que ms de una persona puede ser el uso de la
computadora al mismo tiempo. Mientras que una computadora tpica probablemente tendr
slo un teclado y un monitor, todava puede ser utilizado por ms de un usuario. Por ejemplo,
si un ordenador est conectado a una red o de Internet, los usuarios remotos pueden
conectarse a travs de SSH (Secure Shell) y operar el equipo. De hecho, los usuarios remotos
pueden ejecutar aplicaciones grficas y tienen la salida grfica aparece en una pantalla remota.
El sistema X Window apoya esto como parte de su diseo bsico.
La capacidad multiusuario de Linux no es una "innovacin", reciente sino ms bien una
caracterstica que est profundamente arraigada en el diseo del sistema operativo. Teniendo
en cuenta el entorno en el que Unix fue creado, esto tiene mucho sentido. Hace aos, antes de
los ordenadores eran "personal", que eran grandes, caros, y centralizado. Un sistema tpico
equipo universitario, por ejemplo, consista en un gran ordenador central situado en un
edificio y los terminales que se encuentran en todo el campus, cada uno conectado a la
computadora central de gran tamao. El ordenador apoyara muchos usuarios al mismo
tiempo.
Con el fin de hacer esta prctica, un mtodo tena que ser concebidos para proteger a los
usuarios de la otra. Despus de todo, las acciones de un usuario no se podra permitir a
estrellar la computadora, ni podran un usuario interferir con los archivos que pertenecen a
otro usuario.
En este captulo vamos a ver esta parte esencial de la seguridad del sistema e introducir los
siguientes comandos:

88

Identificacin - Visualizacin de identidad de usuario

c h m o d - Cambie el modo de un archivo

u m a s k - Establecer los permisos de archivo por defecto

do - Ejecutar un shell como otro usuario

s u d o - Ejecutar un comando como otro usuario

c h o w n - Cambia el propietario de un archivo

9 - Permisos

c h g r p - Cambie la propiedad de grupo de un archivo

[Me @ linuxbox ~] $ archivo / etc / shadow / etc / shadow:


archivo normal, sin permiso de lectura [me @ linuxbox ~] $
less / etc / shadow / etc / shadow: Permiso denegado
passwd - Cambiar la contrasea de un usuario

Los propietarios, miembros del grupo, y todos los dems


Cuando estbamos explorando el sistema de nuevo en el captulo 3, es posible que hayamos
encontrado un problema al intentar examinar un archivo de ejemplo / etc / shadow:
El motivo de este mensaje de error es que, como usuarios regulares, no tenemos permiso para
leer este archivo.
En el modelo de seguridad de Unix, un usuario puede ser propietaria de archivos y
directorios. Cuando un usuario es dueo de un archivo o directorio, el usuario tiene el control
sobre su acceso. Los usuarios pueden, a su vez, pertenecen a un grupo que consiste de uno o
ms usuarios que se les da acceso a los archivos y directorios por parte de sus propietarios.
[Me @ linuxbox ~] $ id
uid = 500 (ME) gid = 500 (ME) grupos = 500 (yo)
Adems de permitir el acceso a un grupo, un propietario tambin podr conceder un conjunto
de derechos de acceso a todo el mundo, lo que en trminos de Unix se conoce como el mundo.
Para obtener informacin acerca de su identidad, utilice el comando id:
Echemos un vistazo a la salida. Cuando se crean las cuentas de usuario, los usuarios se les
[Me @ linuxbox ~] $ id uid = 1000 (yo) gid = 1000 (yo)
grupos = 4 (ADM), 20 (dialout), 24 (cdrom), 25 (disquete), 29 (audio), 30 (inmersin), 44 (v
ideo), 46 (plugdev), 108 (lpadmin), 114 (admin), 1000 (yo)
asigna un nmero llamado un ID de usuario o UID que es entonces, por el bien de los seres
humanos, asignada a un nombre de usuario. El usuario se le asigna un ID de grupo primario o
gid y puede pertenecer a grupos adicionales. El ejemplo anterior es de un sistema Fedora. En
otros sistemas, como Ubuntu, la salida puede tener un aspecto un poco diferente:
Como podemos ver, los nmeros UID y GID son diferentes. Esto es simplemente porque
Fedora inicia su numeracin de cuentas de usuario normal a 500, mientras que Ubuntu se
inicia en 1000. Tambin puede
89

9 - Permisos de ver que el usuario de Ubuntu pertenece a muchos ms grupos. Esto tiene que
ver con la forma en Ubuntu gestiona los privilegios de dispositivos y servicios del sistema.
As que de dnde viene esta informacin? Como tantas cosas en Linux, desde un par de
archivos de texto. Las cuentas de usuario se definen en el archivo / etc / passwd y grupos se
definen en el archivo / etc / group. Cuando se crean las cuentas de usuarios y grupos, estos
archivos se modifican junto con / etc / shadow que contiene informacin acerca de la
contrasea del usuario. Para cada cuenta de usuario, el archivo / etc / passwd define el
usuario (login) nombre, uid, gid, el verdadero nombre de la cuenta, el directorio home, y de
inicio de sesin de shell. Si se examina el contenido de / etc / passwd y / etc / group, te dars
cuenta de que adems de las cuentas de usuarios regulares, hay cuentas de superusuario (uid
0) y otros usuarios del sistema.
En el prximo captulo, cuando cubrimos los procesos, se ver que algunos de estos otros
"usuarios" son, de hecho, bastante ocupado.
Mientras que muchos sistemas Unix asignan los usuarios regulares a un grupo comn como
"usuarios", la prctica moderna de Linux es la creacin de un grupo nico, de un solo
miembro con el mismo nombre que el usuario. Esto hace que ciertos tipos de asignacin de
permisos ms fcil.

La lectura, la escritura, y ejecucin


[Me @ linuxbox ~] $> foo.txt [me @ linuxbox ~] $ ls -l foo.txt
-rw-rw-r-- 1 m me 0 2008-03-06 14:52 foo.txt
Los derechos de acceso a archivos y directorios se definen en trminos de acceso de lectura,
escritura y acceso de ejecucin. Si nos fijamos en la salida del comando ls, podemos obtener
alguna pista sobre cmo esto se implementa:
Los diez primeros caracteres de la lista son los atributos de archivo. El primero de estos
personajes es el tipo de archivo. Aqu estn los tipos de archivos que tienen ms
probabilidades de ver (hay otros tipos menos comunes, tambin):
Tabla 9-1: Tipos de archivo

90

Atributo
-

Tipo de archivo
Un archivo normal.

d
l

Un directorio.
Un enlace simblico. Tenga en cuenta que con enlaces simblicos, los
atributos de archivo restantes son siempre "rwxrwxrwx" y son valores
ficticios. Los atributos de archivo reales son las del archivo de los puntos de
enlace simblico a.

La lectura, la escritura, y ejecucin


c
Un archivo especial de caracteres. Este tipo de archivo se refiere a un
b

dispositivo que maneja los datos como un flujo de bytes, tales como un
terminal o mdem.
Un archivo especial de bloques. Este tipo de archivo se refiere a un
dispositivo que gestiona los datos en bloques, como un disco duro o
unidad de CD-ROM.

El resto de los nueve personajes de los atributos de archivo, llamado el modo de archivo,
representan la lectura, escritura y ejecucin permisos para el propietario del archivo,
propietario del grupo del archivo, y todos los dems:
Propietar
Grupo
Mundo
io

rwx

rwx

rwx

Cuando atributos conjunto, la r, w, x, y de modo tienen el siguiente efecto sobre los archivos y
directorios:
Tabla 9-2: Atributos de permisos

Atributo
r

Archivos
Directorios
Permite que un archivo sea abierto Permite que el contenido de un
y ledo.
directorio para ser listados si
tambin se establece el atributo de
ejecutar.
Permite que un archivo sea escrito Permite a los archivos dentro de
o trunca, sin embargo, este
un directorio para crear, eliminar,
atributo no permite archivos para
cambiar el nombre y si tambin se
cambiar el nombre ni eliminar. La
establece el atributo de ejecutar.
capacidad de eliminar o cambiar el
nombre de los archivos est
determinada por los atributos de
directorio.
Permite que un archivo sea tratado Permite a un directorio para
como un programa y ejecutado.
introducir, por ejemplo, el
Archivos de programa escritos en
directorio cd.
lenguajes de script tambin se
deben configurar como legible
para ser ejecutado.

He aqu algunos ejemplos de configuracin de atributos de archivos:

9 - Permisos

91

Tabla 9-3: Ejemplos de permisos de atributos


Atributos
de Significado
archivo
-rwx ------Un archivo normal que se puede leer, escribir, y ejecutable por el
dueo del archivo. Nadie ms tiene acceso.
-rw -------------Un archivo normal que es de lectura y escritura por el propietario
del archivo. Nadie ms tiene acceso.
-rw-r - r-Un archivo normal que es de lectura y escritura por el propietario
del archivo. Los miembros del grupo propietario del archivo puede
leer el archivo. El archivo es de lectura global.
-rwxr-xr-x
Un archivo normal que se puede leer, escribir, y ejecutable por el
dueo del archivo. El archivo puede ser ledo y ejecutado por todos
los dems.
-rw-rw ---Un archivo normal que es de lectura y escritura por el propietario
del archivo y los miembros del grupo solo propietario del archivo.
lrwxrwxrwx
Un enlace simblico. Todos los enlaces simblicos tienen permisos
"ficticios". Los permisos reales se mantienen con el archivo real al
que apunta el enlace simblico.
drwxrwxUn directorio. El propietario y los miembros del grupo propietario
pueden entrar en el directorio y, crear, renombrar y eliminar
archivos en el directorio.
drwxr-x
Un directorio. El propietario puede entrar en el directorio y crear,
renombrar y borrar archivos en el directorio. Los miembros del
grupo propietario pueden entrar en el directorio, pero no pueden
crear, eliminar o cambiar el nombre de los archivos.

chmod - Cambia el modo de archivo


Para cambiar el modo (permisos) de un archivo o directorio, se utiliza el comando chmod.
Tenga en cuenta que slo el propietario del archivo o el superusuario puede cambiar el modo
de un archivo o directorio. chmod admite dos formas distintas de especificar los cambios de
modo de representacin: nmero octal, o de representacin simblica. Cubriremos
representacin nmero octal primero.

92

La lectura, la escritura, y ejecucin

Qu diablos es octal?
Octal (base 8), y su primo, hexadecimal (base 16) son sistemas numricos a menudo utilizadas
para expresar nmeros en las computadoras. Nosotros, los humanos, debido al hecho de que
nosotros (o al menos la mayora de nosotros) nacimos con diez dedos, cuente el uso de un sistema
de base de 10 nmeros. Computadoras, por otro otro lado, nacieron con un solo dedo y as hacer
todo todo su conteo en binario (base 2). Su sistema numrico slo tiene dos nmeros, 0 y 1. As
que en binario, el conteo se parece a esto:
0, 1, 10, 11, 100, 101, 110, 111, 1000, 1001, 1010, 1011 ...
En octal, el conteo se realiza con los nmeros del cero al siete, as:
0, 1, 2, 3, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15, 16, 17, 20, 21 ...
Conteo hexadecimal utiliza los nmeros del cero al nueve, ms las letras "A" a "F":
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, 10, 11, 12, 13 ...
Si bien podemos ver el sentido en binario (desde los ordenadores slo tienen un dedo),
lo que son buenas octal y hexadecimal? La respuesta tiene que ver con la conveniencia
humana. Muchas veces, las pequeas porciones de datos se representan en las
computadoras como patrones de bits. Tomemos por ejemplo un color RGB. En la
mayora de las pantallas de ordenador, cada pxel se compone de tres componentes de
color: ocho bits de color rojo, ocho bits de color verde, y ocho bits de azul. Un azul
medio precioso sera un nmero de 24 dgitos: 010000110110111111001101
Cmo le gustara a leer y escribir ese tipo de nmeros todo el da? Yo no lo creo. Aqu
es donde otro sistema numrico ayudara. Cada dgito en un nmero hexadecimal
representa cuatro dgitos en binario. En octal, cada dgito representa tres dgitos
binarios. As que nuestro azul medio de 24 dgitos puede ser condensado a un nmero
hexadecimal de seis dgitos:
436FCD
Desde los dgitos en el nmero hexadecimal "line up" con los bits del nmero binario
se puede observar que el componente rojo de nuestro color es 43, el verde 6F, y el CD
azul.
En estos das, la notacin hexadecimal (a menudo pronunciado como "hexagonal") es
ms comn de lo que octal, pero como veremos ms adelante, la capacidad de
expresar octal de tres bits binarios sern muy tiles ...

Con la notacin octal utilizamos nmeros octales para establecer el patrn de permisos
deseados. Dado que cada dgito en un nmero octal representa tres dgitos binarios, esta muy
bien los mapas con el esquema utilizado para almacenar el modo de archivo. Esta tabla
muestra lo que queremos decir:
Tabla 9-4: Modos de archivos en formato binario y octal

Octal

Binario

Modo de archivo
93

9 - Permisos
0

000

---

001

--x

010

-W-

011

WX

100

r--

101

r-x

110

rw-

111

rwx

Mediante el uso de tres dgitos octales, podemos establecer el


modo de archivo para el propietario, el propietario del grupo,
y en el mundo:
TX
[Me @ linuxbox ~] $ > Foo T
[Me @ linuxbox ~] $ ls -l foo .txt
-rw-rw-r-- 1
m
m
0 2008 03-06 14:52 foo TXT
[Me @ linuxbox ~] $ chmo 600 -foo TXT
[Me @ linuxbox ~] $ d
ls -l foo .txt
-rw ----------- 1
m
m
0 2008 03-06 14:52 foo TXT
Al pasar el argumento de "600", hemos sido capaces de establecer los permisos del propietario
de leer y escribir, mientras que la eliminacin de todos los permisos del grupo propietario y el
mundo. Aunque recordando el octal a binario cartografa puede parecer un inconveniente,
por lo general, slo tendr que usar un par de los ms comunes: 7 (rwx), 6 (rw-), 5 (RX), 4 (r--),
y 0 ( ------------------------------------------------------------------------- ).
c h m o d tambin es compatible con una notacin simblica para especificar los modos de
archivo. Notacin simblica se divide en tres partes: que el cambio va a afectar, que la
operacin se llevar a cabo, y lo que el permiso se establecer. Para especificar que se ve
afectada, una combinacin de los caracteres "", "g", "o" y "a" se utilizan de la siguiente
manera:
Tabla 9-5: notacin simblica chmod

Smbolo
u

Significado
Abreviatura de "usuario", pero significa que el propietario del archivo o
directorio.

Propietario del grupo.

Abreviatura de "otros", pero significa el mundo.

un

Abreviatura de "todos". La combinacin de la "u", "g", y "o".

94
La lectura, la escritura, y ejecucin

Si no se especifica un carcter, "todo" ser asumido. La operacin puede ser un signo "+"
indica que un permiso se va a agregar, un "-" indica que un permiso ha de ser quitado, o un
"=", indicando que slo los permisos especificados se van a aplicar y que todos los dems han
de ser eliminado.
Los permisos se especifican con la "r", "w", y caracteres "x". Estos son algunos ejemplos de la
notacin simblica:
Tabla 9-6: chmod Ejemplos notacin simblica

Notacin

Significado

u+x

Aadir permiso de ejecucin para el propietario.

u-x
+X

Retire ejecutar el permiso del propietario.

o-rw
go = rw

u + x, go =
rx

Aadir permiso de ejecucin para el propietario, grupo y mundo.


Equivalente a un + x.
Retire la lectura y escritura permiso a nadie adems del propietario
propietario y grupo.
Ajuste el propietario del grupo y cualquier persona adems del propietario
que ha ledo y permiso de escritura. Si bien el propietario del grupo o del
mundo previamente tenan permisos de ejecucin, que se eliminan.
Agregar permiso de ejecucin para el propietario y establecer los
permisos para el grupo y otros para leer y ejecutar. Mltiples
especificaciones pueden estar separados por comas.

Algunas personas prefieren utilizar la notacin octal, algunas personas les gusta realmente lo
simblico. Notacin simblica s ofrece la ventaja de que le permite establecer un nico
atributo sin molestar a cualquiera de los otros.
Echa un vistazo a la pgina del manual de chmod para obtener ms detalles y una lista de
opciones. Una palabra de precaucin con respecto a la opcin "--recursive": acta sobre los
archivos y directorios, as que no es tan til como es de esperar, ya que, rara vez desee
archivos y directorios que tienen los mismos permisos.

Ajuste de modo de archivo con la GUI


Ahora que hemos visto cmo se establecen los permisos de archivos y directorios, podemos
entender mejor los cuadros de dilogo de permisos en la interfaz grfica de usuario. Tanto en
Nautilus (Gnome) y Konqueror (KDE), haga clic en un icono de archivo o directorio expondr
un dilogo de propiedades. He aqu un ejemplo de KDE 3.5:

9 - Permisos

95

Figura 2: KDE 3.5 Archivo de dilogo de propiedades


Aqu podemos ver los ajustes para el propietario, grupo y mundo. En KDE, haga clic en el
botn "Permisos avanzados" nos lleva a otro cuadro de dilogo que le permite definir cada
uno de los atributos de modo individual. Otra victoria para la comprensin trado a nosotros
por la lnea de comandos!

umask - Establecer permisos predeterminados


El comando umask controla los permisos predeterminados definidos en un archivo cuando se
crea. Utiliza notacin octal para expresar una mscara de bits para ser removido de atributos
del modo de un archivo. Echemos un vistazo:

[Me @ linuxbox ~] $
[Me @ linuxbox ~] $
0002
[Me @ linuxbox ~] $
[Me @ linuxbox ~] $
-rw-rw-r-- 1
m

rm -f foo.txt
umas
k
> Foo TXT
ls -l foo.txt
m
0 2008-03-06 14:53 foo.txt

En primer lugar, eliminamos cualquier copia antigua de foo.txt para asegurarse de que
estbamos empezando fresco. A continuacin, nos encontramos con el comando umask sin
argumentos para ver el valor actual. Responda
96

La lectura, la escritura, y ejecucin

con el valor de 0002 (el valor 0022 es otro valor predeterminado comn), que es la

representacin octal de nuestra mscara. A continuacin creamos una nueva instancia de la


foo.txt archivo y observamos sus permisos.
Podemos ver que tanto el propietario y el grupo obtener el permiso de lectura y escritura,
mientras todos los dems slo obtiene permiso de lectura. La razn de que el mundo no tiene
permiso de escritura se debe a que el valor de la mscara. Vamos a repetir nuestro ejemplo,
esta configuracin de la mscara de tiempo a nosotros mismos:

[Me @ linuxbox ~] $
[Me @ linuxbox ~] $
[Me @ linuxbox ~] $
[Me @ linuxbox ~] $
-rw-rw-rw- 1
m

foo rm .txt
umask 0000
> Foo. TXT
ls -l foo.txt
m
0 2008-03-06 14:58 foo.txt

Cuando establecimos la mscara para 0000 (efectivamente apagarlo), vemos que el archivo ya
est grabable mundo. Para entender cmo funciona esto, tenemos que mirar los nmeros
octales de nuevo. Si tomamos la mscara y expandirlo hasta binario, y luego compararlo con
los atributos que podemos ver lo que sucede:
Modo de archivo
- Rw- rw- rworiginal

Enmascarar
Resultado

000 000 000 010


- Rw- rw- r--

Ignorar por el momento los ceros a la izquierda (vamos a llegar a los de un minuto) y observar
que cuando el 1 aparece en nuestra mscara, atributo este caso, el permiso de escritura en el
mundo se retira. Eso es lo que hace la mscara. Por todas partes un 1 aparece en el valor
binario de la mscara, un atributo no est definido. Si nos fijamos en un valor de mscara de
0022, podemos ver que es lo que hace:

Modo de archivo
original
Enmascarar
Resultado

- Rw- rw- rw000 000 010 010


- R-- r-- rw-

Una vez ms, donde un 1 aparece en el valor binario, el atributo correspondiente no est
definida. Juega con algunos valores (probar algunos sietes) para acostumbrarse a cmo
funciona esto. Cuando haya terminado, no olvide limpiar:

97

9 - Permisos
[Me @ linuxbox ~] foo.txt $ rm; umask 0002
La mayora de las veces usted no tendr que cambiar la mscara; el valor por defecto
proporcionada por su distribucin va a estar bien. En algunas situaciones de alta seguridad,
sin embargo, tendr que controlarlo.

Algunos permisos especiales


A pesar de que por lo general vemos una mscara permiso octal expresado como un
nmero de tres dgitos, es tcnicamente ms correcta de expresarlo en cuatro dgitos.
Por qu? Porque, adems de leer, escribir y ejecutar el permiso, hay algunos otros, la
configuracin de permisos, menos utilizados.
El primero de ellos es el bit setuid (octal 4000). Cuando se aplica a un archivo
ejecutable, que establece el identificador de usuario efectivo de la del usuario real (el
usuario que realmente ejecuta el programa) a la de propietario del programa. Muy a
menudo esto se da a unos pocos programas de propiedad del superusuario. Cuando
un usuario normal ejecuta un programa que es "setuid root", el programa se ejecuta
con los privilegios efectivos del superusuario. Esto permite que el programa para
acceder a los archivos y directorios que un usuario normal normalmente tendra
prohibido el acceso. Claramente, porque esto plantea problemas de seguridad, el
nmero de programas setuid debe mantenerse a un mnimo absoluto.
Ajuste utilizado menos-El segundo es el bit setgid (octal 2000), que, al igual que el bit
setuid, cambia el ID de grupo efectivo de la ID de grupo real del usuario real a la del
propietario del archivo. Si el bit setgid se encuentra en un directorio, los archivos
recin creados en el directorio tendrn la propiedad de grupo del directorio y no la
propiedad del grupo del creador del archivo. Esto es til en un directorio compartido,
cuando los miembros de un grupo comn necesitan tener acceso a todos los archivos
en el directorio, independientemente del grupo principal del propietario del archivo.
La tercera se llama el bit pegajoso (octal 1000). Este es un vestigio de la antigua Unix,
donde era posible marcar un archivo ejecutable como "no intercambiables." En los
archivos, Linux no tiene en cuenta el poco pegajosa, pero si se aplica a un directorio, se
evita que los usuarios eliminen o cambiar el nombre de archivos a menos que el
usuario es o bien el propietario del directorio, el propietario del archivo, o el
superusuario. Esto a menudo se utiliza para controlar el acceso a un directorio
compartido, como por ejemplo / tmp.
He aqu algunos ejemplos de uso de chmod con notacin simblica para establecer
estos permisos especiales. En primer lugar la asignacin de setuid para un programa:
chmod u + s programa A continuacin, asignar setgid en un directorio: dir chmod g +
s
Por ltimo, asignar el bit pegajoso a un directorio:
chmod + t dir

98

Al ver la salida de ls, puede determinar los permisos especiales. He aqu algunos
ejemplos. En primer lugar, un programa que es setuid:
-rwsr-xr-x
Un directorio que tiene el atributo setgid: drwxrwsr-x
Un directorio con el bit pegajoso: drwxrwxrwt
La lectura, la escritura, y ejecucin

Cambio de Identidades
En varias ocasiones, podemos encontrar que es necesario para asumir la identidad de otro
usuario. A menudo queremos ganar privilegios de superusuario para llevar a cabo alguna
tarea administrativa, pero tambin es posible "llegar a ser" otro usuario regular para cosas
tales como pruebas de una cuenta. Hay tres maneras de tomar en una identidad alternativa:
1. Salir y volver a entrar como el usuario alternativo.
2. Utilice el comando su.
3. Utilice el comando sudo.
Vamos a saltar la primera tcnica ya que sabemos cmo hacerlo y que carece de la comodidad
de los otros dos. Desde dentro de nuestra propia sesin de shell, el comando su le permite
asumir la identidad de otro usuario, y, o bien iniciar una nueva sesin de shell con
identificadores de ese usuario, o para emitir un solo comando como ese usuario. El comando
sudo permite a un administrador configurar un archivo de configuracin llamado / etc /
sudoers, y definir comandos especficos que los usuarios particulares estn autorizados a
ejecutar bajo una identidad falsa. La eleccin de el comando a utilizar est determinada en
gran medida por la que Linux la distribucin que utilice. Su distribucin incluye
probablemente ambos comandos, pero su configuracin favorecer ya sea uno o el otro.
Vamos a empezar con su.

do - Ejecutar un depsito de Sustituto de usuario e ID de grupo


Do [- [l]]
[usuario]
El comando su se utiliza para iniciar una shell como otro usuario. La sintaxis del comando es
la siguiente:
Si se incluye la opcin "-l", la sesin de shell resultante es un shell de inicio de sesin para el
usuario especificado. Esto significa que el entorno del usuario se carga y el directorio de
trabajo es

99

9 - Permisos
cambiado en el directorio home del usuario. Esto es por lo general lo que queremos. Si no se
especifica el usuario, se supone que el superusuario. Tenga en cuenta que (curiosamente) la "l"
se puede abreviar "-", que es la forma en que se utiliza con ms frecuencia. Para iniciar un shell
para el superusuario, haramos lo siguiente:

[Me @ linuxbox ~] $ su Password:


[Root @ linuxbox ~] #
Despus de introducir el comando, se nos preguntar por la contrasea de superusuario. Si se
introduce con xito, un nuevo intrprete de comandos aparece que indica que este shell con
privilegios de superusuario (la de salida "#" en lugar de un "$") y el directorio de trabajo actual
es ahora el directorio de inicio para el superusuario (normalmente / root.) Una vez en el
nuevo shell, podemos llevar a cabo comandos como superusuario. Cuando haya terminado,
escriba "exit" para volver a la shell anterior:

[Root @ linuxbox ~] # exit [me


@ linuxbox ~] $
Tambin es posible ejecutar un solo comando en lugar de comenzar un nuevo comando
interactiva mediante el uso de Do esta manera:

'comando' su -c
El uso de este formulario, una sola lnea de comandos se pasa a la nueva cscara para su
ejecucin. Es importante para encerrar el comando entre comillas, ya que no queremos que se
produzca la expansin de nuestra cscara, sino ms bien en el nuevo shell:

[Me @ linuxbox ~] $ su -c 'ls -l / root / *'


Contrasea:
-rw ----------- 1 root root 754 2007-08-11 03:19 /root/anaconda-ks.cfg
/ Root /
Correo: un
total de 0
[Me @ linuxbox ~] $

100

Cambio de
Identidades

sudo - ejecutar un comando como otro usuario


El comando sudo es como su en muchos sentidos, pero tiene algunas capacidades adicionales
importantes. El administrador puede configurar sudo para permitir a un usuario normal para
ejecutar comandos como otro usuario (generalmente el superusuario) de una manera muy
controlada. En particular, un usuario puede estar restringido a uno o ms comandos
especficos y no otros. Otra diferencia importante es que el uso de sudo no requiere el acceso a
la contrasea del superusuario. Para autenticar usando sudo, el usuario utiliza su / su propia
contrasea. Digamos, por ejemplo, que sudo se ha configurado para que podamos ejecutar un
programa de copia de seguridad ficticia llamada "backup_script", que requiere privilegios de
superusuario. Con sudo se hara as:

[Me @ linuxbox ~] $ sudo backup_script


Contrasea:
Sistema de copia de seguridad de arranque ...
Despus de introducir el comando, se nos preguntar por nuestra contrasea (no es el
superusuario de) y una vez que la autenticacin se haya completado, el comando especificado
se lleva a cabo. Una diferencia importante entre su y sudo es que sudo no se inicia un nuevo
shell, ni cargar el entorno de otro usuario. Esto significa que los comandos no necesitan ser
citado de manera diferente de lo que seran sin usar sudo. Tenga en cuenta que este
comportamiento se puede anular especificando distintas opciones. Vea la pgina man sudo
para obtener ms informacin.
Para ver qu privilegios se otorgan a sudo, utilice la opcin "-l" a enumerarlos:
[Me @ linuxbox ~] $ sudo -l
Usuario me puede ejecutar los siguientes comandos en este host:
(ALL) ALL

Ubuntu y sudo
Uno de los problemas recurrentes de los usuarios habituales es cmo realizar ciertas
tareas que requieren privilegios de superusuario. Estas tareas incluyen la instalacin y
actualizacin de software, la edicin de archivos de configuracin del sistema, y los
dispositivos de acceso. En el mundo de Windows, esto se hace a menudo por dar a los
usuarios privilegios administrativos. Esto permite a los usuarios realizar estas tareas.
Sin embargo, tambin permite a los programas ejecutados por el

101

9 - Permisos

usuario tener las mismas habilidades. Esto es deseable en la mayora de los casos, sino
que tambin permite que el malware (software malicioso), como los virus para tener
libre reinado de la computadora. En el mundo Unix, siempre ha habido una divisin
mayor entre los usuarios regulares y administradores, debido a la herencia
multiusuario de Unix. El enfoque adoptado en Unix es otorgar privilegios de
superusuario slo cuando sea necesario. Para ello, los comandos sudo su y son de uso
comn.
Hasta hace unos pocos aos, la mayora de las distribuciones de Linux se bas en Do
para este propsito. Do no requiri la configuracin que requiere sudo, y tener una
cuenta de root es tradicional en Unix. Esto introdujo un problema. Los usuarios se ven
tentados a operar como root sin necesidad. De hecho, algunos usuarios operaban sus
sistemas como el usuario root en exclusiva, ya que elimina todos esos molestos
"permiso denegado" mensajes. Esta es la forma de reducir la seguridad de un sistema
Linux a la de un sistema Windows. No es una buena idea.
Cuando se introdujo Ubuntu, sus creadores tomaron un rumbo diferente. Por defecto,
Ubuntu deshabilita los inicios de sesin a la cuenta de root (al no establecer una
contrasea para la cuenta), y en su lugar utiliza sudo para otorgar privilegios de
superusuario. La cuenta de usuario inicial se concede pleno acceso a privilegios de
superusuario a travs de sudo y podr otorgar poderes similares a las cuentas de
usuario subsiguientes.

chown - Cambiar propietario del archivo y de grupo


El comando chown se utiliza para cambiar el propietario propietario y el grupo de un archivo
o directorio. Se requieren privilegios de superusuario para utilizar este comando. La sintaxis
de chown se parece a esto:

chown [propietario] [: [grupo]]


archivo ...
chown puede cambiar el propietario del archivo y / o el propietario del
grupo de archivos en funcin del primer argumento del comando. He
aqu algunos ejemplos:
Tabla 9-7: Ejemplos de argumentos chown

Argumento
bob

Resultados
Cambia la propiedad del archivo de su actual propietario de la sacudida
de usuario.

bob:
usuarios

Cambia la propiedad del archivo de su actual propietario de la sacudida


de usuario y cambia el propietario del grupo de archivos a los usuarios
del grupo.

102

Cambio de
Identidades
: los
administr
adores
bob:

Cambia el propietario del grupo para los administradores de grupo. El


propietario del archivo no se ha modificado.
Cambie el propietario del archivo desde el actual propietario de la
sacudida de usuario y cambia el propietario del grupo para el grupo de
inicio de sesin del usuario bob.
[Janet @ linuxbox ~] $ sudo miarchivo.txt cp ~ tony
Contrasea:
[Janet @ linuxbox ~] $ sudo ls -l ~ tony / miarchivo.txt
-rw-r - r-- 1 root root [janet @ 8031 2008-03-20 14:30 /home/tony/myfile.txt chown
linuxbox ~] $ sudo [janet @ tony: ~ tony / miarchivo.txt ls -l ~ tony / miarchivo.txt
linuxbox ~] $ sudo -rw-r - r-- 1 8031 2008-03-20 14:30 /home/tony/myfile.txt
tony tony
Digamos que tenemos dos usuarios; janet, quin tiene acceso a privilegios de superusuario y
Tony, que no lo hace. Usuario janet quiere copiar un archivo de su directorio home al
directorio principal de usuario tony. Desde usuario janet quiere tony para poder editar el
archivo, janet cambia la propiedad del archivo copiado de janet a tony:
Aqu vemos usuario janet copiar el archivo de su directorio para el directorio de inicio del
usuario tony. A continuacin, janet cambia la propiedad del archivo de la raz (resultado del
uso de sudo) a tony. El uso de los dos puntos de fuga en el primer argumento, janet tambin
cambi la propiedad de grupo del archivo en el grupo de inicio de sesin de tony, que pasa a
ser grupo tony.
Tenga en cuenta que despus del primer uso de sudo, janet no fue motivada por su
contrasea? Esto se debe a que sudo, en la mayora de las configuraciones, "confa" usted
durante varios minutos hasta que su tiempo llega a cero.

chgrp - Cambia Propiedad del Grupo


En versiones antiguas de Unix, el comando chown slo cambi la propiedad del archivo, no la
propiedad de grupo. Para ello, un comando separado, se utiliz chgrp. Funciona de la misma
manera como chown, excepto por ser ms limitada.

El ejercicio de nuestros privilegios


Ahora que ya hemos aprendido cmo funciona esta cosa permisos, es el momento de
demostrar que fuera. Vamos a demostrar la solucin a un problema comn de fijacin de un
directorio compartido. Imaginemos que tenemos dos usuarios llamado "proyecto de ley" y
"karen". Ambos tienen colecciones de CD de msica y desean crear un directorio compartido,
donde sern cada almacenar su
103

9 - Permisos de archivos de msica como Ogg Vorbis o MP3. Proyecto de ley de usuario tiene
acceso a privilegios de superusuario a travs de sudo.
Lo primero que tiene que ocurrir es la creacin de un grupo que tendr tanto factura y karen
como miembros. El uso de la herramienta grfica de gestin de usuarios, proyecto de ley crea
un grupo llamado msica y aade usuarios factura y karen a la misma:

Figura 3: Creacin de un nuevo grupo con GNOME


[Factura @ linuxbox ~] $ sudo mkdir / usr / local / share / Msica
Contrasea:

A continuacin, proyecto de ley crea el directorio para los archivos de msica:


Desde factura est manipulando los archivos fuera de su directorio personal, se requieren
[Factura @ linuxbox ~] $ ls -ld / usr / local / share / Msica
drwxr-xr-x 2 root root 4096 2008-03-21 18:05 / usr / local / share /
Msica
privilegios de superusuario. Una vez creado el directorio, que tiene las siguientes propiedades
y permisos:
Como podemos ver, el directorio es propiedad de root y tiene 755 permisos. Para hacer este
directorio compartible, proyecto de ley tiene que cambiar la propiedad de grupo y los
permisos de grupo para permitir la escritura:

104

[Factura @ linuxbox ~] $ sudo chown: msica / usr / local / share / Msica [factura @
linuxbox ~] $ sudo chmod 775 / usr / local / share / Msica [factura @ linuxbox ~] $ ls -ld /
usr / local / share / Msica
msica drwxrwxr-x root 2 4096 03/21/2008 18:05 / usr / local / share / Msica
El ejercicio de nuestros privilegios
Entonces, qu significa todo esto? Esto significa que ahora tenemos un directorio, / / share /
Msica local / usr que es propiedad de la raz y con programas de lectura y escritura a la
msica del grupo. Music Group cuenta con miembros factura y karen, as factura y karen
puede crear archivos en el directorio / usr / local / share / Msica. Otros usuarios pueden
listar el contenido del directorio, pero no pueden crear archivos all.
[Factura @ linuxbox ~] $> / usr / local / share / Msica / archivo_prueba
[factura @ linuxbox ~] $ ls -l / usr / local / share / Msica
-rw-r - r-- 1 proyecto de ley proyecto de ley 0 03/24/2008 20:03
archivo_prueba
Pero todava tenemos un problema. Con los permisos actuales, archivos y directorios creados
dentro del directorio de la Msica tendr los permisos normales de la factura de los usuarios y
karen:
En realidad hay dos problemas. En primer lugar, el umask por defecto en este sistema es 0022
que impide que los miembros del grupo de escritura de archivos pertenecientes a otros
miembros del grupo. Esto no sera un problema si el directorio compartido slo contena
archivos, pero desde este directorio va a almacenar la msica, y la msica est organizada por
lo general en una jerarqua de los artistas y los lbumes, los miembros del grupo tendr la
capacidad de crear archivos y directorios dentro de directorios creado por otros miembros.
Tenemos que cambiar el umask utilizado por factura y karen de 0002 en su lugar.
[Factura @ linuxbox ~] $ sudo chmod g + s / usr / local / share / Msica [factura @
linuxbox ~] $ ls -ld / usr / local / share / Msica
msica drwxrwsr-x root 2 4096 2008-03-24 20:03 / usr / local / share / Msica
En segundo lugar, cada archivo y directorio creado por uno de los miembros se establecern
en el grupo primario del usuario en lugar de la msica del grupo. Esto se puede solucionar
configurando el bit setgid en el directorio:
Ahora ponemos a prueba para ver si los nuevos permisos de solucionar el problema. proyecto
de ley establece su umask en 0002, elimina el archivo de prueba anterior, y crea un nuevo
[Factura @ linuxbox ~] $ umask 0002
archivo de prueba y el directorio:

105

9 - Permisos
[Factura @ linuxbox ~] $ rm / usr / local / share / Msica / archivo_prueba
[factura @ linuxbox ~] $> / usr / local / share / Msica / archivo_prueba
[factura @ linuxbox ~] $ mkdir / usr / local / share / Msica / test_dir
[factura @ linuxbox ~] $ ls -l / usr / local / share / Msica
drwxrwsr-x 2 proyecto de ley de la msica 4096 2008-03-24 20:24
test_dir -rw-rw-r-- msica 1 proyecto de ley 0 03/24/2008 20:22
archivo_prueba [factura @ linuxbox ~] $
Ambos archivos y directorios se crean ahora con los permisos correctos para permitir que
todos los miembros del grupo de msica para crear archivos y directorios dentro del
directorio de la msica.
La cuestin pendiente es umask. El ajuste necesario slo dura hasta el final de la sesin y se
debe restablecer. En el captulo 11, vamos a ver lo que el cambio de umask permanente.

Cambio de la contrasea
El ltimo tema que vamos a cubrir en este captulo es establecer contraseas para ti mismo (y
para los dems usuarios, si tiene acceso a privilegios de superusuario.) Para establecer o
cambiar una contrasea, se utiliza el comando passwd. La sintaxis del comando es la
siguiente:

passwd
[usuario]
Para cambiar su contrasea, basta con introducir el comando passwd. Se le pedir su
contrasea antigua y su nueva contrasea:

[Me @ linuxbox ~] $ passwd


(actual) contrasea de UNIX:
New UNIX password:
El comando passwd tratar de hacer cumplir el uso de contraseas "fuertes". Esto significa que
se negar a aceptar contraseas que son demasiado cortos, demasiado similar a contraseas
anteriores, son las palabras del diccionario, o son demasiado fcil de adivinar:

[Me @ linuxbox ~] $ passwd (actual)


contrasea de UNIX:
Nueva contrasea de UNIX:
Contrasea incorrecta: es demasiado similar a la
antigua contrasea de un solo Nueva UNIX:
Contrasea incorrecta: es demasiado corto

106

Nueva contrasea de UNIX:


Contrasea incorrecta: se basa en una palabra del
diccionario
Cambio de la contrasea
Si tiene privilegios de superusuario, puede especificar un nombre de usuario como argumento
para el comando passwd para establecer la contrasea de otro usuario. Otras opciones estn
disponibles para el superusuario para permitir cuenta de bloqueo, caducidad de la contrasea,
etc. Consulte la pgina de manual de passwd para ms detalles.

Resumiendo
En este captulo hemos visto cmo los sistemas de tipo Unix como Linux administrar los
permisos de usuario para permitir la lectura, escritura y acceso de ejecucin a los archivos y
directorios. Las ideas bsicas de este sistema de permisos se remontan a los primeros das de
Unix y se han mantenido bastante bien a la prueba del tiempo. Pero el mecanismo de permisos
nativos en sistemas tipo Unix carece de la granularidad fina de los sistemas ms modernos.

Lectura adicional

Wikipedia tiene un buen artculo sobre el


malware:
http://en.wikipedia.org/wiki/Malware

Hay una serie de programas de lnea de comandos que se utilizan para crear y mantener
usuarios y grupos. Para obtener ms informacin, consulte las pginas man de los comandos
siguientes:

adduser

useradd

groupadd

107

10 - Procesos

10 - Procesos
Los sistemas operativos modernos son multitarea por lo general, lo que significa que crean la
ilusin de hacer ms de una cosa a la vez cambiando rpidamente de una ejecucin de
programa a otro. El ncleo de Linux gestiona esto a travs de la utilizacin de procesos. Los
procesos son cmo Linux organiza los diferentes programas en espera de su turno en la CPU.
A veces un equipo se convierta en lento o una aplicacin dejar de responder. En este captulo,
vamos a ver algunas de las herramientas disponibles en la lnea de comandos que nos
permiten examinar qu programas estn haciendo, y cmo poner fin a los procesos que se
portan mal.
Este captulo introducir los siguientes comandos:

ps - Informar de una instantnea de los procesos actuales

tareas de visualizacin - trivago

p u e s t o s d e t r a b a j o - Lista de trabajos activos

bg - Coloque un trabajo en segundo plano

fg - Coloque un puesto de trabajo en el primer plano

m a t a r - Enviar una seal a un proceso

k i l l a l l - Kill procesos por nombre

c i e r r e - Apagar o reiniciar el sistema

Cmo un proceso funciona


Cuando un sistema se pone en marcha, el kernel inicia algunas de sus propias actividades
como procesos y pone en marcha un programa llamado init. init, a su vez, se ejecuta una serie
de scripts de shell (que se encuentra en / etc) llamado guiones de inicio, que se inicia todos los
servicios del sistema. Muchos de estos servicios se implementan como programas demonio,
programas que simplemente se sientan en el fondo y hacer sus cosas sin tener ninguna interfaz
de usuario. As que incluso si no se ha identificado, el sistema es al menos un poco ocupado
realizando cosas de rutina.
El hecho de que un programa puede poner en marcha otros programas se expresa en el
esquema de proceso como un proceso padre producir un proceso hijo.
108

Cmo un proceso funciona


El ncleo mantiene informacin acerca de cada proceso para ayudar a mantener las cosas
organizadas. Por ejemplo, cada proceso se le asigna un nmero llamado ID del proceso o PID.
PIDs se asignan en orden ascendente, con init siempre conseguir PID 1. El ncleo tambin
mantiene un registro de la memoria asignada a cada proceso, as como la preparacin de los
procesos 'para continuar con la ejecucin. Al igual que los archivos, los procesos tambin

[Me @ linuxbox ~] $ ps
PID TTY
TIEMPO CMD
5.198 pts / 1
00:00:00 Bash
10.129 pts / 1
00:00:00 ps
tienen propietarios y los ID de usuario, ID de usuario eficaces, etc.

Visualizacin de Procesos
El comando ms utilizado para los procesos de visin (hay varios) es ps. El programa ps tiene
un montn de opciones, pero en forma ms simple que se usa de esta manera:
El resultado en este ejemplo se enumeran dos procesos, proceso de 5198 y el proceso 10129,
que son bash y ps respectivamente. Como podemos ver, por defecto, ps no nos muestran
mucho, slo los procesos asociados a la sesin de terminal actual. Para ver ms, tenemos que
aadir algunas opciones, pero antes de hacer eso, echemos un vistazo a los otros campos
producidos por ps. TTY es la abreviatura de "teletipo", y se refiere a la terminal de control para
el proceso. Unix est mostrando su edad aqu. El campo de hora es la cantidad de tiempo de
CPU consumido por el proceso. Como podemos ver, ni proceso hace que el trabajo de equipo
muy duro.
Si aadimos una opcin, podemos obtener una visin ms amplia de lo que el sistema est
haciendo:
[Me @ linuxbox ~ ] $ Ps x
PID TTY
STA TIEMPO COMANDO
T
2799 ?
Ssl
0 00 / Usr / libexec / bonobo-activacin-servidor -AC
Sl
2820 ?
0 01 /usr/libexec/evolution-data-server-1.10 15647 ?
Ss
0 00 / Bin / sh / usr / bin / startkde
15751 ?
Ss
0 00 / Usr / bin / ssh-agent / usr / bin / dbus-launch 15754 ?
S
0 00 / Usr / bin / dbus-launch --exit-con-sesin
15755 ?
Ss
0 01 / Bin / dbus-daemon --fork --print-pid 4 -pr
15774 ?
Ss
0 02 / -daemon Usr / bin / gpg-agent -s
15793 ?
S
0 00 start_kdeinit --new-startup + kcminit_start
15794 ?
Ss
0 00 kdeinit Correr ...
15797 ?
S
dcopserver -nosid
0 00
y muchos ms.

109

10 - Procesos

Adicin de la opcin "x" (tenga en cuenta que no hay guin lder) le dice a ps para mostrar
todos nuestros procesos, independientemente de lo que el terminal (si lo hay) que son
controlados por. La presencia de un "?" En la columna TTY indica que no hay terminal de
control. Usando esta opcin, vemos una lista de todos los procesos que poseemos.
Dado que el sistema est ejecutando una gran cantidad de procesos, ps produce una larga
lista. A menudo es til para canalizar la salida de ps en menos para facilitar la visualizacin.
Algunas combinaciones de opciones tambin producen largas colas de salida, por lo que
maximiza la ventana de emulador de terminal puede ser una buena idea, tambin.
Una nueva columna titulada STAT ha sido aadido a la salida. STAT es la abreviatura de
"Estado" y revela el estado actual del proceso:
Tabla 10-1: Estados Proceso

Estado
R
S
D

T
Z
<

Significado
Correr. Esto significa que el proceso se est ejecutando o listos para
funcionar.
Dormir. El proceso no se est ejecutando; ms bien, est esperando un
evento, tal como un paquete de pulsaciones de teclas o de red.
El sueo ininterrumpida. Proceso de espera de E / S, como una unidad
de disco.
Detenido. Proceso ha sido instruido para detener. Ms sobre esto ms
adelante.
Un proceso "zombie" o desaparecida. Este es un proceso hijo que ha
terminado, pero no ha sido limpiado por su padre.
Un proceso de alta prioridad. Es posible conceder ms importancia a un
proceso, dndole ms tiempo a la CPU. Esta propiedad de un proceso se
llama amabilidad. Un proceso con prioridad alta se dice que es menos
agradable porque est tomando ms tiempo de la CPU, lo que deja
menos para todos los dems.
Un proceso de baja prioridad. Un proceso con prioridad baja (un
proceso "bonito") slo obtendr el tiempo de procesador despus de
haber mantenido otros procesos con mayor prioridad.

El estado de proceso puede ser seguido por otros caracteres. Estos indican diversas
caractersticas del proceso exticos. Vea la pgina man ps para obtener ms detalles.
Otra serie popular de las opciones es "aux" (sin un guin que lleva). Esto nos da an ms
informacin:

110

Visualizacin de Procesos

LU

SR

Q
1-I
CL

[Me @ linuxbox ~] $ ps aux


USUA
%
RIO
raz
1 UPC
0.0 0.0
raz
2 0.0 0.0
raz
3 0.0 0.0
raz
4 0.0 0.0
raz
5 0.0 0.0
raz
6 0.0 0.0
raz
7 0.0 0.0

VSZ
2136
0
0
0
0
0
0

RSS TTY
644 ?
0?
0?
0?
0?
0?
0?

STAT INICIO
Ss
Mar05
S < Mar05
S < Mar05
S < Mar05
S < Mar05
S < Mar05
S < Mar05

TIE COMAN
Doce
MPO DO
init
y
[Tonelad
0:00
treint [Mi]
as]
0:00
a
y [Ks]
0:00
uno
0:06 [Wa]
Doce [EV]
y0:00 [Kh]
treint
ay
seis

y muchos ms ...
Este conjunto de opciones muestra los procesos correspondientes a cada usuario. Uso de las
opciones sin que el tablero principal invoca el comando con el comportamiento "estilo BSD".
La versin para Linux de ps puede emular el comportamiento del programa ps encontrado en
varios diferentes implementaciones de Unix. Con estas opciones, obtenemos estas columnas
adicionales:
Tabla 10-2: Estilo BSD ps encabezados de columna
Encabezami
Significado
ento
USUARIO

ID (identificacin) de usuario. Este es el propietario del proceso.

% UPC

Uso de la CPU en porcentaje.

% MEM

El uso de memoria en porcentaje.

VSZ
RSS

Tamao de la memoria virtual.

INICIO

Residente Tamao Configurar. La cantidad de memoria fsica (RAM) el


proceso est utilizando en kilobytes.
Momento en que el proceso comenz. Para los valores de ms de 24
horas, se utiliza una fecha.

Viendo Procesos dinmicamente con la parte superior


Mientras que el comando ps puede revelar mucho acerca de lo que la mquina est haciendo,
proporciona slo una instantnea del estado de la mquina en el momento en que se ejecute el
comando ps. Para ver una visin ms dinmica de la actividad de la mquina, se utiliza el
comando top:
[Me @ linuxbox ~] $ arriba

111

10

- Procesos

El programa de la parte superior muestra una actualizacin continua (por defecto, cada 3
segundos) la visualizacin de los procesos del sistema que figuran en el orden de actividad del
proceso. El nombre de "arriba" viene del hecho de que el programa de la parte superior se
utiliza para ver los procesos "top" en el sistema. La pantalla superior se compone de dos
partes: un resumen del sistema en la parte superior de la pantalla, seguido por una mesa de
procesos ordenados por la actividad de la CPU:

El resumen del sistema contiene un montn de cosas buenas. He aqu


un resumen: Tabla 10-3: top Campos de informacin

Fila Campo

Significado

1 arriba

Nombre del programa.

112

2 usuarios
promedio de
carga:

Colorado

Colorado

P.

14:59:20

Hora del da.


Esto se conoce como el tiempo de actividad. Es la
cantidad de tiempo que la mquina se inicia
pasado. En este ejemplo, el sistema ha estado
funcionando durante seis horas y media.
Hay dos usuarios ingresados.
Promedio de carga se refiere al nmero de procesos

CD
Colo
rado

CD

la parte 14:59 : 20 up
, 2 usuarios,
carg media: 0.
07, 0,02,
superior
a
Tareas- 109 total
1
0 detuvo, 2
! zombi
, 106 dormir,
:
consecutivo
Cpu
: 0.
7% , 1 0,0%
sy, 0. 0% de 98. Identifica 0,0%
0.0% hi, 0.0% si
(s)
noso total
Ni, utiliza, cin del 4636k
wa, libre, 19392k aficionado
Mem:
319496k
314860k
tros total
Intercam 875500k
149128k utiliza, 3%, 0
726372k libre, cach 114676k
bio:
PID USUA
PR
NI VIRT RES SHR S %
%
TIEMP COMANDO
RIO
MEM 16:O24.42
+
6244 m
39
19 31752 3124 2188 S UPC
6.3 1.0
trackerd
11071 m
20
0 2304 1092 840 R 1.3 0,3
0: 00.14 superior
0,7 0,3
0: 03,66 dbus-dae
6180 m
20
0 2700 1100 772 S
6321 m
0,7 2.3
2: 51.38
multiloa
20
0 20944 7248 6560 S
4955 raz
20
0 104m 9668 5776 S
0,3 3.0
2: 19.39 Xorg
0: 03.14 init
1 raz
20
0 2976 528 476 S
0.0 0,2
raz
15
-5
S
0: 00.00 kthreadd
2
0
0
0
0.0 0.0
3 raz
RT
-5
0
0
0S
0.0 0.0
0: 00.00
Migratio
4 raz
15
-5
0: 00,72
ksoftirq
0
0
0S
0.0 0.0
5 raz
RT
-5
0: 00.04
perro
0
0
0S
0.0 0.0
guardin/
15
-5
0: 00.42 eventos
6 raz
0
0
0S
0.0 0.0
7 raz
15
-5
0
0
0S
0.0 0.0
0: 00.06 khelper 0
41 raz
15
-5
0: 01.08 kblockd /
0
0
0S
0.0 0.0
67 raz
15
-5
0
0
0S
0.0 0.0
0: 00.00 kseriod
114 raz
0: 01.62 pdflush
20
0
0
0
0S
0.0 0.0
raz
15
-5
S
0: 02,44 kswapd0
116
0
0
0
0.0 0.0

Visualizacin de Procesos

2
3

Tareas:
Cpu (s):
0,7% con
nosotros
1,0% sy
0.0% de Ni
Identificacin
del 98,3%

4
5

que estn a la espera para funcionar, es decir, el


nmero de procesos que se encuentran en un
estado ejecutable y estn compartiendo la CPU.
Tres valores se muestran, cada una por un perodo
de tiempo diferente. La primera es la media de los
ltimos 60 segundos, los prximos de los 5
minutos anteriores, y finalmente los 15 minutos
anteriores. Los valores menores de 1,0 indican que
la mquina no est ocupado.
Esto resume el nmero de procesos y sus
diferentes estados del proceso.
Esta fila describe el carcter de las actividades que
la CPU est realizando.
0,7% de la CPU est siendo utilizado para los
procesos de usuario. Esto significa que los procesos
fuera del ncleo en s.
1,0% de la CPU se est utilizando para procesos del
sistema (kernel).
0.0% de la CPU est siendo utilizado por los
procesos "nice" (prioridad baja).
98,3% de la CPU est inactivo.

0.0% wa

0.0% de la CPU est a la espera para E / S.

Mem:
Intercambio:

Muestra cmo fsica RAM se est utilizando.


Muestra cmo se est utilizando el espacio de
intercambio (memoria virtual).

El programa acepta la parte superior una serie de comandos de teclado. Los dos ms
interesantes son h, que muestra la pantalla de ayuda del programa, y q, que cierra la parte
superior.
Ambos principales entornos de escritorio proporcionan las aplicaciones grficas que muestran
informacin similar a arriba (de la misma manera que el Administrador de tareas en Windows
funciona), pero me parece que la parte superior es mejor que las versiones grficas, ya que es
ms rpido y que consume muchos menos recursos del sistema. Despus de todo, nuestro
programa de monitor del sistema no debe ser la fuente de la lentitud del sistema que estamos
tratando de rastrear.

El control de procesos
Ahora que podemos ver y controlar los procesos, vamos a ganar un poco de control sobre
ellos. Para nuestro
113

10 - Procesos experimentos, vamos a utilizar un pequeo programa llamado xlogo como


nuestro conejillo de indias. El programa xlogo es un programa de ejemplo que se suministra
con el Sistema de Ventanas X (el motor subyacente que hace que los grficos en nuestro ir de
[Me @ linuxbox ~] $ xlogo
visualizacin) que simplemente muestra una ventana nueva de tamao considerable que
contiene el logotipo de X. En primer lugar, vamos a llegar a conocer a nuestro sujeto de
prueba:
Despus de introducir el comando, una pequea ventana que contiene el logotipo debe
aparecer en algn lugar de la pantalla. En algunos sistemas, puede xlogo imprimir un mensaje
de advertencia, pero puede ser ignorado con seguridad.

Consejo: Si su sistema no incluye el programa xlogo, trate de usar gedit o kwrite lugar.
Podemos comprobar que se est ejecutando xlogo redimensionando su ventana. Si se vuelve a
dibujar el logotipo en el nuevo tamao, el programa se est ejecutando.
Observe cmo no ha vuelto nuestro intrprete de comandos? Esto se debe a que la cscara est
esperando a que el programa termine, igual que todos los otros programas que hemos
utilizado hasta ahora. Si cerramos la ventana xlogo, los rpidos retornos.

Interrupcin de un proceso
Observemos lo que ocurre cuando nos encontramos xlogo nuevo. En primer lugar, entre el
[Me @ linuxbox ~] $ xlogo
[me @ linuxbox ~] $
mandato xlogo y verifique que el programa se est ejecutando. A continuacin, volver a la
ventana de terminal y pulse Ctrl-c.
En una terminal, al pulsar Ctrl-c, interrumpe un programa. Esto significa que cortsmente le
pedimos al programa para terminar. Despus presionamos Ctrl-c, la ventana xlogo cerrado y
el intrprete de comandos devuelve.
Muchos (pero no todos) los programas de lnea de comandos se pueden interrumpir mediante
el uso de esta tcnica.

Poner un proceso en segundo plano


Digamos que queramos conseguir el intrprete de comandos de nuevo sin necesidad de
terminar la xlogo pro114

El control de procesos
gramo. Haremos esto mediante la colocacin del programa en el fondo. Piense en el terminal
[Me @ linuxbox ~] $ xlogo y [1]
28.236 [me @ linuxbox ~] $
como tener un primer plano (con la materia visible en la superficie como el intrprete de
comandos) y un fondo (con cosas ocultas detrs de la superficie). Para iniciar un programa de
manera que se coloca inmediatamente en el fondo, seguimos el comando con an- carcter "&":
Despus de introducir el comando, la ventana xlogo apareci y el intrprete de comandos
regres, pero algunos nmeros divertidos se imprimieron tambin. Este mensaje es parte de
una funcin de shell llamado control de trabajos. Con este mensaje, el shell nos est diciendo
que hemos empezado el trabajo nmero 1 ("[1]") y que tiene PID 28236. Si corremos ps,
podemos ver nuestro proceso:

[Me @ linuxbox ~] $ Ps
PID TTY
TIEMPO CMD
10.603 pts / 1
00:00:00 Bash
28.236 pts / 1
00:00:00 xlogo
28.239 pts / 1
00:00:00 ps
Instalacin de control de trabajo de la cscara tambin nos da una manera de enumerar los
puestos de trabajo que se han lanzado desde nuestro terminal. Utilizando el comando trabajos,
podemos ver esta lista:

[me @ linuxbox ~] $ empleos


[1] + Running

xlogo y

Los resultados muestran que tenemos un puesto de trabajo, el nmero "1", que se est
ejecutando, y que la orden era xlogo y.

Volviendo un proceso para el primer plano


Un proceso en el fondo es inmune a la entrada de teclado, incluyendo cualquier intento de
interrupcin con un Ctrl-c. Para devolver un proceso en primer plano, utilice el comando fg,
de esta manera:

[me @ linuxbox ~] $ empleos


[1] + Running [me @ linuxbox ~]
$ fg% 1

xlogo y

115

xlogo
10 - Procesos
El fg comando seguido de un signo de porcentaje y el nmero de trabajo (llamado espectrab)
hace el truco. Si slo tenemos un trabajo en segundo plano, la espectrab es opcional. Para
terminar ogo XL-, pulse Ctrl-c.

Parada (pausa) Proceso A


A veces vamos a querer detener un proceso sin darlo por terminado. Esto se hace a menudo
para permitir un proceso de primer plano para mover a un segundo plano. Para detener un
proceso en primer plano, pulse Ctrl-z. Vamos a intentarlo. En el smbolo del sistema, escriba
xlogo, la tecla Intro, a continuacin, Ctrl-z:

[Me @ linuxbox ~] $ xlogo


[L] + Stopped [me @ linuxbox ~]
$

xlogo

Despus de parar xlogo, podemos verificar que el programa se haya detenido por el intento de
[Me @ linuxbox ~] $ bg% 1
[l] + xlogo y [me @ linuxbox
~] $
cambiar el tamao de la ventana xlogo. Veremos que parece bastante muerto. Podemos o bien
restaurar el programa al primer plano, con el comando fg, o mover el programa a un segundo
plano con el comando bg:
Al igual que con el comando fg, la espectrab es opcional si slo hay un puesto de trabajo.
Traslado de un proceso desde el primer plano hasta el fondo es muy til si lanzamos un
programa grfico del comando, pero olvidamos que colocarlo en el fondo aadiendo el
arrastre "&".
Por qu quieres poner en marcha un programa grfico de la lnea de comandos? Hay dos
razones. En primer lugar, el programa que desea ejecutar no podra estar listado en los mens
del gestor de ventanas (como xlogo). En segundo lugar, con el lanzamiento de un programa
desde la lnea de comandos, es posible que pueda ver los mensajes de error que de otro modo
seran invisibles si el programa se puso en marcha de forma grfica. A veces, un programa no
se podr iniciar cuando se inicia desde el men grfico. Con el lanzamiento desde la lnea de
comandos en lugar, podemos ver un mensaje de error que revelar el problema. Adems,
algunos programas grficos tienen muchas opciones de lnea de comandos interesantes y
tiles.
116

[Me @ linuxbox ~] $ xlogo y


[1] 28401
[Me @ linuxbox ~] $ kill 28401
[1] + Terminado

xlogo

Seales

Seales
El comando kill se usa para "matar" los procesos. Esto nos permite dar por terminado los
programas que necesitan matar. He aqu un ejemplo:
Primero lanzamos xlogo en el fondo. La concha imprime el espectrab y el PID del proceso en
segundo plano. A continuacin, utilizamos el comando kill y especificamos el PID del proceso
que queremos terminar. Tambin podramos haber especificado el procedimiento utilizando
un espectrab (por ejemplo, "% 1") en lugar de un PID.
Si bien todo esto es muy sencillo, no hay ms que eso. El comando kill no exactamente "matar"
a los procesos, sino que los enva seales. Las seales son una de las varias formas en que el
sistema operativo se comunica con los programas. Ya hemos visto seales en la accin con el
uso de Ctrl-C y Ctrl-z. Cuando el terminal recibe una de estas pulsaciones de teclado, se enva
una seal al programa en el primer plano. En el caso de Ctrl- c, una seal de llamada INT
(Interrupt) se enva; con Ctrl-Z, una seal de llamada TSTP (Terminal de parada). Programas,
a su vez, "escuchar" para seales y pueden actuar sobre ellos a medida que se reciben. El hecho
de que un programa se puede escuchar y actuar sobre las seales permite que un programa
para hacer cosas como guardar el trabajo cuando se enva una seal de terminacin.

El envo de seales a los procesos con kill


matar [-seal] PID ...
El comando kill se usa para enviar seales a los programas. Su sintaxis ms comn es la
siguiente:
Si no se especifica ninguna seal en la lnea de comandos, a continuacin, la seal TERM
(Terminar) se enva por defecto. El comando kill se usa ms a menudo para enviar las
siguientes seales:
Tabla 10-4: Seales Comunes
Nmero
Nombre
1

HUP

Significado
Colgar. Se trata de un vestigio de los viejos tiempos,
cuando los terminales se unen a distancia

117

10 - Procesos
computadoras con lneas telefnicas y mdems. La
seal se utiliza para indicar a los programas que la
terminal de control ha "colgado". El efecto de esta
seal se puede demostrar mediante el cierre de una
sesin de terminal. El programa se ejecuta en primer
plano de la terminal se enviar la seal y har que
cesen.

INT

MATANZA

15

PLAZO

18
19

118

CONT
Detngase

Esta seal tambin es utilizado por muchos


programas demonio para causar una reinicializacin.
Esto significa que cuando un demonio se enva esta
seal, se reiniciar y volver a leer su archivo de
configuracin. El servidor Web Apache es un ejemplo
de un demonio que utiliza la seal HUP de esta
manera.
Interrumpir. Realiza la misma funcin que la tecla
Ctrl-c enviada desde la terminal. Por lo general, se
terminar un programa.
M a t a r . Esta seal es especial. Considerando que los
programas pueden optar por manejar seales
enviadas a ellos de diferentes maneras, incluyendo
ignorando a todos juntos, la seal KILL nunca se
envi realmente el programa de destino. Ms bien, el
kernel termina inmediatamente el proceso. Cuando
un proceso se termina de esta manera, se le da
ninguna oportunidad de "limpiar" de s mismo o
guardar su trabajo. Por esta razn, la seal KILL slo
debe utilizarse como ltimo recurso cuando otras
seales de terminacin fallan.
Terminar. Esta es la seal por defecto enviado por el
comando kill. Si un programa es todava "vivo" lo
suficiente como para recibir seales, se terminar.
Continuar. Esto restaurar un proceso despus de una
seal de STOP.
Detngase. Esta seal provoca un proceso para hacer
una pausa sin terminar. Al igual que la seal KILL, no
se enva al proceso de destino, y por lo tanto no puede
ser ignorada.

[Me @ linuxbox ~] $ xlogo y


[1] 13 546
[Me @ linuxbox ~] $ kill -1 13546 [1] + Colgar
xlogo

Seales

[Me @ linuxbox ~] $ xlogo y


[1] 13 601
[Me @ linuxbox ~] $ mato -INT 13601 [1] +
Interrupcin
xlogo
[Me @ linuxbox ~] $ xlogo y
[1] 13 608
[Me @ linuxbox ~] $ mato -SIGINT 13608
[1] + Interrupt
xlogo
Vamos a probar el comando kill:
En este ejemplo, comenzamos el programa xlogo en el fondo y luego lo enviamos una seal
HUP con kill. El programa xlogo termina y la cubierta indica que el proceso de fondo ha
recibido una seal de colgar. Es posible que tenga que pulsar la tecla enter un par de veces
antes de que aparezca el mensaje. Tenga en cuenta que las seales pueden ser especificados ya
sea por nmero o por nombre, incluyendo el nombre prefijado con las letras "SIG":
Repita el ejemplo anterior y probar las otras seales. Recuerde, usted tambin puede utilizar
jobspecs en lugar de los PID.
Procesos, como archivos, tienen dueos, y usted debe ser el propietario de un proceso (o
superusuario) con el fin de enviar seales con kill.
Adems de la lista de las seales por encima, que se utilizan ms a menudo con kill, hay otras
seales de frecuencia utilizados por el sistema. Aqu est una lista de otras seales comunes:
Tabla 10-5: Otras seales comunes

Nmero
3

Nombre
QUIT

11

SEGV

20

TSTP

119

Significado
Salir.
Violacin de segmentacin. Esta seal se enva si un
programa hace uso ilegal de la memoria, es decir, se
trat de escribir en algn lugar que no se le permiti.
Detener la Terminal. Esta es la seal enviada por el
terminal cuando se pulsa la tecla Ctrl-z. A diferencia
de la seal de parada, la seal es recibida por TSTP

10 - Procesos

28

TORNO

el programa pero el programa pueden optar por


ignorarlo.
Ventana Cambio. Esta es una seal enviada por el
sistema cuando una ventana cambia de tamao.
Algunos programas, como la parte superior e inferior
van a responder a esta seal por volver a dibujar a s
mismos para adaptarse a las nuevas dimensiones de la
ventana.

Para los curiosos, una lista completa de las seales se puede ver con el siguiente
comando:
[Me @ linuxbox ~] $ kill -l

Envo de seales a mltiples procesos con killall


Tambin es posible enviar seales a los mltiples procesos que coincidan con un programa o
nombre de usuario especificado con el comando killall. Aqu es la sintaxis:

killall [-u usuario] [-seal] nombre ...


Para demostrarlo, vamos a empezar un par de instancias del programa xlogo y luego terminar
ellos:

[Me @ linuxbox ~] $ xlogo y


[1] 18801
[Me @ linuxbox ~] $ xlogo y
[2] 18802
[Me @ linuxbox ~] $ killall xlogo
[1]
Terminado
xlogo
[2]
+
Terminado
xlogo
Recuerde que, como con la matanza, debe tener privilegios de superusuario para enviar
seales a los procesos que no pertenecen a usted.

Ms de procesos relacionados Comandos


Dado que los procesos monitoreo es una tarea de administracin del sistema importante, hay
una gran cantidad de comandos para ello. stos son algunos de jugar con:
120

Ms de procesos relacionados Comandos


Tabla 10-6: otro proceso comandos relacionados

Comando
pstree
vmstat

xload
tload

Descripcin
Devuelve una lista de procesos dispuestos en un patrn en forma de
rbol que muestra las relaciones padre / hijo entre los procesos.
Salidas de una instantnea del uso de recursos del sistema, incluyendo,
memoria, swap y disco de E / S. Para ver una visualizacin continua,
siga el comando con un retardo de tiempo (en segundos) para las
actualizaciones. Por ejemplo: vmstat 5. Terminar la salida con Ctrl-C.
Un programa grfico que dibuja un grfico que muestra la carga del
sistema en el tiempo.
Similar al programa xload, pero dibuja el grfico en el terminal.
Terminar la salida con Ctrl-C.

Resumiendo
La mayora de los sistemas modernos cuentan con un mecanismo para la gestin de mltiples
procesos. Linux proporciona un completo conjunto de herramientas para este fin. Dado que
Linux es el sistema operativo de servidor ms desplegada en el mundo, esto hace mucho
sentido. Sin embargo, a diferencia de otros sistemas, Linux se basa principalmente en las
herramientas de lnea de comandos para la gestin de procesos. Aunque existen herramientas
de proceso grfico para Linux, las herramientas de lnea de comandos son muy preferidos
debido a su velocidad y la huella de luz. Mientras que las herramientas visuales pueden
parecer bastante, que a menudo crean una gran cantidad de sistema de cargar ellos mismos, lo
que contradice un tanto la finalidad.

121

Parte 2 - Configuracin y el medio ambiente

Parte 2 - Configuracin y
theenvironment

123

11 - El Medio Ambiente

11 - El Medio Ambiente
Como hemos comentado anteriormente, la carcasa mantiene un cuerpo de informacin
durante nuestra sesin de shell llamado el medio ambiente. Los datos almacenados en el
entorno es utilizado por los programas para determinar hechos sobre nuestra configuracin.
Si bien la mayora de los programas utilizan archivos de configuracin para almacenar la
configuracin del programa, algunos programas tambin buscarn valores almacenados en el
medio ambiente para ajustar su comportamiento. Sabiendo esto, podemos usar el entorno
para personalizar nuestra experiencia cscara.
En este captulo, vamos a trabajar con los siguientes comandos:

p r i n t e n v - Imprimir parte o la totalidad del medio ambiente

del conjunto - Establecer opciones de shell


e x p o r t a c i n - Medio ambiente Exportar a ejecutar posteriormente programas

a l i a s - Crear un alias de un comando

Lo que se almacena en el medio ambiente?


Las tiendas de concha dos tipos bsicos de datos en el medio ambiente, sin embargo, con bash,
los tipos son en gran medida indistinguibles. Son las variables de entorno y variables shell.
Variables de Shell son bits de datos colocados all por bash, y variables de entorno son,
bsicamente, todo lo dems. Adems de las variables, la cscara tambin almacena algunos
datos programticos, es decir, los alias y las funciones de shell. Cubrimos alias en el captulo 5,
y funciones de shell (que estn relacionados con shell scripting) sern cubiertos en la parte 4.

Examinar El Medio Ambiente


Para ver lo que est almacenado en el medio ambiente, podemos utilizar la interna set en bash
o el programa printenv. El comando set mostrar tanto las variables de shell y el medio
ambiente, mientras que printenv slo mostrar el ltimo. Dado que la lista de contenidos de
entorno ser bastante largo, lo mejor para la tubera es la salida de cualquiera de los dos
[Me @ linuxbox ~] $ printenv | less
comandos en menos:
124

Lo que se almacena en el medio


ambiente?
Si lo hace, debemos conseguir algo que se parece a esto:

KDE_MULTIHEAD = false
SSH_AGENT_PID = 6666
HOSTNAME = linuxboX
GPG_AGENT_INFO = / tmp / gpg-PdOt7g / S.gpg-agente: 6689: 1
SHELL = / bin / bash
TERM = xterm
XDG_MENU_PREFIX = kdeHISTSIZE = 1000
XDG_SESSION_COOKIE = 6d7b05c65846c3eaf3101b0046bd2b001208521990,996705-1177056199
GTK2_RC_FILES = / etc / gtk-2.0 / gtkrc: /home/me/.gtkrc2.0: /home/me/.kde/share/config/gtkrc-2.0
GTK_RC_FILES = / etc / gtk / gtkrc: /home/me/.gtkrc: /home/me/.kde/share/confi
g / gtkrc
GS_LIB = / home / me / .fonts
WINDOWID = 29360136
QTDIR = / usr / lib / qt-3.3
QTINC = / usr / lib / qt-3.3 / include
KDE_FULL_SESSION = true
USUARIO Me =
LS_COLORS = no = 00: fi = 00: di = 00; 34: ln = 00; 36: pi = 40; 33: so = 00; 35: bd = 40; 33;
01
: Cd = 40; 33; 01: o = 01; 05; 37; 41: mi = 01; 05; 37; 41: ex = 00; 32: * cmd = 00; 32:.. * Exe
Lo que vemos es una lista de variables de entorno y sus valores. Por ejemplo, vemos una
variable llamada USUARIO, que contiene el valor "yo". El comando printenv tambin puede
listar el valor de una variable especfica:

[Me @ linuxbox ~] USER $ printenv m

El comando set, cuando se usa sin opciones o argumentos, se mostrar tanto en la cscara y
variables de entorno, as como las funciones de shell definidas. A diferencia de printenv, su
salida est ordenada cortsmente en orden alfabtico:

[Me @ linuxbox ~] $ set | less


Tambin es posible ver el contenido de una variable usando el comando echo, como esto:

125

[Me @ linuxbox
HOME
linuxbox ~]
~] $$echo
alias $alias
l. = /'Ls
home
/ me = Tty' alias ll = 'ls -l --color =
-d. * --color
tty' alias ls = 'ls -color = tty' alias vi =
'vim'
alias que = 'alias | / usr / bin / que --tty-slo --read-alias --show- salpican --show-tilde'
- El Medio Ambiente

11

Uno de los elementos del medio ambiente que ni conjunto ni pantallas printenv es alias. Para
verlos, introduzca el comando alias sin argumentos:

Algunas variables interesantes


El entorno contiene un buen nmero de las variables, y aunque su entorno puede ser diferente
a la que se presenta aqu, es probable que vea las siguientes variables en su entorno:
Tabla 11-1: Variables de entorno

Variable
PANTALL
A

Contenido

EDITOR

El nombre del programa que se utilizar para la edicin de texto.

SHELL

El nombre de su programa de shell.

INICIO

El nombre de ruta de su directorio personal.

LANG

Define el juego de caracteres y orden de clasificacin de su idioma.

OLD_PWD
PAGER

El directorio de trabajo anterior.


El nombre del programa que se utiliza para la paginacin de salida. Esto
a menudo se establece en / usr / bin / menos.

CAMINO
PS1

126

El nombre de la pantalla si est ejecutando un entorno grfico. Por lo


general, esta es ": 0", es decir, la primera pantalla que genera el servidor
X.

Una lista separada por dos puntos de los directorios que se buscan
cuando se introduce el nombre de un programa ejecutable.
Cadena Prompt 1. Esto define el contenido de su intrprete de
comandos. Como veremos ms adelante, esto puede ser ampliamente
modificado para requisitos particulares.

Lo que se almacena en el medio ambiente?


PWD
PLAZO

TZ

USUARI
O

El directorio de trabajo actual.


El nombre de su tipo de terminal. Sistemas de tipo Unix soportan
muchos protocolos de terminales; esta variable establece el protocolo
para ser utilizado con su emulador de terminal.
Especifica su zona horaria. La mayora de los sistemas tipo Unix
mantener el reloj interno de la computadora en el Tiempo Universal
Coordinado (UTC) y luego muestra la hora local mediante la aplicacin
de un desplazamiento especificado por esta variable.
Tu nombre de usuario.

No se preocupe si algunos de estos valores estn desaparecidos. Varan por distribucin.

Cmo se establece el medio ambiente?


Cuando inicia sesin en el sistema, el programa bash comienza, y lee una serie de scripts de
configuracin llamados archivos de inicio, que definen el entorno por defecto compartido por
todos los usuarios. Esto es seguido por ms archivos de inicio en nuestro directorio home que
definen nuestro entorno personal. La secuencia exacta depende del tipo de sesin de shell que
se inicia. Hay dos tipos: una sesin de inicio de sesin de shell y una sesin de shell no inicio
de sesin.
Una sesin de inicio de sesin de shell es una en la que se nos preguntar por nuestro nombre
de usuario y contrasea; cuando empezamos una sesin de consola virtual, por ejemplo. Una
sesin de intrprete de no ingreso se produce normalmente cuando lanzamos una sesin de
terminal en la interfaz grfica de usuario.
Iniciar sesin conchas leen uno o ms archivos de inicio como se muestra en la Tabla 11-2:
Tabla 11-2: archivos de inicio Para Entrar Shell Sesiones

Expediente
/ Etc / profile
~ / .bash_profile
~ / .bash_login
~ / .profile

Contenido
Una secuencia de comandos de configuracin global que se
aplica a todos los usuarios.
Archivo de inicio personal de un usuario. Puede ser
utilizado para extender o anular la configuracin de la
secuencia de comandos de configuracin global.
S i ~ / . b a s h _ p r o f i l e no se encuentra, golpe intenta leer
este guin.
Si no se encuentra ni ~ / .bash_profile ni ~ / .bash_login,
golpe intenta leer este archivo. Este es el valor por defecto en
distribuciones basadas en Debian, como Ubuntu.

Sesiones de intrprete de
leer los siguientes archivos de inicio:
no ingreso
127

11 - El Medio Ambiente
Tabla 11-3: archivos de inicio para los no Login Shell Sesiones

Expediente

Contenido
Una secuencia de comandos de configuracin global que se
/etc/bash.bashrc
aplica a todos los usuarios.
~ / .bashrc
Archivo de inicio personal de un usuario. Puede ser
utilizado para extender o anular la configuracin de la
secuencia de comandos de configuracin global.
Adems de la lectura de los archivos de inicio de arriba, no de inicio de sesin conchas
tambin heredan el entorno de su proceso padre, un intrprete de ingreso.
Echa un vistazo a su sistema y ver cul de estos archivos de inicio que tiene. Recuerde: ya que
la mayora de los nombres de los archivos enumerados anteriormente comienzo con un punto
# .bash_profile
# Obtener los alias y las funciones if [-f
~ / .bashrc]; entonces
. ~ / .bashrc
Fi
# Programas de inicio entorno especfico del usuario y
PATH = $ PATH: $ PATH
HOME / bin exportacin
(es decir, que estn ocultos), tendr que utilizar la opcin "-a" al usar ls.
El archivo ~ / .bashrc es probablemente el archivo de inicio ms importante desde el punto de
vista del usuario normal, ya que casi siempre se lee. De no ingreso conchas leen por defecto y
la mayora de los archivos de inicio para inicio de sesin conchas estn escritos de tal manera
como para leer el archivo ~ / .bashrc tambin.

Qu hay en un archivo de inicio?


Si echamos un vistazo en el interior de una tpica .bash_profile (tomado de un sistema CentOS
4), que se ve algo como esto:
Las lneas que empiezan con un "#" son comentarios y no son ledos por el shell. Estos estn
si [-f ~ / .bashrc]; entonces
ah para facilitar la lectura humana. La primera cosa interesante se produce en la cuarta lnea,
con el siguiente cdigo:

128

Cmo se establece el medio ambiente?


Esto se llama un caso de comando compuesto, que vamos a cubrir plenamente cuando
~ / .bashrc
fi
Si el archivo "~ / .bashrc" existe, thenread el
archivo "~ / .bashrc".
lleguemos a shell scripting en la parte 4, pero por ahora vamos a traducir:
Podemos ver que este trozo de cdigo es como un shell de entrada se pone el contenido de
.bashrc. Lo siguiente en nuestro archivo de inicio tiene que ver con la variable PATH.
Alguna vez se pregunt cmo el shell sabe dnde encontrar los comandos cuando les
entramos en la lnea de comandos? Por ejemplo, cuando entramos en ls, el shell no busca en
todo el equipo para encontrar / bin / ls (la ruta completa del comando ls), sino que busca en
una lista de directorios que estn contenidos en la variable PATH.
La variable PATH es a menudo (pero no siempre, dependiendo de la distribucin) establecido
por el archivo / etc / profile de inicio y con este cdigo:
PATH est modificado para aadir el directorio $ HOME / bin al final de la lista. Este es un
PATH = $ PATH: $ HOME
/ bin
ejemplo de la expansin de parmetro, que tocamos en el Captulo 7. Para demostrar cmo
II

[Me @ linuxbox ~] $ Foo = "Esto es un poco


[me @ linuxbox ~] $ echo $ foo
Esto es cierto
[me @ linuxbox ~] $ Foo = $ foo "texto". ~] $
[me @ linuxbox Echo $ foo
esto es cierto texto.
esto funciona, intente lo siguiente:
Usando esta tcnica, podemos aadir texto al final de los contenidos de una variable.
Mediante la adicin de la cadena $ HOME / bin al final del contenido de la variable PATH, se
aade el directorio $ HOME / bin a la lista de directorios de bsqueda cuando se introduce un
comando. Esto significa que cuando queremos crear un directorio dentro de nuestro directorio
personal para almacenar nuestros propios programas privados, la cscara est dispuesto a
complacernos. Todo lo que tenemos que hacer es llamar
129

11 - La bandeja se Ambiente, y estamos listos para ir.

Nota: Muchas distribuciones proporcionan esta configuracin por defecto PATH.


Algunas distribuciones basadas en Debian, como Ubuntu, la prueba de la existencia del
directorio ~ / bin al iniciar la sesin, y de forma dinmica la agregan a la variable
export PATH
PATH si no se encuentra el directorio.
Por ltimo, tenemos:
El comando de exportacin le dice al shell para hacer los contenidos de ruta disponible para
procesos secundarios de esta concha.

Modificar el entorno
Ya que sabemos donde estn los archivos de inicio y lo que contienen, que pueden
modificarlos para personalizar nuestro entorno.

Qu archivos deben modificamos?


Como regla general, para aadir directorios al PATH, o definir las variables de entorno
adicionales, coloque esos cambios en .bash_profile (o equivalente, de acuerdo a su
distribucin. Por ejemplo, Ubuntu utiliza .profile.) Para todo lo dems, coloque los cambios en
.bashrc. A menos que usted es el administrador del sistema y la necesidad de cambiar los
valores por defecto para todos los usuarios del sistema, restringir sus modificaciones a los
archivos en su directorio personal. Sin duda, es posible cambiar los archivos en / etc, tales
como el perfil, y en muchos casos, sera sensato hacerlo, pero por ahora, vamos a jugar a lo
seguro.

Editores de texto
Para editar (es decir, modificar) los archivos de inicio de la cscara, as como la mayora de los
otros archivos de configuracin en el sistema, se utiliza un programa llamado un editor de
texto. Un editor de texto es un programa que es, en cierto modo, como un procesador de textos
en el que le permite editar las palabras en la pantalla con un cursor en movimiento. Se
diferencia de un procesador de textos por slo apoyar el texto puro, y con frecuencia contiene
caractersticas diseadas para escribir programas. Editores de texto son la herramienta central
utilizado por los desarrolladores de software para escribir cdigo, y por los administradores
de sistemas para la gestin de los archivos de configuracin que controlan el sistema.
Hay un montn de diferentes editores de texto disponibles para Linux; su sistema
probablemente ha instalado varias. Por qu tantas personas diferentes? Probablemente
porque los programadores como la escritura
130

______________________________________________________ Modificar el entorno


ellos, y dado que los programadores los usan ampliamente, escriben los editores de expresar
sus propios deseos en cuanto a la forma en que deben trabajar.
Editores de texto se dividen en dos categoras bsicas: grfica y de texto basados. GNOME y
KDE tanto incluyen algunos editores grficos populares. Barcos de GNOME con un editor
llamado gedit, que por lo general se llama "Editor de texto" en el men de GNOME. KDE
Normalmente expedido con tres que son (en orden creciente de complejidad) kedit, kwrite, y
Kate.
Hay muchos editores de texto. Los ms populares que se encontrar son nano, vi, y emacs. El
editor nano es un editor simple, fcil de usar, diseado como un reemplazo para el editor pico
suministrado con la suite de correo electrnico PINO. El editor vi (en la mayora de los
sistemas Linux reemplazados por un programa llamado vim, que es la abreviatura de "Vi
mejorado") es el editor tradicional para sistemas tipo Unix. Ser el tema de nuestro prximo
captulo. El editor emacs fue escrito originalmente por Richard Stallman. Es un gigante, para
todo uso, entorno de programacin hace-todo. Mientras fcilmente disponible, que rara vez se
ha instalado en la mayora de los sistemas Linux por defecto.

Utilizando un editor de texto


Todos los editores de texto pueden ser invocados desde la lnea de comandos escribiendo el
[Me @ linuxbox ~] $ gedit some_file
nombre del editor, seguido por el nombre del archivo que desea editar. Si el archivo no existe,
el editor asumir que usted desea crear un nuevo archivo. Aqu hay un ejemplo usando gedit:
Este comando iniciar el editor de texto gedit y cargar el archivo con el nombre "some_file", si
es que existe.
Todos los editores de texto grficos son bastante explica por s mismo, por lo que no van a
cubrir aqu. En lugar de ello, nos concentraremos en nuestro primer editor de texto basado en
texto, nano. Vamos a disparar hasta nano y editar el archivo .bashrc. Pero antes de hacer eso,
vamos a practicar un poco de "computacin segura." Cada vez que editamos un archivo de
configuracin importante, siempre es una buena idea crear una copia de seguridad del
[Me @ linuxbox ~] $ cp .bashrc .bashrc.bak
archivo primero. Esto nos protege en caso de que el archivo de lo para arriba mientras que la
edicin. Para crear una copia de seguridad del archivo .bashrc, haga lo siguiente:
No importa lo que usted llama el archivo de copia de seguridad, slo debes elegir un nombre
comprensible. La extensin ".bak", ".sav", "old", y ".orig" son formas populares de lo que indica
un archivo de copia de seguridad. Ah, y recuerda que cp sobrescribe los archivos existentes en
silencio.

131

11 - El Medio Ambiente
Ahora que tenemos un archivo de copia de seguridad,
vamos a iniciar el editor:
[Me @ linuxbox ~] $ nano .bashrc
Una vez nano comienza, vamos a tener una
pantalla como esta:
Nano 2.0.3

Archivo: .bashrc

# .bashrc
# Fuente definiciones globales if
[-f / etc / bashrc]; entonces
. / Etc / bashrc fi
# Alias y funciones especficas del usuario

[Leer 8 lneas]
OBTENER AYUDA | AO Writeout | AR Lea Fil | AY Anterior
Cortar texto | AC
Cur Pos
LaX Salir | aj
Justificar | aw
Dnde est | av
Pag ^ u
UnCut TqAT Para Hechizo
LaG

Pag

AK

Siguiente

Nota: Si su sistema no tiene nano instalado, puede utilizar un editor grfico en su


lugar.
La pantalla se compone de una cabecera en la parte superior, el texto del archivo que se est
editando en el medio y un men de comandos en la parte inferior. Desde nano fue diseado
para reemplazar el editor de texto que se suministra con un cliente de correo electrnico, es
ms bien corto en funciones de edicin.
El primer comando que debe aprender en cualquier editor de texto es la forma de salir del
programa. En el caso de las nano, pulse Ctrl-x para salir. Esto se indica en el men en la parte
inferior de la pantalla. El "AX" notacin significa Ctrl-x. Esta es una notacin comn para los
caracteres de control utilizados por muchos programas.
El segundo comando que necesitamos saber es cmo salvar nuestro trabajo. Con nano es Ctrl13
2

Modificar el entorno
0. Con este conocimiento en nuestro haber, estamos listos para hacer algo de edicin. Con la
tecla de flecha hacia abajo y / o la tecla AvPg, mueva el cursor hasta el final del archivo, a
continuacin, agregue las siguientes lneas al archivo .bashrc:

umask 0002
HISTCONTROL exportacin = ignoredups HISTSIZE exportacin = 1000 alias l. = 'ls
-d. * --color = auto' alias ll = 'ls -l --color = auto'

Nota: Su distribucin ya puede incluir dao a algunos de ellos, pero no lo har


duplicados
nadie.
Aqu est el significado de nuestras adiciones:
Tabla 11-4: Adiciones a nuestro .bashrc

Lnea
umask 0002

exportacin HISTCONTROL =
ignoredups

exportacin HISTSIZE = 1000

alias l. = 'ls -d. * --color = auto'

alias ll = 'ls -l --color = auto'

Significado
Establece la umask para resolver el
problema con los directorios
compartidos que discutimos en el
Captulo 9.
Causas funcin de grabacin de la
historia de la cscara de ignorar una
orden si el mismo comando se acaba
de grabar.
Aumenta el tamao del historial de
comandos desde el valor
predeterminado de 500 lneas a 1000
lneas.
Crea un nuevo comando llamado "l.
", Que muestra todas las entradas de
directorio que comienzan con un
punto.
Crea un nuevo comando llamado "ll",
que muestra una lista de directorios
de formato largo.

Como podemos ver, muchas de nuestras adiciones no son intuitivamente obvio, por lo que
sera una buena idea aadir algunos comentarios a nuestro archivo .bashrc para ayudar a
explicar las cosas a los seres humanos.
133

11 - El Medio Ambiente
Usando el editor, cambiar nuestras adiciones a tener este
aspecto:

# Cambie umask para hacer ms fcil el intercambio de


directorio
umask 0002
# No haga caso de los duplicados de la historia de comandos
y aumento
# tamao de la historia a 1000 lneas
exportacin HISTCONTROL =
ignoredups exportacin HISTSIZE =
1000
# Agregue un poco de alias tiles
alias l. = 'ls -d. * --color = auto' alias ll = 'ls
-l --color = auto'
Ah, mucho mejor! Con nuestros cambios, pulse Ctrl-o para guardar nuestro archivo .bashrc
modificado, y Ctrl-x para salir de nano.

Por qu comentarios son importantes


Siempre que modifique los archivos de configuracin que es una buena idea aadir
algunos comentarios para documentar los cambios. Claro, usted recordar lo que ha
cambiado de maana, pero qu pasa dentro de seis meses? Hgase un favor y aadir
algunos comentarios. Mientras ests en ello, no es una mala idea llevar un registro de
lo que los cambios que realice.
Los scripts de shell y archivos de inicio de bash utilizan un smbolo "#" para iniciar un
comentario. Otros archivos de configuracin pueden utilizar otros smbolos. La
mayora de los archivos de configuracin tendrn comentarios. Utilizarlos como una
gua.
Es frecuente encontrar que las lneas en los archivos de configuracin que se comentan
a cabo para evitar que sean utilizados por el programa afectado. Esto se hace para dar
a los lectores sugerencias para posibles opciones de configuracin o ejemplos de la
sintaxis correcta configuracin. Por ejemplo, el archivo .bashrc de Ubuntu 8.04
contiene estas lneas:
# algunos ms ls alias #alias ll =
'ls -l'
#alias LA = 'ls -a'
#alias l = 'ls -CF'
Las tres ltimas lneas son las definiciones de alias vlidos que han sido comentadas.
Si quita los smbolos "#" que conducen de estas tres lneas, una tcnica llamada
descomentando, usted activar los alias. Por el contrario, si se agrega un smbolo "#"
al principio de una lnea, se puede desactivar una lnea de configuracin, mientras
que la preservacin de la informacin que contiene.
134

Modificar el entorno

Activacin Nuestros Cambios


Los cambios que hemos hecho en nuestro .bashrc no tendr efecto hasta que cerramos nuestra
sesin de terminal y comenzar uno nuevo, ya que el archivo .bashrc slo se lee al comienzo de
[Me @ linuxbox ~] $ .bashrc fuente
una sesin. Sin embargo, podemos forzar bash para volver a leer el archivo .bashrc
modificado con el siguiente comando:

[Me @ linuxbox ~] $ ll
Despus de hacer esto, deberamos ser capaces de ver el efecto de los cambios. Pruebe uno de
los nuevos alias:

Resumiendo
En este captulo nos enteramos de un archivo de configuracin de habilidades de edicin
esenciales con un editor de texto. En el futuro, a medida que leemos las pginas man para los
comandos, tome nota de las variables de entorno que los comandos de apoyo. Puede haber
una joya o dos. En captulos posteriores, vamos a aprender acerca de las funciones de shell,
una caracterstica de gran alcance que tambin se puede incluir en los archivos de inicio de
bash para agregar a su arsenal de comandos personalizados.

Lectura adicional
La seccin de invocacin de la pgina de manual de bash cubre los archivos de inicio de
bash en detalles sangrientos.

135

12 - Una suave introduccin a VI

12 - Una suave introduccin a VI


Hay una vieja broma acerca de un visitante a la ciudad de Nueva York pidiendo un transente
cmo llegar a la famosa sala de conciertos clsica de la ciudad:
Visitante: Disculpe, cmo puedo llegar a Carnegie Hall?
Transente: Prctica, prctica, prctica!
El aprendizaje de la lnea de comandos de Linux, como convertirse en un pianista consumado,
no es algo que nosotros recogemos en una tarde. Se necesitan aos de prctica. En este
captulo, vamos a introducir los vi (pronunciado "ojo uve") del editor de texto, uno de los
programas bsicos de la tradicin Unix. vi es algo notorio por su interfaz de usuario difcil,
pero cuando vemos a un maestro se sent ante el teclado y comenzar a "jugar", que ser de
hecho testigo de algn gran arte. No vamos a convertirse en maestros de este captulo, pero
cuando hayamos terminado, vamos a saber cmo jugar "palillos" en vi.

Por qu debemos aprender vi


En esta era moderna de editores grficos y editores fciles de usar basados en texto como
nano, por qu debemos aprender vi? Hay tres buenas razones:

vi siempre est disponible. Esto puede ser un salvavidas si tenemos un sistema sin
interfaz grfica, como por ejemplo un servidor remoto o un sistema local con una
configuracin X rota. nano, mientras que cada vez ms popular todava no es
universal. POSIX, un estndar para la compatibilidad de programas en los sistemas
Unix, requiere que vi estar presente.

vi es ligero y rpido. Para muchas tareas, es ms fcil para que aparezca vi de lo que es
encontrar el editor grfico de texto en los mens y esperar a que sus mltiples
megabytes para cargar. Adems, vi est diseado para escribir velocidad. Como
veremos, un usuario experto vi nunca tiene que levantar sus dedos del teclado
durante la edicin.

No queremos que otros usuarios de Linux y Unix que creen que somos cobardes.

De acuerdo, tal vez dos buenas razones.

136

Un poco de historia

Un poco de historia
La primera versin de vi fue escrito en 1976 por Bill Joy, de la Universidad de California en
Berkley estudiante que ms tarde pas a co-encontr Sun Microsystems. vi deriva su nombre
de la palabra "visual", ya que tena la intencin de permitir la edicin en un terminal de vdeo
con un cursor en movimiento. Anterior a los editores visuales, haba editores de lnea que
operaban en una sola lnea de texto a la vez. Para especificar un cambio, le decimos a un editor
de lnea para ir a una lnea en particular y describir lo que el cambio para hacer, por ejemplo,
agregar o borrar texto. Con el advenimiento de terminales de vdeo (en lugar de terminales
basados en la impresora como teletipos) edicin visual se hizo posible. vi en realidad
incorpora un editor de lnea de gran alcance llamada ex, y podemos usar los comandos de
edicin de lnea mientras se utiliza vi.
La mayora de las distribuciones de Linux no incluyen los bienes vi; ms bien, que se entregan
con un reemplazo llamado vim mejorada (que es la abreviatura de "vi mejorado") escrito por
Bram Moolenaar. vim es una mejora sustancial sobre tradicional vi Unix y por lo general se
vincula simblicamente (o alias) para el nombre de "vi" en los sistemas Linux. En las
discusiones que siguen, vamos a suponer que tenemos un programa que se llama "vi" que es
realmente vim.

[Me @ linuxbox ~] $ vi

Inicio y detencin de vi
Para iniciar vi, simplemente escriba lo siguiente:
Y una pantalla como esta debera aparecer:

VIM - Vi mejorada versin 7.1.138


por Bram Moolenaar et al.
Empuje es de cdigo abierto y de libre distribucin
Patrocinador desarrollo Vim!
tipo : Ayuda patrocinador <Intro> para informacin
tipo : Q <Intro>
tipo : Help <Intro> o <F1>
tipo : Ayuda version7 <Intro>

para salir
en busca de ayuda
en
lnea info
Versin

Ejecucin en modo compatible Vi


tipo : Set NOCP <Intro>
para los impagos de
Vim
137

12 - una suave introduccin a VI


Tipo: ayuda cp-default <Intro> para obtener informacin
sobre este

Al igual que hicimos con nano anterior, lo primero que debe aprender es cmo salir. Para
salir, entramos en el siguiente comando (tenga en cuenta que el carcter de dos puntos es
parte del comando):

:
Q
El intrprete de comandos debe devolver. Si, por alguna razn, no le vi salir (normalmente
porque hemos hecho un cambio en un archivo que an no se ha guardado), podemos decir
que vi que realmente queremos decir que mediante la adicin de un signo de exclamacin al
comando:

Sugerencia: Si se "pierde" en vi, intente presionar la tecla Esc dos veces para
encontrar el camino de nuevo.

Modo de compatibilidad
En la pantalla de inicio de ejemplo anterior (tomado de Ubuntu 8.04), vemos que el
texto "Ejecutar en modo compatible Vi." Esto significa que vim se ejecutar en un
modo que est ms cerca el comportamiento normal de vi ms que el comportamiento
mejorado de vim . Para efectos de este captulo, vamos a querer ejecutar vim con su
comportamiento mejorado. Para ello, usted tiene algunas opciones:
Intente ejecutar vim en lugar de vi.
Si eso funciona, considere agregar alias vi = 'vim' a su archivo .bashrc. Como
alternativa, utilice este comando para aadir una lnea a su fichero de configuracin
de vim: echo "NOCP ajuste" >> ~ / .vimrc
Diferentes distribuciones Linux paquete vim de diferentes maneras. Algunas
distribuciones instalan una versin mnima de vim por defecto que slo es compatible
con un conjunto limitado de funciones vim. Mientras preformacin las lecciones que
siguen, puede encontrar las caractersticas que faltan. Si este es el caso, instalar la
versin completa de vim.

13
8

Modos de edicin

Modos de edicin
[Me @ linuxbox ~] $ rm -f foo.txt [me @
linuxbox ~] $ vi foo.txt
Vamos a empezar a vi de nuevo, esta vez pasando a ella el nombre de un archivo que no

"Foo.txt" [Archivo Nuevo]


existe. As es como podemos crear un nuevo archivo con vi:
Si todo va bien, deberamos obtener una pantalla como esta:
Los caracteres que llevan tilde ("~") indican que no existe ningn texto en esa lnea. Esto
demuestra que tenemos un archivo vaco. No escriba nada todava!
La segunda cosa ms importante para aprender acerca de vi (despus de aprender a salir) es
que vi es un editor modal. Cuando vi arranca, comienza en el modo de comando. En este
modo, casi cada clave es un comando, por lo que si tuviramos que empezar a escribir, vi sera
bsicamente se vuelven locos y hacen un gran lo.

139

12 - una suave introduccin a VI

Acceso al modo de insercin


Con el fin de aadir un poco de texto en nuestro archivo, primero tenemos que entrar en el
modo de insercin. Para ello, pulsamos la tecla "i". Despus, hay que ver lo siguiente en la
parte inferior de la pantalla si vim se est ejecutando en modo mejorado su habitual (esto no
aparecer en el modo compatible vi):

- INSERT Ahora podemos introducir algn texto.


Prueba esto:

El rpido zorro marrn salt sobre el perro perezoso.


Para salir del modo de insercin y volver al modo comando, presione la tecla Esc.

Salvando Nuestro Trabajo


Para guardar los cambios que acaba de hacer en nuestro archivo, debemos entrar un ex
comando, mientras que en el modo de comando. Esto se hace fcilmente pulsando la tecla ":"
clave. Despus de hacer esto, un carcter de dos puntos debera aparecer en la parte inferior
de la pantalla:

Para escribir nuestro archivo modificado, seguimos el colon con una "w"
y luego Enter:
:
W
El archivo se grabar en el disco duro y que debe recibir un mensaje de confirmacin en la
parte inferior de la pantalla, as:

"Foo.txt" [Nuevo] 1L, 46C escrito

Consejo: Si usted lee la documentacin de vim, te dars cuenta de que


(confusamente) modo de comando se llama comandos del modo y ex normales se
llaman modo de comando.
140

Modos de edicin
Tenga cuidado.

Moviendo el cursor por


Mientras que en el modo de comando, vi ofrece un gran nmero de comandos de movimiento,
algunos de los cuales comparte con menos. Aqu es un subconjunto:
Tabla 12-1: Movimiento del cursor Teclas

Clave

Mueve el cursor

l o Flecha derecha

Haga un carcter.

h o Flecha izquierda

Quede un carcter.

j o Flecha abajo

Una lnea hacia abajo.

k o Flecha arriba

Hasta una lnea.

0 (cero)
La

Para el comienzo de la lnea actual.

$
w

Para el final de la lnea actual.

W
b
B

Para el primero no est en blanco en la lnea actual.

Para el comienzo de la siguiente palabra o carcter


puntuacion.
Para el comienzo de la siguiente palabra, haciendo caso
omiso de los caracteres de puntuacin.
Para el comienzo de la palabra anterior o carcter
puntuacion.
Para el comienzo de la palabra anterior, haciendo caso
omiso de los caracteres de puntuacin.

C t r l - F o P g i n a Abajo

Abajo una pgina.

Ctrl-b o Re Pg
Numberg

Hasta una pgina.


Para la lnea nmero. Por ejemplo, 1G se mueve a la
primera lnea del archivo.

Para la ltima lnea del archivo.

para el movimiento del cursor? Porque cuando vi


Por qu son los h, j, k, l y llaves utilizado
era originalmente
141

12 - Una introduccin agradable a VI finalmente escrito, no todos los terminales de vdeo


tenan teclas de flecha, y mecangrafos expertos podra utilizar teclas regulares del teclado
para mover el cursor sin tener que levantar los dedos del teclado.
Muchos comandos vi pueden ser precedidos de un nmero, al igual que con el comando "G"
que aparece arriba. Por anteponiendo un comando con un nmero, podemos especificar el
nmero de veces que un comando se llevar a cabo. Por ejemplo, el comando "5J" hace que vi
para mover el cursor hacia abajo cinco lneas.

Edicin bsica
La mayor parte de edicin consiste en un par de operaciones bsicas tales como la insercin de
texto, elimine el texto, y el texto en movimiento alrededor de cortar y pegar. vi, por supuesto,
apoya todas estas operaciones en su propia manera nica. vi tambin proporciona una forma
limitada de deshacer. Si pulsamos la tecla "u" en el modo de comando, se vi deshacer el ltimo
cambio que realiz. Esto ser muy til ya que tratamos a cabo algunos de los comandos
bsicos de edicin.

Al aadir texto
vi tiene varias formas diferentes de entrar en el modo de insercin. Ya hemos utilizado el
El rpido zorro marrn salt sobre el perro perezoso.
comando i para insertar texto.
Volvamos a nuestro archivo foo.txt por un momento:
Si quisiramos aadir un poco de texto al final de esta frase, descubriramos que el comando
no voy a hacerlo, ya que no podemos mover el cursor ms all del final de la lnea. vi ofrece un
comando para aadir el texto, la "a" de comandos con sensatez llamado. Si movemos el cursor
El rpido zorro marrn salt sobre el perro perezoso. Ha sido muy
interesante.
al final de la lnea y de tipo "A", el cursor se mover ms all del final de la lnea y vi entrar en
el modo de insercin. Esto nos permitir aadir ms texto:
Recuerde pulsar la tecla Esc para salir del modo de insercin.
Ya que casi siempre le quieren aadir texto al final de una lnea, vi ofrece un acceso directo
para pasar a la final de la lnea actual y empezar aadiendo. Es el comando "A". Vamos a
intentarlo y aadir algunas lneas ms a nuestro archivo.
En primer lugar, vamos a pasar el cursor al principio de la lnea con el comando "0" (cero).
142

El rpido zorro marrn salt sobre el perro perezoso. Ha sido muy


interesante.
Lnea 2
Lnea 3
Lnea 4
Lnea 5

Edicin bsica

Ahora escribimos "A" y aadimos las siguientes lneas de texto:


Una vez ms, pulse la tecla Esc para salir del modo de insercin.
Como podemos ver, el comando "A" es ms til cuando se mueve el cursor hasta el final de la
lnea antes de iniciar el modo de insercin.

La apertura de una lnea


Otra forma en que podemos insertar texto es por la "apertura" de una lnea. Esto inserta una
lnea en blanco entre dos lneas existentes y entra en el modo de insercin. Esto tiene dos
variantes:
Tabla 12-2: Claves lnea de apertura

Comando
Abre
o
La lnea debajo de la lnea actual.
El rpido zorro marrn salt sobre el perro perezoso. Ha sido muy
O
La3lnea por encima de la lnea actual.
interesante.
Lnea 2 Lnea
Lnea 4
Lnea 5
Podemos demostrar esto de la siguiente manera: colocar el cursor sobre "Lnea 3" a
continuacin, pulse la tecla o.

Se abri una nueva lnea por debajo de la tercera lnea y entramos en el modo de insercin.
Salga del modo de insercin pulsando la tecla Esc. Pulse la tecla U para deshacer nuestro
El rpido zorro marrn salt sobre el perro perezoso. Ha sido muy
interesante. Lnea 2
cambio.
Pulse la tecla O para abrir la lnea por encima del cursor:
143

Lnea 3
Lnea 4
Lnea 5
12 - Una suave introduccin a VI
Salga del modo de insercin presionando la tecla Esc y deshacer nuestro cambio pulsando u.

Eliminacin de Texto
Como era de esperar, vi ofrece una variedad de formas de eliminar el texto, todos los cuales
contienen una de dos golpes de teclado. En primer lugar, la clave x eliminar un carcter en la
posicin del cursor. x puede ser precedido por un nmero que especifica el nmero de
caracteres se van a eliminar. La clave es d propsito ms general. Al igual que x, que puede ser
precedida por un nmero que especifica el nmero de veces que la delecin se va a realizar.
Adems, d siempre es seguido por un comando de movimiento que controla el tamao de la
delecin. He aqu algunos ejemplos:
Tabla 12-3: Comandos de texto de eliminacin

Comando
x

Borra
El carcter actual.

3x
dd

El carcter actual y los prximos dos personajes.


La lnea actual.

5dd

La lnea actual y los prximos cuatro lneas.

dW

Desde la posicin actual del cursor hasta el principio de la


siguiente palabra.

d$

Desde la ubicacin actual del cursor hasta el final de la


lnea actual.

d0

Desde la ubicacin actual del cursor hasta el principio de


la lnea.

dA
dG

A partir de la posicin actual del cursor al primer carcter


nonwhitespace en la lnea.
Desde la lnea actual hasta el final del archivo.

d20G

Desde la lnea actual a la lnea XX del archivo.

Coloque el cursor sobre la palabra "No" en la primera lnea de nuestro texto. Pulse la tecla x
varias veces hasta que se elimina el resto de la frase. A continuacin, pulse la tecla u varias
veces hasta que la eliminacin
144

Edicin bsica
es deshecho.

El rpido zorro marrn salt sobre el perro perezoso. era fresco.


Lnea 2
Lnea 3
Lnea 4
Lnea 5
Nota: Bienes vi slo es compatible con un solo nivel de deshacer. vim soporta mltiples
niveles.
El rpido zorro marrn salt sobre el perro perezoso.
Lnea 2
Lnea 3
Lnea 4
Lnea 5
Vamos a intentar el borrado de nuevo, esta vez con el comando d. Una vez ms, mover el
cursor a la palabra "It" y pulse dW suprimir la palabra:
Pulse $ d para borrar de la posicin del cursor hasta el final de la lnea:
Pulse dG para eliminar de la lnea actual hasta el final del archivo:

Presione U tres veces para deshacer la eliminacin.

Cortar, copiar y pegar texto


El comando d no slo elimina el texto, sino que tambin el texto "recortes". Cada vez que
utilizamos el comando d la supresin se copia en un bfer de pasta (creo portapapeles) que
luego podemos recordar con el comando p para pegar el contenido de la memoria intermedia
despus del cursor o el comando P para pegar el contenido antes del cursor.
El comando y se utiliza para "tirn" (copia) en el texto de la misma manera el comando d es
145

12 - una suave introduccin a VI


utilizado para cortar texto. Aqu ejemplos que combinan el comando y con varios
estn algunos comandos Ment: movimiento
Table13- 4: Comandos YanKing
Comando

Copias

aa

La lnea actual.

5yy
yW

La lnea actual y los prximos cuatro lneas.

y$

Desde la ubicacin actual del cursor hasta el final de la lnea


actual.

y0

Desde la ubicacin actual del cursor hasta el principio de la


lnea.

yA

A partir de la posicin actual del cursor al primer carcter


nonwhitespace en la lnea.
Desde la lnea actual hasta el final del archivo.

yG

Desde la posicin actual del cursor hasta el principio de la


siguiente palabra.

El
el perro
perezoso.
sido muy
y 2rpido
0 G zorro marrn salt sobre
Desde
la lnea
actual aHa
la lnea
XX del archivo.
interesante.
Lnea 2
Lnea 3
Lnea 4
Lnea 5
El rpido zorro marrn salt sobre el perro perezoso. Ha sido muy
interesante.
Vamos a probar un poco de copiar y pegar. Coloque el cursor en la primera lnea del texto y
escriba yy copiar la lnea actual. A continuacin, mueva el cursor a la ltima lnea (G) y de tipo
El rpido zorro marrn salt sobre el perro perezoso. Ha sido muy
interesante. Lnea 2 Lnea 3 Lnea 4
p para pegar la lnea por debajo de la lnea actual:
Al igual que antes, el comando u deshar nuestro cambio. Con el cursor sigue en la posicin
en la ltima lnea del archivo, tipo P para pegar el texto por encima de la lnea actual:

146

El rpido zorro marrn salt sobre el perro perezoso. Ha sido muy


interesante.
Lnea 5
Edicin bsica
Pruebe algunos de los otros comandos Y en la tabla anterior y llegar a conocer el
comportamiento tanto de la p y P comandos. Cuando haya terminado, devuelva el archivo a
su estado original.

Unirse Lneas
vi es bastante estricto en cuanto a su idea de una lnea. Normalmente, no es posible mover el
El rpido zorro marrn salt sobre el perro perezoso. Ha sido muy
interesante. Lnea 2
Lnea 3 Lnea 4
Lnea 5
cursor hasta el final de una lnea y eliminar el carcter de fin de lnea para unirse a una lnea
con la de abajo. Debido a esto, vi proporciona un comando especfico, J (que no debe
confundirse con j, que es para el movimiento del cursor) para unirse a las lneas juntas.
Si colocamos el cursor en la lnea 3 y escriba el comando J, esto es lo que sucede:

Buscar y reemplazar
vi tiene la capacidad de mover el cursor a ubicaciones basadas en bsquedas. Se puede hacer
esto ya sea en una sola lnea oa travs de un archivo completo. Tambin puede realizar
sustituciones de texto con o sin confirmacin del usuario.

Busca dentro de una lnea


El comando f busca en una lnea y mueve el cursor a la siguiente instancia de un carcter
especificado. Por ejemplo, la fa comando sera mover el cursor a la siguiente aparicin del
carcter "a" dentro de la lnea actual. Despus de realizar una bsqueda de caracteres dentro
de una lnea, la bsqueda se puede repetir escribiendo un punto y coma.

Busca el archivo completo


Para mover el cursor a la siguiente aparicin de una palabra o frase, se utiliza el comando /.
Esto funciona de la misma manera que hemos aprendido anteriormente en el programa less.
Cuando escribe el comando / a "/" aparecer en la parte inferior de la pantalla. A
continuacin, escriba la palabra o frase que desea buscar, seguido de la tecla Enter. El cursor se
mover a la siguiente posicin que contiene la cadena de bsqueda. Una bsqueda puede
repetirse utilizando la cadena de bsqueda anterior
147

12 - una suave introduccin a VI


con el comando n. He aqu un ejemplo:

El rpido zorro marrn salt sobre el perro perezoso. Ha sido muy


interesante.
Lnea 2
Lnea 3
Lnea 4
Lnea 5
Coloque el cursor en la primera lnea del archivo.
Tipo:

/
Lnea
seguido de la tecla Enter. El cursor se mover a la lnea 2. A continuacin, escriba n y el cursor
se mover a la lnea 3. Repetir el comando n se mover el cursor hacia abajo el archivo hasta
que se queda sin partidos. Si bien no tenemos palabras y frases que hasta ahora slo se utilizan
para nuestros patrones de bsqueda, vi permite el uso de expresiones regulares, un poderoso
mtodo para expresar patrones de texto complejas. Cubriremos expresiones regulares en
cierto detalle en un captulo posterior.

Bsqueda Global y reemplazo


vi usa un comando ex para realizar la bsqueda y reemplazo operaciones (llamada
"sustitucin" en vi) en un rango de lneas o la totalidad del expediente. Para cambiar la
palabra "lnea" a "lnea" para la totalidad del expediente, nos introduzca el siguiente comando:

:% S / lnea / lnea
/g
Vamos a romper este comando abajo en artculos separados y ver lo que hace cada
uno:
Table12- 5: Un ejemplo de bsqueda global y reemplazo de sintaxis

Artculo
Significado
: El carcter de dos puntos comienza un ex comando.
%
Especifica el rango de lneas para la operacin. % Es un acceso
directo el significado de la primera lnea a la ltima lnea.
Alternativamente, se podra haber especificado el rango de 1,5 (ya
que nuestro archivo es de cinco lneas de largo), o 1, $, que significa
"de la lnea 1 a la ltima lnea en el archivo." Si se omite el rango de
lneas, la operacin slo se realiza en la lnea actual.
148

Buscar y reemplazar
s
/ Lnea /
lnea /
g

Especifica la operacin. En este caso, la sustitucin (bsqueda y


reemplazo).
El patrn de bsqueda y el texto de reemplazo.
Esto significa "global" en el sentido de que la bsqueda y reemplazo
se realiza en todas las instancias de la cadena de bsqueda en la
lnea. Si se omite, se sustituye slo la primera instancia de la cadena
de bsqueda en cada lnea.

Despus de la
ejecucin de nuestra buscar y reemplazar comandos nuestro fichero tiene el siguiente aspecto:
El rpido zorro marrn salt sobre el perro perezoso. Ha sido muy interesante.
la lnea 2
la lnea 3
lnea 4
lnea 5

:% S / lnea / lnea /
gc
Tambin podemos especificar un comando de sustitucin con la confirmacin del usuario.
Esto se hace mediante la adicin de una "C" al final del comando. Por ejemplo:
Este comando cambiar nuestro archivo de nuevo a su forma anterior; Sin embargo, antes de
cada sustitucin, vi detiene y nos pide que confirme la sustitucin con este mensaje:

reemplazar con Lnea (s / n / a / q / l / AE / AY)?


Cada uno de los caracteres dentro de los parntesis es una posible eleccin de la siguiente
manera:
Tabla 12-6: Reemplace Keys Confirmacin

Clave

Accin

Lleve a cabo la sustitucin.

Omita este ejemplo del patrn.

un

Lleve a cabo la sustitucin de esta y todas las instancias

posteriores

del patrn.

149

12 - una suave introduccin a VI


q o Esc

Salga de la sustitucin.

l
Ctrl-e, Ctrl-Y

Lleve a cabo esta sustitucin y salga. Abreviatura de "durar".


Desplzate hacia abajo y desplcese hacia arriba,
respectivamente. til para ver el contexto de la sustitucin
propuesta.

Si escribe y, se llevar a cabo la sustitucin, n har que vi para saltar esta instancia y pasar a la
siguiente.

Edicin de varios archivos


A menudo es til para editar ms de un archivo a la vez. Puede que tenga que realizar
cambios en varios archivos o puede que tenga que copiar el contenido de un archivo en otro.
Con vi podemos abrir varios archivos para la edicin especificando en la lnea de comando:

vi archivol archivo2 archivo3


...
Vamos a salir de nuestra sesin de vi existente y crear un nuevo archivo para editarlo. Tipo:
wq para salir de vi, el ahorro de nuestro texto modificado. A continuacin, vamos a crear un
archivo adicional en nuestro directorio de inicio que podemos jugar. Vamos a crear el archivo
mediante la captura de algn resultado del comando ls:
[Me @ linuxbox ~] $ ls -l / usr / bin> ls-output.txt
Vamos a editar nuestro viejo archivo y nuestra
nueva con vi:
[Me @ linuxbox ~] $ vi foo.txt ls-output.txt
vi comenzar y veremos el primer archivo en la pantalla:

El rpido zorro marrn salt sobre el perro perezoso. Ha sido muy


interesante.
Lnea 2
Lnea 3
Lnea 4
Lnea 5

150

Edicin de varios
archivos

Cambio entre archivos


Para pasar de un archivo a otro, utilice este ex comando:

:
N
Para regresar a la utilizacin archivo
anterior:
:
N
Mientras que podemos pasar de un archivo a otro, vi hace cumplir una poltica que nos
impide archivos de conmutacin si el archivo actual tiene cambios sin guardar. Para forzar vi
para cambiar los archivos y abandonar sus cambios, aadir un signo de exclamacin (!) Al
comando.
Adems del mtodo de conmutacin descrito anteriormente, vim (y algunas versiones de vi)
tambin proporcionan algunos comandos ex que hacen varios archivos ms fciles de
manejar. Podemos ver una lista de archivos que se est editando con el comando: tampones. Si
lo hace, se mostrar una lista de los archivos en la parte inferior de la pantalla:

: Los tampones
1% un "foo.txt"
2 "ls-salida TXT "
Presione ENTER o el tipo comando para continuar

lnea 1
lnea 0

Para cambiar a otro buffer (archivo), escriba: tampn seguido por el nmero de la memoria
intermedia que desea editar. Por ejemplo, para cambiar de tampn 1 que contiene el archivo
foo.txt para amortiguar 2 que contiene el archivo ls-output.txt que escribira esto:

: Tampn
2
y nuestra pantalla muestra ahora el segundo archivo.

Apertura de archivos adicional Para una edicin


Tambin es posible aadir archivos a nuestra sesin de edicin actual. El ex comando: e
(abreviatura de "editar") seguido de un nombre de archivo se abrir un archivo adicional.
Vamos a terminar nuestra sesin de edicin actual y volver a la lnea de comandos.

151

12 - una suave introduccin a VI


Iniciar vi de nuevo con un solo
archivo:
[Me @ linuxbox ~] $ vi foo.txt
Para agregar nuestro segundo
archivo, escriba:

: e ls-output.txt
Y debe aparecer en la pantalla.

El primer archivo es todava presente como podemos


comprobar:

: Los tampones
1 # "foo.txt"
la lnea 1
2% un "ls-output.txt"
lnea 0
Presione ENTER o el comando
para continuar
escriba
Nota: No se puede cambiar a los archivos cargados con el comando: correo utilizando
el comando: N: N o. Para cambiar los archivos, utilice el comando: tampn seguido por
el nmero de bfer.

Copiar contenido de un archivo en otro


A menudo, durante la edicin de varios archivos, vamos a querer copiar una parte de un
archivo en otro archivo que estamos editando. Esto se hace fcilmente utilizando los
comandos de cortar y pegar sobre habituales que usamos antes. Podemos demostrar como
sigue. En primer lugar, el uso de nuestros dos archivos, cambiar a amortiguar 1 (foo.txt)
: Tampn
1
mediante la introduccin de:
que nos debe dar a este:
152

Edicin de varios archivos


El rpido zorro marrn salt sobre el perro perezoso. Ha sido muy
interesante.
Lnea 2
Lnea
3
: Tampn
Lnea
4
2
Lnea 5
A continuacin, mueva el cursor a la primera lnea, y escriba yy dar un tirn
(copia) de la lnea. Cambie a la segunda memoria intermedia de entrada:
La pantalla ahora contendr algunos listados de archivos como este (slo se muestra una
parte aqu):
total 343700
-rwxr-xr-x
-rwxr-xr-x
-rwxr-xr-x
-rwxr-xr-x
-rwxr-xr-x
-rwxr-xr-x

1
1
1
1
1
1

raz
raz
raz
raz
raz
raz

raz
raz
raz
raz
raz
raz

31316 2007-12-05
8240 2007-12-09
111276 2008-01-31
25368 2006-10-06
11532 2007-05-04
7292 2007-05-04

8:58
13:39
13:36
20:16
17:43
17:43

411toppm
a2p
a52dec
aafire
aainfo

Mueva el cursor a la primera lnea y pegar la lnea copiamos desde el archivo anterior
escribiendo el comando p:
total de 343.700
El rpido zorro marrn salt
-rwxr-xr-x 1 root root root
-rwxr-xr-x 1 root -rwxr-xr-x 1
root
-rwxr-xr-x
1
root
-rwxr-xr-x 1 root -rwxr-XR x 1
root root

sobre el perro Ha sido muy


perezoso. interesante.
31316 2007-12-05 8240 08:58 [
2007-12-09 2008-01-31 13:39 411toppm
25368 111276 11532 13:36 a2p 20:16
2006-10-06 2007-05-04 a52dec 17:43
7292 2007-05-04 aafire 17:43 aainfo

Insercin de un archivo completo en Otra


Tambin es posible insertar un archivo completo en el que estamos editando. Para ver esto en
accin, vamos a terminar nuestra sesin vi y comenzar uno nuevo con un solo archivo:

153

12 - una suave introduccin a VI


Vamos a ver nuestro listado de
archivos de nuevo:
[Me @ linuxbox ~] $ ls-vi output.txt
total 343700
-rwxr-xr-x
-rwxr-xr-x
-rwxr-xr-x
-rwxr-xr-x
-rwxr-xr-x
-rwxr-xr-x

1
1
1
1
1
1

raz
raz
raz
raz
raz
raz

raz
raz
raz
raz
raz
raz

31316 2007-12-05
8240 2007-12-09
111276 2008-01-31
25368 2006-10-06
11532 2007-05-04
7292 2007-05-04

8:58
13:39
13:36
20:16
17:43
17:43

411toppm
a2p
a52dec
aafire
aainfo

Mueva el cursor a la tercera lnea, a continuacin, introduzca el siguiente


comando ex:

: R foo.txt
El comando: r (abreviatura de "leer") inserta el archivo especificado antes de la posicin del
cursor. Nuestra pantalla ahora debera tener este aspecto:

Salvando Nuestro Trabajo


la raz de la raz de la raz total de
31316 2007-12-05 08:58 [
343.700
-rwxr-xr-x
1
root
-rwxr-xr-x 1 El rpido zorro marrn 2007-12-09 8240 sobre 13:39 411toppm
el perro perezoso. Ha
salt Lnea 2 Lnea 3 Lnea 4
sido
muy
interesante.
Lnea 5
-rwxr-xr-x 1 root root
-rwxr-xr-x 1 root -rwxr-xr-x 1
root -rwxr-xr-x 1 root root
111276 2008-01-31 13:36 a2p
2006-10-06 25368 20:16 a52dec
11532 2007-05-04 17:43 aafire
7292 2007-05-04 17:43 aainfo
Como todo lo dems en vi, hay varias maneras diferentes para guardar nuestros archivos
editados. Ya hemos cubierto el ex comando: w, pero hay algunos otros que tambin pueden
resultar tiles.
En el modo de comando, escriba ZZ guardar el archivo actual y salir de vi. Del mismo modo,
el comando ex: wq combinar el: w y: q comandos en uno que tanto salvar el
154

Salvando Nuestro Trabajo


presentar y salir.
El: w comando tambin puede especificar un nombre de archivo opcional. Esto acta como

: W foo1.txt
"Guardar como ..." Por ejemplo, si estuviramos editando foo.txt y queramos ahorrar una
versin alternativa llamada foo1.txt, entraramos lo siguiente:

Nota: Mientras que el comando anterior guarda el archivo con un nuevo nombre, no
cambia el nombre del archivo que se est editando. A medida que contine para editar,
usted todava ser la edicin foo.txt, no foo1.txt.

Resumiendo
Con este conjunto bsico de habilidades que ahora podemos llevar a cabo la mayor parte de la
edicin de texto necesario para mantener un sistema tpico de Linux. Aprender a usar vim
sobre una base regular dar sus frutos en el largo plazo. Desde editores vi-estilo estn tan
profundamente arraigados en la cultura Unix, vamos a ver muchos otros programas que han
sido influenciados por su diseo. menos es un buen ejemplo de esta influencia.

Lectura adicional
Incluso con todo lo que hemos cubierto en este captulo, apenas hemos araado la superficie
de lo que vi y vim puede hacer. Aqu hay un par de recursos en lnea que puede utilizar para
seguir su viaje hacia el dominio vi:

Aprender El editor vi - Un wikilibro de Wikipedia que ofrece una gua concisa para vi y
varios de sus trabajos-uno-gustos incluyendo vim. Est disponible en:
http://en.wikibooks.org/wiki/Vi

El libro de Vim - El proyecto vim tiene un libro de 570 pginas que cubre (casi) todas las
caractersticas en vim. Usted lo puede encontrar en:
ftp://ftp.vim.org/pub/vim/doc/book/vimbook-OPL.pdf.

Un artculo de Wikipedia sobre Bill Joy, el creador de vi .:


http://en.wikipedia.org/wiki/Bill Alegra

Un artculo de Wikipedia sobre Bram Moolenaar, el autor de vim:


http://en.wikipedia.org/wiki/Bram Moolenaar

155

13 - Personalizacin de El Smbolo

13

- Personalizacin de El Smbolo

En este captulo vamos a ver en un detalle nuestro intrprete de comandos aparentemente


trivial. Este examen revelar algunos de los mecanismos internos de la shell y el programa
emulador de terminal en s.
Como tantas cosas en Linux, el intrprete de comandos es altamente configurable, y si bien
hemos casi dado por sentado, el smbolo es un dispositivo muy til una vez que aprendemos
cmo controlarlo.

[Me @ linuxbox ~] $

Anatoma de un Smbolo
Nuestro indicador predeterminado se ve algo como esto:
Observe que contiene nuestro nombre de usuario, nuestro nombre de host y nuestro
directorio de trabajo actual, pero cmo lleg esa manera? Muy simplemente, resulta. El
[Me @ linuxbox ~] $ echo $ PS1 [\
u @ \ h \ W] \ $
indicador se define por una variable de entorno denominada PS1 (abreviatura de "cadena de
uno pronto"). Podemos ver el contenido de PS1 con el comando echo:

Nota: No se preocupe si sus resultados no son exactamente lo mismo que el ejemplo


anterior. Cada distribucin de Linux define la cadena de peticin un poco diferente, un
poco bastante extico.
A partir de los resultados, podemos ver que PS1 contiene algunos de los personajes que vemos
en nuestra pronta tales como los soportes, el, y el signo en signo de dlar, pero el resto son un
misterio. El astuto entre nosotros reconocer estos como caracteres especiales escapados como
156

Anatoma de un Smbolo
los vimos en el captulo 7. Aqu est una lista parcial de los caracteres que las golosinas de
concha especialmente en la cadena del indicador:
Tabla 13-1: Escape cdigos utilizados en Indicadores de los shells

Secuencia

\H
\H

Valor visualizado
Campana ASCII. Esto hace que el pitido del ordenador cuando se
encontr.
Fecha y hora actual en el da, el mes, el formato de fecha. Por ejemplo,
"Mon 26 de mayo"
Nombre de host de la mquina local, sin incluir el nombre de dominio al
final.
Nombre de host completo.

\J
\L

Nmero de puestos de trabajo que se ejecutan en la sesin actual del


shell.
Nombre del dispositivo terminal actual.

\N

Un carcter de nueva lnea.

\R

Un retorno de carro.

\s
\T

Nombre del programa de shell.


Hora exacta en 24 horas horas: minutos: segundos formato.

\T

Hora en formato de 12 horas.

\@
\A

Hora exacta en 12 horas formato AM / PM.


Hora en horas 24 horas: formato de minutos.

\U

nombre de usuario del usuario actual.

\V

Nmero de versin de la cscara.

\V

Versin y lanzamiento nmeros de la cscara.

\W

Nombre del directorio de trabajo actual.

\W
\!

ltima parte del nombre del directorio de trabajo actual.


Nmero de Historia del comando actual.

\#
\$

Nmero de comandos introducida durante esta sesin de shell.

\A
\D

\[

157

Esto muestra un "$" carcter a menos que tenga privilegios de


superusuario. En ese caso, se muestra un "#" en su lugar.
Seala el comienzo de una serie de uno o ms caracteres no imprimibles.
Esto se utiliza para incrustar caracteres de control no imprimibles que
manipulan el emulador de terminal, de alguna manera, como mover la

13 - Personalizacin de El Smbolo
cursor o cambiar los colores del texto.
\]

Seala el final de una secuencia de caracteres de no impresin.

Tratando algunos diseos alternativos Prompt


Con esta lista de caracteres especiales, podemos cambiar el mensaje para ver el efecto. En
primer lugar, vamos a respaldar la cadena existente para que podamos restaurarla ms tarde.
Para ello, vamos a copiar la cadena existente en otra variable de shell que nos creamos a
nosotros mismos:
[Me @ linuxbox ~] $ ps1_old = "$ PS1"
Creamos una nueva variable llamada ps1_old y asignamos el valor de PS1 a ella. Podemos
comprobar que la cadena ha sido copiada mediante el comando echo:

[Me @ linuxbox ~] $ echo $ ps1_old [\ u


@ \ h \ W] \ $
Podemos restaurar el smbolo original en cualquier momento durante nuestra sesin de
terminal simplemente invirtiendo el proceso:

[Me @ linuxbox ~] $ PS1 = "$ ps1_old"


Ahora que estamos dispuestos a seguir adelante, vamos a ver qu pasa si tenemos una cadena
de peticin vaco:

[Me @ linuxbox ~] $ PS1 =


Si asignamos nada a la cadena de peticin, obtenemos nada. No hay cadena de peticin a
todos! El mensaje sigue ah, pero muestra nada, slo como pedimos que lo haga. Dado que
esta es una especie de desconcertante a la vista, lo reemplazaremos con un indicador mnimo:

PS1 = "\ $"


Eso est mejor. Por lo menos ahora podemos ver lo que estamos haciendo. Observe el espacio
final dentro de las comillas dobles. Esto proporciona el espacio entre el signo de dlar y el
cursor cuando
158

Tratando algunos diseos alternativos


Prompt
Se muestra el smbolo.
Vamos a aadir una campana
en nuestro mensaje:
$ PS1 = "\ [\ a \] \ $"
Ahora debemos or un pitido cada vez que se muestra el smbolo. Esto podra obtener
molesto, pero puede ser til si necesitbamos una notificacin cuando un comando especial
de larga duracin se ha ejecutado. Tenga en cuenta que se incluyeron las secuencias \ [\] y.
Desde la campana ASCII (\ a) no "letra", es decir, que no se mueve el cursor, necesitamos
decirle fiesta para que pueda determinar correctamente la longitud de la indicacin.
A continuacin, vamos a tratar de hacer un smbolo informativo con algn nombre de host y
la informacin de la hora del da:

$ PS1 = "\ A \ h \ $"


17:33 linuxbox $
La hora del da para nuestra pronta Adicin ser til si necesitamos hacer un seguimiento de
cuando realizamos determinadas tareas. Por ltimo, vamos a hacer un nuevo mensaje que es
similar a la nuestra original de:
17:37 linuxbox $ PS1 = "<\ u @ \ h \ W> \ $"
<me @ linuxbox ~> $
Pruebe las otras secuencias que figuran en la tabla anterior y ver si se puede llegar a un nuevo
smbolo brillante.

Aadiendo color
La mayora de los programas emuladores de terminal responden a ciertas secuencias de
caracteres no imprimibles para controlar cosas tales como atributos de carcter (como el color,
el texto en negrita, y el texto parpadeante temido) y la posicin del cursor. Vamos a cubrir la
posicin del cursor en un poco, pero primero vamos a ver el color.

159

Confusin Terminal
Ya en la antigedad, cuando los terminales se engancharon a equipos remotos, haba
muchas marcas de la competencia de los terminales y todos ellos trabajaron de
manera diferente. Tenan diferentes teclados y todos ellos tenan diferentes formas de
interpretar la informacin de control. Unix y sistemas tipo Unix tienen dos
subsistemas ms complejos para hacer frente a la babel de control del terminal
(denominado termcap y terminfo). Si nos fijamos en lo ms profundo de la
configuracin del emulador de terminal es posible encontrar una configuracin para
el tipo de emulacin de terminal.
En un esfuerzo por hacer terminales parecen ser una especie de lenguaje comn, el
American National Standards Institute (ANSI) desarroll un conjunto estndar de
secuencias de caracteres para controlar terminales de vdeo. Old Time usuarios de
DOS recordarn la AN - archivo SI.SYS que se utiliz para permitir la interpretacin
de estos cdigos.
- Personalizacin de El Smbolo

13

Color de los caracteres se controla mediante el envo del emulador de terminal un cdigo de
escape ANSI incrustado en el flujo de caracteres que se mostrar. El cdigo de control no
"imprimir" en la pantalla, sino que se interpreta por el terminal como una instruccin. Como
vimos en la tabla anterior, el \ [y \] secuencias se utilizan para encapsular caracteres no
imprimibles. Un cdigo de escape ANSI comienza con una octal 033 (el cdigo generado por
la tecla de escape), seguido de un atributo de carcter opcional, seguido de una instruccin.
Por ejemplo, el cdigo para establecer el color del texto a la normalidad (atributo = 0), texto en
negro es:
\ 033 [0; 30m
Aqu hay una tabla de colores de texto disponibles. Observe que los colores se dividen en dos
grupos, diferenciados por la aplicacin del atributo de negrita carcter (1) que crea la
apariencia de los colores "ligeros":
Table14- 2: Secuencias de escape utiliza para ajustar colores de texto

Secuencia

Color del texto

\ 033 [0; 30m

Negro

\ 033 [1; 30m

Gris oscuro

\ 033 [0; 31m

Rojo

\ 033 [1; 31m

Red Light

\ 033 [0; 32m

Verde

\ 033 [1; 32m

Verde Luz

\ 033 [0; 33m

Marrn

\ 033 [1; 33m

Amarillo

\ 033 [0; 34m

Azul

\ 033 [1; 34m

Azul claro

\ 033 [0; 35m

Prpura

\ 033 [1; 35m

Purpreo claro

160

Secuencia

Color del texto

Aadiendo color
\ 033 [0; 36m

Cyan \ 033 [1; 36m

Cian claro

\ 033 [0; 37m

Gris claro \ 033 [1; 37m

Blanco

Vamos a tratar de hacer un smbolo rojo. Nos insertaremos el cdigo de escape por el
principio:
<M @ linuxbox ~> $ PS1 = "\ [\ 033 [0; 31m \] <\ u @ \ h \ W>
<m @ linuxbox ~> $ \ $"
Eso funciona, pero aviso de que todo el texto que escribimos despus el smbolo tambin es
rojo. Para solucionar esto, vamos a aadir otro cdigo de escape hasta el final de la
confirmacin que dice el emulador de terminal para volver al color anterior:
<M @ linuxbox ~> $ PS1 = "\ [\ 033 [0; 31m \] <\ u @ \ h \ W> \ $ \ [\ 033 [0m \]"
<M @ linuxbox ~> $
Eso es mejor!
Tambin es posible configurar el color de fondo del texto utilizando los cdigos que figuran a
continuacin. Los colores de fondo no son compatibles con el atributo negrita.
Tabla 13-3: Secuencias de escape utiliza para establecer el color de fondo

Secuencia

Color de fondo

Secuencia

Color de fondo

\ 033 [0; 40m

Negro

\ 033 [0; 44m

Azul

\ 033 [0; 41m

Rojo

\ 033 [0; 45m

Prpura

\ 033 [0; 42m


\ 033 [0; 43m

Verde
Marrn

\ 033 [0; 46m


\ 033 [0; 47m

Cyan
Gris claro

<M @ linuxbox ~> $ PS1 = "\ [\ 033 [0; 41m \] <\ u @ \ h \ W> \ $ \ [\ 033 [0m \]"
<M @ linuxbox ~> $
Podemos crear un smbolo con un fondo rojo mediante la aplicacin de un simple cambio en el
primer cdigo de escape:
Pruebe los cdigos de colores y ver lo que puede crear!

161

13 - Personalizacin de El Smbolo

Nota: Adems de la normal (0) y subrayado en negrita (1) atributos de caracteres, el


texto tambin se puede dar (4), parpadeando (5), e inversa (7) atribuye tambin. En aras
del buen gusto, muchos emuladores de terminal se niegan a honrar el atributo de
parpadear, sin embargo.

Mover el cursor
Cdigos de escape se pueden utilizar para posicionar el cursor. Esto se utiliza comnmente
para proporcionar un reloj o algn otro tipo de informacin en una ubicacin diferente en la
pantalla, tal como una esquina superior cada vez que el smbolo se dibuja. Aqu est una lista
de los cdigos de escape que posicionan el cursor:
Tabla 13-4: Secuencias de Escape movimiento del cursor

Escapar Cdigo
\ 033 [l; cH

Accin
Mueva el cursor a la lnea L y la columna c

\ 033 [nA
\ 033 [NB

Mueva el cursor hacia arriba n lneas


Mueva el cursor hacia abajo n lneas

\ 033 [nC

Mueva el cursor hacia adelante n caracteres

\ 033 [nD
\ 033 [2J

Mueva el cursor hacia atrs n caracteres

\ 033 [K

Borrar en la posicin del cursor hasta el final de la lnea actual

\ 033 [s
\ 033 [u

Guarde la posicin actual del cursor


Recuerde la posicin del cursor almacenada

Desactive la pantalla y mover el cursor a la esquina superior izquierda


(lnea 0, columna 0)

El uso de los cdigos de arriba, vamos a construir un indicador que seala a una barra roja en
PS1 = "\ [\ 033 [s \ 033 [0; 0H \ 033 [0; 41m \ 033 [K \ 033 [1; 33m \ t \ 033 [0m
\ 033 [u \] <\ u @ \ h \ W> \ $ "
la parte superior de la pantalla que contiene un reloj (dictada en texto amarillo) cada vez que
se muestra el smbolo. El cdigo para el smbolo es esta cadena busca formidable:
Echemos un vistazo a cada parte de la cadena para ver que es lo que hace:

162

Tabla 13-5: Desglose De La Cadena Smbolo del Complejo

Secuencia
\[

\ 033 [s

Mover el cursor

Accin
Comienza una secuencia de caracteres no imprimibles. El propsito
de esto es para permitir bash para calcular correctamente el tamao
del smbolo del visible. Sin un clculo exacto, funciones de edicin
de lnea de comandos no pueden colocar el cursor correctamente.
Almacenar la posicin del cursor. Esto es necesario para volver a la
ubicacin de smbolo despus de la barra y el reloj se han elaborado
en la parte superior de la pantalla. Tenga en cuenta que algunos
emuladores de terminal no honran este cdigo.

\ 033 [0; 0H

Mueva el cursor a la esquina superior izquierda, que es la lnea 0,


columna 0.

\ 033 [0; 41m


\ 033 [K

Ajuste el color de fondo a rojo.

\ 033 [1; 33m


\T

Ajuste el color del texto a amarillo.

\ 033 [0m

Apague color. Esto afecta tanto el texto y el fondo.

\ 033 [u
\]
<\ U @ \ h \ W> \
$

Restaurar la posicin del cursor guardado anteriormente.


Poner fin a la secuencia de caracteres no imprimibles.
Cadena Prompt.

Borrar desde la ubicacin actual del cursor (la esquina superior


izquierda) para el final de la lnea. Desde el color de fondo es rojo
ahora, la lnea se borra a ese color creando nuestro bar. Tenga en
cuenta que la limpieza hasta el final de la lnea no cambia la posicin
del cursor, que permanece en la esquina superior izquierda.

Muestra la hora actual. Si bien este es un elemento de "impresin",


todava incluimos en la parte de no impresin de la solicitud, ya que
no queremos que bash para incluir el reloj la hora de calcular el
verdadero tamao de la lnea de la pantalla.

Ahorro El Prompt
Obviamente, no queremos estar escribiendo monstruo que todo el tiempo, as que vamos a
querer guardar nuestro en alguna parte del sistema. Podemos hacer el smbolo permanente
PS1 = "\ [\ 033 [s \ 033 [0; 0H \ 033 [0; 41m \ 033 [K \ 033 [1; 33m \ t \ 033 [0m
\ 033 [u \]
aadiendo a nuestro archivo .bashrc. Para ello, aadir estas dos lneas al archivo:

163

<\ U @ \ h \ W>
\ $ "export PS1
13 - Personalizacin de El Smbolo

Resumiendo
Lo creas o no, hay mucho ms que se puede hacer con los mensajes que implican funciones de
shell y los scripts que no hemos cubierto aqu, pero este es un buen comienzo. No todo el
mundo le importa lo suficiente como para cambiar el smbolo, ya que el indicador
predeterminado es generalmente satisfactoria. Pero para aquellos de nosotros que les gusta
juguetear, la cscara proporciona la oportunidad para que muchas horas de diversin trivial.

Lectura adicional

164

El CMO Smbolo del golpe de la Proyecto de Documentacin de Linux proporciona


una discusin bastante completa de lo que el intrprete de comandos se puede hacer
para hacer. Est disponible en:
http://tldp.org/HOWTO/Bash-Prompt-HOWTO/

Wikipedia tiene un buen artculo sobre los cdigos de escape ANSI:


http://en.wikipedia.org/wiki/ANSI escapar cdigo

Parte 3 - Tareas comunes y herramientas Esenciales

Parte 3 - Tareas comunes y esenciales


Instrumentos

14 - Gestin de paquetes

165

14 - Gestin de paquetes
Si gastamos todo momento en la comunidad Linux, escuchamos muchas opiniones en cuanto
a cul de las muchas distribuciones de Linux es "mejor". A menudo, estas discusiones se
ponen realmente tonto, centrndose en aspectos como la hermosura del fondo del escritorio
(algunas personas ganaron 't utilizar Ubuntu debido a su esquema de color por defecto!) y
otros asuntos triviales.
El determinante ms importante de la calidad de la distribucin es el sistema de paquetes y la
vitalidad de la comunidad el apoyo de la distribucin. A medida que pasamos ms tiempo
con Linux, vemos que su entorno de software es extremadamente dinmico. Las cosas estn
cambiando constantemente. La mayor parte de la grada superior de las distribuciones Linux
liberar nuevas versiones cada seis meses y muchos programas individuales actualiza todos los
das. Para mantenerse al da con esta ventisca de software, necesitamos buenas herramientas
para la gestin de paquetes.
Gestin de paquetes es un mtodo de instalacin y mantenimiento de software en el sistema.
Hoy en da, la mayora de la gente puede satisfacer todas sus necesidades de software
mediante la instalacin de paquetes de su distribucin de Linux. Esto contrasta con los
primeros das de Linux, cuando uno tena que descargar y compilar el cdigo fuente con el fin
de instalar el software. No es que haya nada malo con la compilacin de cdigo fuente; De
hecho, tener acceso al cdigo fuente es la gran maravilla de Linux. Nos (y todos los dems) le
da la capacidad de examinar y mejorar el sistema. Es slo que el tener un paquete
precompilado es ms rpido y ms fcil de tratar.
En este captulo, vamos a ver algunas de las herramientas de lnea de comandos utilizados
para la gestin de paquetes. Si bien todas las principales distribuciones proporcionan potentes
y sofisticados programas grficos para el mantenimiento del sistema, es importante aprender
acerca de los programas de lnea de comandos, tambin. Ellos pueden realizar muchas tareas
que son difciles (o imposibles) de hacer con sus homlogos grficas.

Packaging Systems
Diferentes distribuciones utilizan diferentes sistemas de envasado y como regla general, un
paquete destinado a una distribucin no es compatible con otra distribucin. La mayora de
las distribuciones caen en una de dos campos de las tecnologas de envasado: el campamento
de Debian ".deb" y el campo ".rpm" Red Hat. Hay algunas excepciones importantes, como
Gentoo, Slack- ware, y Prospectiva, pero la mayora de los otros usan uno de estos dos
sistemas bsicos.

166

Packaging Systems

Tabla 14-1: Principales familias de sistema de embalaje

Sistema de Embalaje

Distribuciones (Lista Parcial)

Estilo Debian (.deb)


Red Hat Estilo (.rpm)

Debian, Ubuntu, Xandros, Linspire


Fedora, CentOS, Red Hat Enterprise Linux, openSUSE,
Mandriva, PCLinuxOS

Cmo funciona un sistema de paquetes


El mtodo de distribucin de software que se encuentra en la industria del software
propietario por lo general conlleva la compra de una pieza de soporte de instalacin, como un
"disco de instalacin" y luego ejecutar un "asistente de instalacin" para instalar una nueva
aplicacin en el sistema.
Linux no funciona de esa manera. Prcticamente todo el software para un sistema Linux se
puede encontrar en Internet. La mayor parte sern aportados por el proveedor de distribucin
en forma de archivos de paquetes y el resto estar disponible en forma de cdigo fuente que se
puede instalar de forma manual. Hablaremos un poco sobre cmo instalar el software
mediante la compilacin de cdigo fuente en un captulo posterior.

Package Files
La unidad bsica de software en un sistema de envasado es el archivo del paquete. Un archivo
de paquete es una coleccin comprimido de archivos que componen el paquete de software.
Un paquete puede consistir en numerosos programas y archivos de datos que apoyan los
programas. Adems de los archivos que se instale, el archivo del paquete tambin incluye
metadatos acerca del paquete, como un texto de descripcin del paquete y su contenido.
Adems, muchos paquetes contienen secuencias de comandos previas y posteriores a la
instalacin que realizan tareas de configuracin antes y despus de la instalacin del paquete.
Los archivos del paquete son creados por una persona conocida como mantenedor del
paquete, a menudo (pero no siempre) un empleado del proveedor de distribucin. El
mantenedor del paquete obtiene el software en forma de cdigo fuente desde el proveedor de
aguas arriba (el autor del programa), compila y crea los metadatos del paquete y las
secuencias de comandos de instalacin necesarios. A menudo, el mantenedor del paquete se
aplicar modificaciones al cdigo fuente original para mejorar la integracin del programa con
las otras partes de la distribucin de Linux.

Repositorios
Mientras que algunos proyectos de software eligen realizar su propio embalaje y distribucin,
la mayora de los paquetes actuales son creados por los proveedores de distribucin y los
terceros interesados. Los paquetes se pondrn a disposicin de los usuarios de una
distribucin en repositorios centrales que pueden contener muchos miles de paquetes, cada
uno especialmente construidos y mantenidos para la distribucin.

14 - Gestin de paquetes

167

Una distribucin puede mantener varios repositorios diferentes para las diferentes etapas del
ciclo de vida de desarrollo de software. Por ejemplo, generalmente existir un repositorio

"pruebas" que contiene los paquetes que slo se han construido y estn destinados a ser
utilizados por los valientes almas que estn en busca de errores antes de ser liberados para su
distribucin general. Una distribucin a menudo tienen un repositorio de "desarrollo", donde
los paquetes de trabajo-en-progreso destinados para su inclusin en la prxima versin maj o
de la distribucin se mantienen.
Una distribucin tambin puede haber relacionado repositorios de terceros. Estos son a
menudo necesarios para suministrar un software que, por razones legales, tales como patentes
o cuestiones DRM contra la elusin, no puede ser incluido en la distribucin. Tal vez el caso
ms conocido es el de apoyo DVD encriptado, que no es legal en los Estados Unidos. Los
repositorios de terceros operan en pases donde no se aplican las patentes de software y las
leyes contra la elusin. Estos repositorios suelen ser totalmente independiente de la
distribucin que apoyan y de utilizarlos, hay que saber acerca de ellos y de forma manual
incluirlos en los archivos de configuracin para el sistema de gestin de paquetes.

Dependencias
Programas rara vez "independiente"; sino que se basan en la presencia de otros componentes
de software para hacer su trabajo. Las actividades comunes, tales como entrada / salida por
ejemplo, son manejados por rutinas compartidas por muchos programas. Estas rutinas se
almacenan en lo que se denominan bibliotecas compartidas, que proporcionan servicios
esenciales a ms de un programa. Si un paquete requiere un recurso compartido, como una
biblioteca compartida, que se dice que tiene una dependencia. Los sistemas modernos de
gestin de paquetes de todas las proporcionan algn mtodo de resolucin de dependencias
para asegurar que cuando se instala un paquete, todas sus dependencias estn instaladas,
tambin.

Herramientas del paquete de alta y de baja intensidad


Sistemas de gestin de paquetes por lo general consisten en dos tipos de herramientas:
herramientas de bajo nivel que se encargan de tareas como la instalacin y la eliminacin de
archivos de paquetes y herramientas de alto nivel que realizan la bsqueda de metadatos y
resolucin de dependencias. En este captulo, vamos a ver las herramientas que se suministran
con los sistemas de estilo Debian (como Ubuntu y muchos otros) y los utilizados por los
ltimos productos de Red Hat. Mientras que todas las distribuciones de estilo de Red Hat se
basan en el mismo programa de bajo nivel (rpm), se utilizan diferentes herramientas de alto
nivel. Para nuestra discusin, vamos a cubrir el programa de alto nivel yum, utilizado por
Fedora, Red Hat Enterprise Linux y CentOS. Otras distribuciones de estilo de Red Hat
proporcionan herramientas de alto nivel con caractersticas comparables.
Table14- 2: Herramientas del sistema de embalaje
Herramientas de bajo
Distribuciones
Herramientas de alto nivel
nivel
Debian-Style

dpkg

apt-get, aptitude

168
Cmo funciona un sistema de paquetes
Fedora, Red Hat
Enterprise Linux, CentOS

rpm

yum

Tareas de administracin de paquete comn


Hay muchas operaciones que se pueden realizar con las herramientas de gestin de paquetes
de lnea de comandos. Vamos a ver los ms comunes. Tenga en cuenta que las herramientas
de bajo nivel tambin apoyan la creacin de archivos de paquetes, una actividad fuera del
mbito de este libro.
En la discusin que sigue, el trmino "nombre_paquete" se refiere al nombre real de un
paquete en lugar del trmino "package_file," que es el nombre del archivo que contiene el
paquete.

Encontrar un paquete en un repositorio


El uso de las herramientas de alto nivel para buscar metadatos repositorio, un paquete puede
estar ubicado en funcin de su nombre o descripcin.
Tabla 14-3: Comandos del paquete de la bsqueda
Estilo
Debian
Red Hat

Comando (s)
apt-get update
apt-cache search SEARCH_STRING
yum bsqueda SEARCH_STRING

Ejemplo: Para buscar yum repositorio para el editor de texto Emacs, este comando podra
ser
un usado:

yum emacs bsqueda

Instalacin de un paquete de un repositorio


Herramientas de alto nivel permiten un paquete para descargar de un repositorio y se instala
con resolucin de dependencias completo.
Tabla 14-4: Comandos de instalacin del paquete
Estilo
Debian

Comando (s)
apt-get update

169

14 - Gestin de paquetes
apt-get install nombre_paquete Red Hat

apt-get update; apt-get install emacs


yum install nombre_paquete
Ejemplo: Para instalar el editor de texto Emacs desde un repositorio apt:

Instalacin de un paquete de un paquete de archivos


Si un archivo de paquete ha sido descargado de una fuente distinta de un repositorio, puede
ser instalado directamente (aunque sin dependencia de resolucin) utilizando una
herramienta de bajo nivel.
Tabla 14-5: Comandos de instalacin de paquetes de bajo nivel
Estilo
Debian

Comando (s)
dpkg --install package_file

Red Hat

rpm -i package_file

rpm -i emacs-22.1-7.fc7-i386.rpm
Ejemplo: Si el archivo de paquete emacs-22.1-7.fc7-i386.rpm haba sido descargado de un sitio
no repositorio, que sera instalado de esta manera:

Nota: Dado que esta tcnica utiliza el programa rpm de bajo nivel para llevar a cabo la
instalacin, no se realiza ninguna resolucin de dependencias. Si rpm descubre una
dependencia faltante, rpm terminar con un error.

Eliminacin de un paquete
Los paquetes se pueden desinstalar utilizando el nivel alto o herramientas de bajo nivel. Las
herramientas de alto nivel se muestran a continuacin.

170

Tareas de administracin de paquete comn


Table15- 6: Comandos eliminacin de paquetes
Estilo

Comando (s)

Debian
Red Hat

apt-get remove nombre_del_paquete


yum borrar nombre_paquete

apt-get remove emacs


Ejemplo: Para desinstalar el paquete emacs desde un sistema al estilo Debian:

Actualizacin de paquetes desde un repositorio


La tarea de administracin ms comn paquete es mantener el sistema de puesta al da con los
ltimos paquetes. Las herramientas de alto nivel pueden realizar esta tarea vital en un solo
paso.
Tabla 14-7: Comandos del paquete Actualizar
Estilo

Comando (s)

Debian
Red Hat

apt-get update; apt-get upgrade


yum update

apt-get update; apt-get upgrade


Ejemplo: Para aplicar las actualizaciones disponibles para los paquetes instalados en un
sistema al estilo Debian:

Actualizacin de un paquete desde un archivo de paquete


Si una versin actualizada de un paquete se ha descargado de una fuente no-repositorio, se
puede instalar, en sustitucin de la versin anterior:
Tabla 14-8: Paquete de bajo nivel Actualiza Comandos
Estilo

Comando (s)

Debian

dpkg --install package_file

171

14 - Gestin de paquetes
Red Hat

-U rpm package_file

rpm -U emacs-22.1-7.fc7-i386.rpm
Ejemplo: Actualizacin de una instalacin existente de emacs a la versin contenida en el
archivo del paquete emacs-22.1-7.fc7-i386.rpm en un sistema Red Hat:

Nota: dpkg no tiene una opcin especfica para la actualizacin de un paquete frente a la
instalacin de uno como rpm hace.

Listado de paquetes instalados


Estos comandos se pueden utilizar para mostrar una lista de todos los paquetes instalados en
el sistema: Tabla 14-9: Comandos lista de paquetes
Estilo
Debian

Comando (s)
dpkg --list

Red Hat

rpm -qa

La determinacin de si un paquete est instalado

Estas herramientas de se puede utilizar para visualizar si se instala un paquete especificado:


bajo nivel
Tabla 14-10: Comandos estado del paquete
Estilo
Debian

Comando (s)
dpkg --status nombre_paquete

Red Hat

rpm -q nombre_paquete

dpkg emacs --status


Ejemplo: Determinar si el paquete emacs se instala en un sistema de estilo Debian:

172

Tareas de administracin de paquete comn

Viendo Info Acerca de un paquete instalado


Si se conoce el nombre de un paquete instalado, los siguientes comandos se pueden utilizar
para mostrar una descripcin del paquete:
Tabla 14-11: Paquete Comandos de Informacin
Estilo
Debian

Comando (s)
apt-cache show nombre_paquete

Red Hat

yum info nombre_paquete

apt-cache show emacs


Ejemplo: Para ver una descripcin del paquete emacs en un sistema al estilo Debian:

Encontrar a qu paquete instal un archivo


Para determinar qu paquete es responsable de la instalacin de un archivo en particular, los
siguientes comandos se pueden utilizar:
Tabla 14-12: Paquete de archivos Comandos de identificacin
Estilo
Debian

Comando (s)
dpkg --search nombre_archivo

Red Hat

rpm -qf nombre_archivo

Ejemplo: Para
ver

qu paquete instalado el / Usr / bin / vim archivo en un sistema Red Hat:

rpm -qf / usr / bin / vim

Resumiendo
En los captulos que siguen, vamos a explorar muchos programas diferentes que abarcan una
amplia gama de reas de aplicacin. Si bien la mayora de estos programas son comnmente
instalados por defecto, es posible que necesitemos instalar paquetes adicionales si los
programas necesarios no estn ya instalados en nuestro sistema. Con nuestro nuevo
conocimiento (y apreciacin) del paquete

173

14 - Gestin de paquetes ___________________________________________________________


gestin, que no debera tener problemas de la instalacin y la gestin de los programas que
necesitamos.

El mito de instalacin del software de Linux


Las personas que migran desde otras plataformas a veces son vctimas de el mito de
que el software es de alguna manera difcil de instalar en Linux y que la variedad de
esquemas de embalaje utilizado por diferentes distribuciones es un obstculo. Bueno,
es un obstculo, sino slo a los vendedores de software propietario que deseen
distribuir binary- slo versiones de su software secreto.
El ecosistema de software de Linux se basa en la idea de cdigo fuente abierto. Si un
desarrollador de programas libera el cdigo fuente para un producto, es probable que
una persona asociada con una distribucin empaquetar el producto e incluirlo en su
repositorio. Este mtodo garantiza que el producto est bien integrado en la
distribucin y el usuario tiene la conveniencia de "ventanilla nica" para el software,
en lugar de tener que buscar la pgina web de cada producto.
Los controladores de dispositivos se manejan de la misma manera, excepto que en
lugar de ser elementos separados en el repositorio de la distribucin, se convierten en
parte del ncleo de Linux en s mismo. En trminos generales, no hay tal cosa como
un "disco de controladores" en Linux. O bien el kernel soporta un dispositivo o no lo
hace, y el kernel de Linux soporta una gran cantidad de dispositivos. Muchos ms, de
hecho, que hace Windows. Por supuesto, esto es de ningn consuelo si el dispositivo
en particular que usted necesita no es compatible. Cuando esto sucede, usted tiene
que mirar a la causa. La falta de soporte de controlador suele ser causado por una de
tres cosas:
1. El dispositivo es demasiado nuevo. Dado que muchos proveedores de
hardware no apoyan activamente el desarrollo de Linux, que cae sobre un
miembro de la comunidad de Linux para escribir el cdigo de controlador del
ncleo. Esto toma tiempo.
2. El dispositivo es demasiado extico. No todas las distribuciones incluyen
todos los controladores de dispositivos posible. Cada distribucin construye
sus propios ncleos, y puesto que los granos son muy configurable (que es lo
que hace posible ejecutar Linux en todo, desde los relojes de pulsera para
mainframes) que pueden haber pasado por alto un dispositivo en particular. Al
localizar y descargar el cdigo fuente del controlador, es posible que usted (s,
usted) para compilar e instalar el controlador usted mismo. Este proceso no es
excesivamente difcil, pero es bastante complicado. Hablaremos de la
compilacin de software en un captulo posterior.
3. El proveedor de hardware est ocultando algo. Han lanzado ni cdigo fuente
para un controlador para Linux, ni han publicado la documentacin tcnica
para alguien para crear una para ellos. Esto significa que el proveedor de
hardware est tratando de mantener las interfaces de programacin para el
dispositivo de un secreto. Dado que no queremos dispositivos secretos en
nuestras computadoras, le sugiero que se quite el hardware infractor y el tono a
174 la basura con sus otros artculos intiles.

Lectura adicional

Lectura adicional
Dedique algn tiempo a conocer el sistema de gestin de paquetes para su distribucin. Cada
distribucin proporciona documentacin para sus herramientas de gestin de paquetes.
Adems, aqu estn algunas fuentes ms genricas:
El captulo de Debian GNU / Linux FAQ en la administracin de paquetes ofrece una
visin general de la gestin de paquetes en sistemas Debian:
http://www.debian.org/doc/FAQ/ch-pkgtools .en.html
La pgina principal del proyecto
RPM: http://www.rpm.org
La pgina de inicio para el proyecto de la Universidad de Duke
YUM: http://linux.duke.edu/projects/yum/
Por un poco de historia, la Wikipedia tiene un artculo sobre los metadatos:
http://en.wikipedia.org/wiki/Metadata

15 - Soporte de almacenamiento

175

15

- Soporte de almacenamiento

En los captulos anteriores hemos visto la manipulacin de los datos a nivel de archivo. En
este captulo, vamos a considerar los datos a nivel de dispositivo. Linux tiene capacidades
increbles para el manejo de dispositivos de almacenamiento, ya sea de almacenamiento fsico,
tales como discos duros, o almacenamiento de red o dispositivos de almacenamiento virtuales
como RAID (matriz redundante de discos independientes) y LVM (Logical Volume Manager).
Sin embargo, ya que este no es un libro sobre la administracin del sistema, no vamos a tratar
de cubrir todo este tema en profundidad. Lo que vamos a tratar de hacer es introducir algunos
de los conceptos y comandos de teclado que se utilizan para gestionar los dispositivos de
almacenamiento.
Para llevar a cabo los ejercicios de este captulo, vamos a utilizar una unidad flash USB, un
disco CD-RW (para sistemas equipados con una grabadora de CD-ROM) y un disquete (de
nuevo, si el sistema est equipado para ello.)
Vamos a ver los siguientes comandos:
mount - Montar un sistema de archivos
umount - Desmontar un sistema de archivos
fsck - Comprobar y reparar un sistema de archivos
fdisk - Particin tabla manipulador
mkfs - Crear un sistema de archivos
fdformat - Formatear un disquete
dd - Escribir los datos en bloque orientado directamente a un dispositivo
genisoimage (mkisofs) - Crear un archivo de imagen ISO 9660
wodim (cdrecord) - Escribir datos en un soporte de almacenamiento ptico
md5sum - Calcula una suma de comprobacin MD5

Montaje y desmontaje de dispositivos de almacenamiento


Los recientes avances en el escritorio de Linux han hecho la administracin de dispositivos de
almacenamiento extremadamente 176
Montaje y desmontaje de dispositivos de almacenamiento
fcil para los usuarios de escritorio. En su mayor parte, adjuntamos un dispositivo a nuestro
sistema y que "simplemente funciona". De vuelta en los viejos tiempos (por ejemplo, 2004),
esto tena que hacerse manualmente. En sistemas nondesktop (es decir, servidores) este es
todava un procedimiento en gran medida manual, ya que los servidores suelen tener
necesidades extremas de almacenamiento y los requisitos de configuracin complejas.
El primer paso en la gestin de un dispositivo de almacenamiento est uniendo el dispositivo
para el rbol del sistema de archivos. Este proceso, llamado de montaje, permite que el
dispositivo de participar con el sistema operativo. Como recordamos en el captulo 2, los
sistemas operativos tipo Unix, como Linux, mantener un solo rbol del sistema de archivos

con los dispositivos conectados en varios puntos. Esto contrasta con otros sistemas operativos
como MS-DOS y Windows que mantienen los rboles del sistema de archivos separados para
cada dispositivo (por ejemplo, C: \, D: \, etc.).
Un archivo llamado / etc / fstab muestra los dispositivos (normalmente particiones de disco
duro) que se van a montar en el arranque. He aqu un ejemplo / etc / fstab de un sistema
Fedora 7:
LABEL = / 12
LABEL = / home
LABEL = / b00t
tmpfs
devpts
sysfs
proc
LABEL =
SWAP-sda3

/
/ Home
/ Boot
/ Dev / shm
/ dev / pts
/ sys
/ Proc
intercambio

ext3
ext3
ext3
tmpfs
devpts
sysfs
proc
interca
mbio

por defecto
por defecto
por defecto
por defecto
gid = 5, mode =
620 defecto
por
por defecto
por defecto

11
12
12
00
00
00
00
00

La mayora de los sistemas de archivos que figuran en este fichero de ejemplo son virtuales y
no son aplicables a nuestra discusin. Para nuestros propsitos, los interesantes son los tres
primeros:
LABEL = / 12
LABEL = / home
LABEL = / b00t

11
12
12
Estas son las particiones del disco duro. Cada lnea del archivo se compone de seis campos,
de la siguiente manera:
Tabla 15-1: Campos / etc / fstab
Contenido del campo
1 dispositivo

177

/
/ Home
/ Boot

ext3
ext3
ext3

por defecto
por defecto
por defecto

Descripcin
Tradicionalmente, este campo contiene el nombre real de
un archivo de dispositivo asociado con el dispositivo fsico,
como por ejemplo / dev / hda1 (la primera particin del
dispositivo maestro en el primer canal IDE). Pero con los
ordenadores de hoy en da, que tienen muchos dispositivos
que son conectables en caliente (como unidades USB),
muchas distribuciones modernas de Linux

15 - Soporte de almacenamiento

Punto de montaje

Archivo Tipo de
sistema

Opciones

Frecuencia
Orden

asociar un dispositivo con una etiqueta de texto en su


lugar. Esta etiqueta (que se aade a los medios de
almacenamiento cuando se formatea) es ledo por el
sistema operativo cuando el dispositivo est conectado al
sistema. De esa manera, no importa qu dispositivo archivo
se asigna al dispositivo fsico real, que todava puede ser
identificado correctamente.
El directorio en el que el dispositivo est conectado al rbol
del sistema de archivos.
Linux permite que muchos tipos de sistemas de archivos
para ser montados. La mayora de los sistemas de archivos
de Linux nativo son ext3, pero muchos otros son
compatibles, tales como FAT16 (MSDOS), FAT32 (vfat),
NTFS (NTFS), CD-ROM (iso9660), etc.
Los sistemas de archivos se pueden montar con varias
opciones. Es posible, por ejemplo, para montar sistemas de
archivos como de slo lectura, o para impedir que otros
programas se ejecuta de ellos (una caracterstica de
seguridad til para los medios extrables).
Un solo nmero que especifica si y cuando un sistema de
archivos es de hacer copia de seguridad con el comando
dump.
Un solo nmero que especifica en qu orden los sistemas
de archivos se deben comprobar con el comando fsck.

Visualizacin de una lista de sistemas de archivos montados


El comando mount se utiliza para montar sistemas de archivos. Entrando el comando sin
argumentos mostrar una lista de los sistemas de ficheros montados actualmente:

[Me @ linuxbox ~] $ mount / dev / sda2 en / tipo ext3 (rw) proc en


el tipo de / proc proc (rw) sysfs sysfs en / sys tipo (rw)
devpts en / dev / pts escriba devpts (rw, gid = 5, mode = 620)
/ Dev / sda5 en / Tipo de casa ext3 (rw)
/ Dev / sda1 en / boot tipo ext3 (rw) tmpfs en / dev / shm tmpfs tipo
(rw)
ninguno en / proc / sys / fs / binfmt_misc tipo binfmt_misc (rw) sunrpc / var / lib
/ nfs / rpc_pipefs rpc_pipefs tipo (rw) fusectl en / sys / fs / fusible / conexiones
tipo fusectl (rw) / dev / sdd1 en / media / tipo de disco vfat (rw, nosuid, nodev,
noatime,

178

uhelper = hal, uid = 500, utf8, nombre corto = inferior)


twin4: / musicbox en / misc / musicbox tipo nfs4 (rw, addr = 192.168.1.4)
Montaje y desmontaje de dispositivos de almacenamiento
El formato de la lista es la siguiente: dispositivo del tipo punto_montaje file_system_type
[Me @ linuxbox ~] monto $
/ Dev / mapper / VolGroup00-LogVol00 en / tipo ext3 (rw) proc en el
tipo de / proc proc (rw) sysfs sysfs en / sys tipo (rw)
devpts en / dev / pts escriba devpts (rw, gid = 5, mode = 620) / dev /
hda1 en / boot tipo ext3 (rw) tmpfs en / dev / shm tmpfs tipo (rw)
ninguno en / proc / sys / fs / binfmt_misc tipo binfmt_misc (rw) sunrpc
en / var / lib / nfs / rpc_pipefs rpc_pipefs tipo (rw)
(opciones). Por ejemplo, la primera lnea muestra que el dispositivo / dev / sda2 est
montado como sistema de archivos raz, es de tipo ext3, y es a la vez de lectura y escritura (la
opcin "rw"). Esta lista tambin tiene dos entradas interesantes en la parte inferior de la lista.
La entrada-penltima muestra una tarjeta de memoria SD de 2 gigabytes en un lector de
[Me @ linuxbox ~] monto $
/ Dev / mapper / VolGroup00-LogVol00 en / tipo ext3 (rw) proc en el
tipo de / proc proc (rw) sysfs sysfs en / sys tipo (rw)
devpts en / dev / pts escriba devpts (rw, gid = 5, mode = 620)
/ Dev / hda1 en / boot tipo ext3 (rw) tmpfs en / dev / shm tmpfs tipo
(rw)
ninguno en / proc / sys / fs / binfmt_misc tipo binfmt_misc (rw) sunrpc
en / var / lib / nfs / rpc_pipefs rpc_pipefs tipo (rw)
/ Dev / hdc en el tipo /media/live-1.0.10-8 iso9660 (ro, noexec, nosuid, nodev, uid =
500)
tarjetas montado en / media / disk, y la ltima entrada es una unidad de red montada en /
misc / musicbox.
Para nuestro primer experimento, vamos a trabajar con un CD-ROM. En primer lugar,
echemos un vistazo a un sistema antes de que se inserta un CD-ROM:
Este anuncio es de un sistema CentOS 5, que est utilizando LVM (Logical Volume Manager)
para crear su sistema de archivos raz. Al igual que muchas distribuciones de Linux, este
sistema intentar montar automticamente el CD-ROM despus de la insercin. Despus de
insertar el disco, vemos lo siguiente:
Despus de insertar el disco, vemos la misma lista como antes con una entrada adicional. Al
final de la lista vemos que el CD-ROM (que es el dispositivo / dev / hdc en esta ma
179

15 - Soporte de
almacenamiento
TEM) se ha montado en /media/live-1.0.10-8, y es de tipo iso9660 (CDROM). A los efectos de
nuestro experimento, estamos interesados en el nombre del dispositivo. Al realizar este
experimento usted mismo, el nombre del dispositivo ser probablemente diferente.

Advertencia: En los ejemplos que siguen, es de vital importancia que usted


preste mucha atencin a los nombres de los dispositivos actuales en uso en su
sistema y no utilice los nombres utilizados en este texto!
Tambin tenga en cuenta que los CDs de audio no son los mismos que los CD-ROM.
Los CD de audio no contienen sistemas de archivos y por lo tanto no se pueden montar
en el sentido habitual.
Ahora que ya tenemos el nombre del dispositivo de la unidad de CD-ROM, vamos a
desmontar el disco y volver a montar en otro lugar en el rbol del sistema de archivos. Para
ello, nos convertimos en el superusuario (con el comando adecuado para nuestro sistema) y
desmontar el disco con el comando umount (ntese la ortografa):

[Me @ linuxbox ~] $ su - Password:


[Root @ linuxbox ~] # umount / dev / hdc

El siguiente paso es crear un nuevo punto de montaje del disco. Un punto de montaje es
simplemente un directorio en alguna parte en el rbol del sistema de archivos. No hay nada
especial en ello. Ni siquiera tiene que ser un directorio vaco, aunque si se monta un
dispositivo en un directorio que no est vaca, usted no ser capaz de ver contenidos previos
del directorio hasta que se desmonte el dispositivo. Para nuestros propsitos, vamos a crear
un nuevo directorio:
[Root @ linuxbox ~] # mkdir / mnt / cdrom
Por ltimo, monte el CD-ROM en el nuevo punto de montaje. La opcin -t se utiliza para
especificar el tipo de sistema de archivos:

[Root @ linuxbox ~] # mount -t iso9660 / dev / hdc / mnt / cdrom


Despus, podemos examinar el contenido del CD-ROM a travs del nuevo punto de
montaje:
[Root @ linuxbox ~] # cd / mnt / cdrom

180

Montaje y desmontaje de dispositivos de


almacenamiento
[root @ linuxbox cdrom] # ls
Observe lo que sucede cuando tratamos de desmontar el
CD-ROM:
[Root @ linuxbox cdrom] # umount / dev / hdc
umount: / mnt / cdrom: dispositivo est ocupado
Por qu es esto? La razn es que no podemos desmontar un dispositivo si el dispositivo est
siendo utilizado por alguien o algn proceso. En este caso, hemos cambiado nuestro directorio
de trabajo para el punto de montaje del CD-ROM, lo que hace que el dispositivo sea ocupado.
Podemos solucionar fcilmente el problema cambiando el directorio de trabajo a algo ms que
el punto de montaje:
[Root @ linuxbox cdrom] # cd [root @
linuxbox ~] # umount / dev / hdc
Ahora el dispositivo desmonta con xito.

Por qu es importante la Desmontando


Si nos fijamos en el resultado del comando libre, que muestra estadsticas sobre el uso
de memoria, ver una estadstica llamada "buffers". Los sistemas informticos estn
diseados para ir tan rpido como sea posible. Uno de los impedimentos para la
velocidad del sistema es dispositivos lentos. Las impresoras son un buen ejemplo.
Incluso la impresora ms rpida es extremadamente lento para los estndares
informticos. Una computadora sera muy lento de hecho si tuviera que parar y
esperar a que una impresora termine de imprimir una pgina. En los primeros das de
las computadoras (antes de la multitarea), este era un problema real. Si usted estaba
trabajando en un documento de hoja de clculo o de texto, el equipo dejara de estar
disponible y cada vez que se imprime. El ordenador enva los datos a la impresora
ms rpido que la impresora podra aceptarlo, pero era muy lento ya que las
impresoras no imprimen muy rpido. Este problema fue resuelto por el advenimiento
de la memoria intermedia de la impresora, un dispositivo que contiene parte de la
memoria RAM que se sentara entre el ordenador y la impresora. Con el bfer de la
impresora en su lugar, el equipo enviara la salida de la impresora en el bfer y sera
rpidamente ser almacenada en la memoria RAM rpida por lo que el equipo podra
volver a trabajar sin necesidad de esperar. Mientras tanto, el bfer de la impresora
sera lentamente en cola los datos a la impresora de la memoria del tampn a la
velocidad a la que la impresora podra aceptarlo.
181

Esta idea de la memoria intermedia se utiliza ampliamente en los ordenadores para


hacerlos ms rpido. No deje que la necesidad de leer de vez en cuando o escribir
datos desde o hacia dispositivos lentos obstaculizan la velocidad del sistema. Los
sistemas operativos almacenar datos que se ha ledo desde, y es que se escribe en los
dispositivos de almacenamiento en la memoria para el mayor tiempo posible antes de
tener que interactuar con el dispositivo ms lento. En un sistema Linux, por ejemplo,
te dars cuenta de que el sistema parece llenar la memoria ya que se utiliza. Esto no
significa que Linux est "utilizando" toda la memoria, significa que Linux se est
aprovechando de toda la memoria disponible para hacer la mayor cantidad de
amortiguacin, ya que puede.
Esto permite el almacenamiento en bfer de escritura a los dispositivos de
almacenamiento a hacerse muy rpidamente, porque la escritura para el dispositivo
fsico est siendo diferida a un momento futuro. Mientras tanto, los datos destinados
para el dispositivo se acumulan en la memoria. De vez en cuando, el sistema
operativo escribir estos datos en el dispositivo fsico.
Desmontaje de un dispositivo implica escribir todos los datos restantes en el
dispositivo de modo que pueda extraerse de forma segura. Si el dispositivo se retira
sin desmontarlo primero, existe la posibilidad de que no todos los datos destinados
para el dispositivo ha sido transferido. En algunos casos, estos datos pueden incluir
actualizaciones de directorios vitales, lo que conducir a la corrupcin del sistema de
archivos, una de las peores cosas que pueden suceder en un equipo.
15 - Soporte de almacenamiento

Determinacin de nombres de dispositivos


A veces es difcil determinar el nombre de un dispositivo. De vuelta en los viejos tiempos, no
fue muy difcil. Un dispositivo era siempre en el mismo lugar y que no cambi. Sistemas de
tipo Unix como de esa manera. Antes, cuando Unix fue desarrollado, "el cambio de una
unidad de disco" implic el uso de un montacargas para eliminar un dispositivo del tamao
de la mquina de lavado de la sala de ordenadores. En los ltimos aos, la configuracin
tpica de hardware de escritorio se ha vuelto muy dinmico y Linux ha evolucionado para ser
ms flexible que sus antecesores.
En los ejemplos anteriores nos aprovechamos de la capacidad del escritorio moderno para
Linux "automgicamente" montar el dispositivo y luego determinar el nombre despus de los
hechos. Pero lo que si estamos gestionando un servidor o algn otro entorno en el que esto no
ocurra? Cmo podemos averiguarlo?
En primer lugar, echemos un vistazo a cmo los dispositivos de nombres del sistema. Si
listamos el contenido del directorio / dev (donde viven todos los dispositivos), podemos ver
[Me @ linuxbox ~] $ ls / dev
que hay un montn y un montn de dispositivos:
Los contenidos de este listado revelan algunos patrones de nombres de dispositivos. Aqu
estn algunos:

182

Montaje y desmontaje de dispositivos de almacenamiento


Tabla 15-2: Linux Nombres de dispositivo de almacenamiento
Patrn
Dispositivo
/ Dev / fd *
/ Dev / hd *

/ Dev / lp *
/ Dev / sd *

/ Dev / sr *

Unidades de disquete.
IDE (PATA) de discos en sistemas ms antiguos. Placas base tpicas
contienen dos conectores IDE o canales, cada uno con un cable con
dos puntos de fijacin para las unidades. La primera unidad en el
cable se llama el dispositivo maestro y el segundo se llama el
dispositivo esclavo. Los nombres de los dispositivos se ordenan de tal
manera que / dev / hda se refiere al dispositivo principal en el
primer canal, / dev / hdb es el dispositivo esclavo en el primer canal;
/ Dev / hdc, el dispositivo maestro en el segundo canal, y as
sucesivamente. Un dgito de salida indica el nmero de particin en
el dispositivo. Por ejemplo, / dev / hdal se refiere a la primera
particin en el primer disco duro en el sistema, mientras que / dev /
hda hace referencia a toda la unidad.
Impresoras.
Discos SCSI. En los sistemas recientes de Linux, el kernel trata todos
los dispositivos (incluyendo en forma de disco PATA / discos duros
SATA, unidades flash y dispositivos de almacenamiento masivo
USB, como reproductores de msica porttiles y cmaras digitales)
como discos SCSI. El resto del sistema de nombres es similar a la
anterior / dev / hd * esquema de nombres descrito anteriormente.
Las unidades pticas (lectores de CD / DVD y quemadores).

Adems, a menudo vemos enlaces simblicos, como / dev / cdrom, / dev / dvd, y / dev /
floppy, que apuntan a los archivos de dispositivos reales, proporcionado para su
conveniencia.
Si usted est trabajando en un sistema que no se monta automticamente los dispositivos
extrables, puede utilizar la siguiente tcnica para determinar cmo el dispositivo extrable se
llama cuando est unido. En primer lugar, comenzar una visin en tiempo real de los / var /
[me @ linuxbox ~] $ sudo cola -f / var / log / messages
log / messages o / var / log archivo / syslog (usted puede requerir privilegios de
superusuario para esto):
Las ltimas lneas del archivo se mostrarn a continuacin, hacer una pausa. A continuacin,
conecte el dispositivo extrable. En este ejemplo, vamos a utilizar una unidad flash de 16 MB.
Casi de inmediato, el kernel se dar cuenta de que el dispositivo y la sonda que:

183

15

- Soporte de almacenamiento

kernel: sd

kernel: sdb: sdb1 sd


kernel: 3: 0: 0: 0:
00

disco extrable 23
de julio 10:07:59
sg3 tipo 0

00

Jul 23 10:07:53 kernel linuxbox: usando scsi3 configuracin # 1 elegido:: usb 3-2:
uhci_hcd y direccin de 02 de julio 23 del
ncleo 10:07:53 linuxbox: desde el 1 de nuevo usb dispositivo USB de velocidad
eleccin
Jul23
2310:07:53
10:07:59kernel
kernellinuxbox:
linuxbox:Los
sdb: sdb1
completa
3.2 emulacin SCSI para
Jul
23 de julio del
kernel 10:07:59 linuxbox: sd 3: 0: 0: 0: [sdb] Attached SCSI disco
dispositivos
de almacenamiento
extrable
exploracin scsi masivo USB: MENSAJE
Jul
23 10:07:58 kernel linuxbox:
(5), utilizando 36
demasiado
corto
Jul 23 10:07:58 kernel linuxbox: scsi 3: 0: 0:resultado
0: Direct-Access
Easy
Disco 1.00
0 ANSI 2
[Sdb] 31263 512-byte
kernel: sd
sectores de hardware (16 MB)
proteccin contra
23 de julio 10:07:59 linuxbox off
kernel: sd 3: 0: 0: 0: [Sdb] De
escritura
est
Jul 23 10:07:59 cach linuxbox:
escribir a travs de 23 de julio
kernel: sd 3: 0: 0: 0: [Sdb] Suponiendo unidad
10:07:59 sectores de hardware
linuxbox (16 MB) 23 de julio
kernel: sd 3: 0: 0: 0: [Sdb] 31263 512-byte
10:07:59 linuxbox off
proteccin contra
23 de julio 10:07:59 cach
kernel: sd 3: 0: 0: 0: [Sdb] De
escritura
est
linuxbox: escribir a travs de
kernel: sd 3: 0: 0: 0: [Sdb] Suponiendo unidad

[Sdb] Attached SCSI


Attached SCSI genrico

Despus de la pantalla hace una pausa de nuevo, pulse Ctrl-c para obtener la parte posterior
del sistema. Las partes interesantes de la salida son las repetidas referencias a "[sdb]", que
coincide con nuestra expectativa de un nombre de dispositivo de disco SCSI. Sabiendo esto,
dos lneas se vuelven particularmente esclarecedor:
Esto nos dice el nombre de dispositivo es / dev / sdb para todo el dispositivo y / dev / sdb1
para la primera particin en el dispositivo. Como hemos visto, el trabajo con Linux est lleno
de interesante trabajo de detective!

Consejo: Utilizando la tcnica de tail -f / var / log / messages es una gran manera de ver
lo que el sistema est haciendo en tiempo casi real.
Con nuestro nombre del dispositivo en la mano, ahora podemos montar la unidad flash:
184

Montaje y desmontaje de dispositivos de almacenamiento


[Me @ linuxbox ~] $ Sudo mkdir / mnt / flash
[Me @ linuxbox ~] $ Sudo mount / dev / sdb1 / mnt / flash
[Me @ linuxbox ~] $ Df
Sistema de
1K-blocks
Usado Disponible Utilice Montado en
%/
/Archivos
Dev / sda2
15115452
5186944
9775164 35%
/ Dev / sda5
59631908
31777376 24776480 57% / Home
/ Dev / sda1
147764
17277
122858 13% / Boot
tmpfs
776808
0
776808 0% / Dev / shm
/ Dev / sdb1
15560
0
15560 0% / Mnt / flash
El nombre del dispositivo se mantendr igual, siempre y cuando se mantenga conectado
fsicamente a la computadora y la computadora no se reinicia.

Creacin de Nuevos Sistemas de archivos


Digamos que queremos volver a formatear la unidad flash con un sistema de archivos nativo
de Linux, en lugar del sistema FAT32 que tiene ahora. Esto implica dos pasos: 1. (Opcional)
Cree un nuevo diseo de la particin si la existente no es de nuestro agrado, y 2. crear un
nuevo sistema de archivos, vaco en la unidad.

Advertencia! En el siguiente ejercicio, vamos a dar formato a una unidad flash.


Utilice una unidad que no contiene nada que te importa, ya que se borrar! Una
vez ms, estar absolutamente seguro de que est especificando el nombre de
dispositivo correcto para su sistema, no el que se muestra en el texto. La
inobservancia de esta advertencia puede resultar en que el formateo (es decir,
borrado) la unidad equivocada!

Particiones Manipular con fdisk


El programa fdisk nos permite interactuar directamente con los dispositivos en forma de disco
(por ejemplo, unidades de disco duro y unidades de memoria flash) en un nivel muy bajo.
Con esta herramienta podemos editar, eliminar y crear particiones en el dispositivo. Para
[Me @ linuxbox ~] $ sudo umount / dev / sdbl
[Me @ linuxbox ~] $ sudo fdisk / dev / sdb
trabajar con nuestra unidad flash, primero tenemos que desmontarlo (si es necesario) y luego
invocar el programa fdisk de la siguiente manera:
Ntese que hay que especificar el dispositivo en trminos de todo el dispositivo, no por el
nmero de particin. Despus de que el programa se pone en marcha, vamos a ver el smbolo
siguiente:

185

15 - Soporte de
almacenamiento
Comando (m para ayuda):
Introduccin de una "m" se mostrar el men del
programa:
Accin Comando
un alternar una bandera arrancable
b edicin de etiquetas de disco BSD
c alternar el DOS compatibilidad bandera d
eliminar una particin
l
Lista conocido tipos de particiones
m imprimir este men
n aadir una nueva particin
o crear una nueva tabla de particiones DOS vaca p
imprimir la tabla de particiones
q salir sin guardar los cambios
s crear una nueva etiqueta de disco Sun vaco
t
cambiar Identificacin del sistema de una
particin
u cambiar la pantalla de entrada de unidades /
v
verificar la tabla de particiones
tabla de escritura w en el disco y la salida (slo
expertos) x funcionalidad adicional

Comando (m para ayuda):


Lo primero que queremos hacer es examinar la distribucin de la particin existente. Hacemos
esto mediante la introduccin de "p" para imprimir la tabla de particiones para el dispositivo:

Comando (m for help): p


Disco / dev / sdb: 16 MB, 16.006.656 bytes 1 cabezas,
31 sectores / pista, 1008 cilindros Unidades = cilindros
de 31 * 512 = 15872 bytes
Dispositivo de inicio Comienzo
/ Dev / sdb1
2

Fin
1008

Bloques Id Sistema
15608+ b W95 FAT32

En este ejemplo, vemos un dispositivo de 16 MB con una nica particin (1) que utiliza 1.006
de los 1.008 cilindros disponibles en el dispositivo. La particin se identifica como una
particin FAT32 de Windows 95. Algunos programas utilizan este identificador para limitar el
tipo de operacin que se puede hacer para el disco, pero la mayora de las veces no es crtica
para cambiarlo. Sin embargo,
186

Creacin de Nuevos
Sistemas de archivos
en aras de la demostracin, nosotros lo cambiar para indicar una particin de Linux. Para
ello, tenemos que averiguar primero qu ID se utiliza para identificar una particin de Linux.
En el listado anterior, vemos que el ID de "b" se utiliza para especificar la particin existente.
Para ver una lista de los tipos de particiones disponibles, nos referimos de nuevo al men del
programa. No podemos ver la siguiente opcin:

l Lista conocido tipos de particiones


Si entramos "l" en el indicador, se muestra una larga lista de posibles tipos. Entre ellos vemos
"b" para nuestro tipo de particin existente y "83" para Linux.
Volviendo al men, vemos esta opcin para cambiar el ID de la particin:

t cambiar Identificacin del sistema de una


particin
Entramos en "T" en el indicador de entrar en el
nuevo ID:
Comando (m para ayuda): t
Particin seleccionada 1
Cdigo hexadecimal (tipo L a la lista de cdigos): 83
Tipo de sistema cambi de particin 1-83 (Linux)
Esto completa de todos los cambios que tenemos que hacer. Hasta este punto, el dispositivo
ha sido tocado (todos los cambios han sido almacenados en la memoria, no en el dispositivo
fsico), as que vamos a escribir la tabla de particiones modificada para el dispositivo y la
salida. Para ello, entramos en "w" en el indicador:

Comando (m para ayuda): w


La tabla de particin ha sido alterado!
Llamando a ioctl () para volver a leer la tabla de particiones.
ADVERTENCIA: Si ha creado o modificado las particiones DOS 6.x, consulte
la pgina de manual de fdisk para obtener informacin adicional.
Sincronizacin de discos.
[Me @ linuxbox ~] $

Si hubiramos decidido dejar el dispositivo sin cambios, podramos haber entrado en "q" en el
smbolo,
187

[Me @ linuxbox ~] $ sudo mkfs -t ext3 / dev / sdbl mke2fs 1.40.2 (12-jul-2007)
Etiqueta del sistema de archivos =
Tipo de SO: Linux
Tamao de bloque = 1024 (log = 0)
Tamao del fragmento = 1024 (log = 0)
3904 inodos, 15608 bloques
780 bloques (5.00%) reservados para el superusuario Primer bloque de datos = 1
bloquea los mximos del sistema de archivos = 15990784 2 grupos de bloques
8192 bloques por grupo, 8192 fragmentos por grupo
1952 inodos por grupo
Las copias de seguridad almacenadas en Superblock bloques:
8193
Escribir tablas de inodos: Creacin de hecho revista (1024 bloques): hecho
Escribiendo superbloques y la informacin contable del sistema de ficheros: hecho
Este sistema de archivos se comprobar de forma automtica cada 34 montajes o 180
das, lo que ocurra primero. Utilice tune2fs -c -i o para anular. [Me @ linuxbox ~] $
15 - Soporte de almacenamiento que habra salido del programa sin tener que escribir los
cambios. Podemos ignorar el mensaje de advertencia que suena ominosa.

La creacin de un nuevo sistema de archivos Con mkfs


Con nuestra edicin de particin de hecho (de peso ligero a pesar de que podra haber sido) es
el momento de crear un nuevo sistema de archivos en nuestra unidad flash. Para ello, vamos a
utilizar mkfs (abreviatura de "hacer que el sistema de archivos"), que puede crear sistemas de
archivos en una variedad de formatos. Para crear un sistema de archivos ext3 en el
dispositivo, se utiliza la opcin "-t" para especificar el "ext3" tipo de sistema, seguido por el
nombre del dispositivo que contiene la particin que queremos formato:
El programa mostrar una gran cantidad de informacin cuando ext3 es el tipo de sistema de
archivos escogido. Para volver a formatear el dispositivo a su sistema de archivos FAT32
[Me @ linuxbox ~] $ sudo mkfs -t vfat / dev / sdbl
original, especifique "vfat" como el sistema de archivos
type:
Este proceso de particin y el formato se puede utilizar en cualquier momento los dispositivos
de almacenamiento adicionales se aaden al sistema. Mientras trabajamos con una unidad
flash diminuto, el mismo proceso
188

________________________________________________________ Creacin
Sistemas de archivos

de

Nuevos

se puede aplicar a los discos duros internos y otros dispositivos de almacenamiento extrables,
como unidades de disco duro USB.

Prueba y reparacin de sistemas de archivos


En nuestra discusin anterior del archivo / etc / fstab, vimos algunos dgitos misteriosas al
final de cada lnea. Cada vez que se inicia el sistema, se comprueba de forma rutinaria la
integridad de los sistemas de archivos antes de montarlos. Esto se hace por el programa fsck
(abreviatura de "comprobacin del sistema de archivos"). El ltimo nmero en cada entrada
fstab especifica el orden en el que los dispositivos se van a comprobar. En nuestro ejemplo
anterior, vemos que el sistema de archivos raz se comprueba en primer lugar, seguido de los
sistemas de origen y de archivos de arranque. Los dispositivos con un cero como el ltimo
dgito no se comprueban de forma rutinaria.
Adems de comprobar la integridad de los sistemas de archivos, fsck tambin puede reparar
sistemas de archivos corruptos con mayor o menor xito, dependiendo de la cantidad de
[Me @ linuxbox ~] $ sudo fsck / dev / sdbl fsck 1.40.8
(13-Mar-2008) e2fsck 1.40.8 (13-Mar-2008)
/ Dev / sdb1: limpio, 11/3904, archivos 1661/15608 bloques
dao. En los sistemas de archivos tipo Unix, se recuperaron partes de los archivos se colocan
en el directorio lost + found, que se encuentra en la raz de cada sistema de archivos.
Para comprobar nuestra unidad flash (que debe ser desmontado en primer lugar), podramos

Lo que el fsck?
En la cultura Unix, la palabra "fsck" se utiliza a menudo en lugar de una palabra
popular con el que comparte tres letras. Esto es especialmente apropiado, teniendo en
cuenta que es probable que se pronunciar la palabra antes mencionada si te
encuentras en una situacin en la que se ven obligados a ejecutar fsck.
hacer lo siguiente:

En mi experiencia, la corrupcin del sistema de archivos es bastante raro a menos que haya un
problema de hardware, tales como una unidad de disco en su defecto. En la mayora de los
sistemas, la corrupcin del sistema de archivos detectados en el arranque har que el sistema
se detenga y que dirija a ejecutar fsck antes de continuar.

Formatear disquetes
Para aquellos de nosotros todava el uso de computadoras con edad suficiente para ser
equipado con disquete
189

15 - Soporte de
almacenamiento
unidades, que pueden gestionar los dispositivos, tambin. Preparacin de un disquete en
blanco para su uso es un proceso de dos pasos. En primer lugar, se realiza un formateo de bajo
nivel en el disquete, y luego crear un sistema de archivos. Para llevar a cabo el formateo,
utilizamos el programa fdformat especificando el nombre de la unidad de disquete
(normalmente / dev / fd0):
[Me @ linuxbox ~] $ Sudo fdformat / dev / fd0
De doble cara, 80 pistas, 18 seg / pista. La capacidad total de 1.440 kB.
Formateo ..
. hecho
Verificacin de hecho
...
A continuacin, se aplica un sistema de archivos FAT en el disquete con mkfs:

[Me @ linuxbox ~] $ sudo mkfs -t msdos / dev / fd0


Ntese que usamos el tipo "msdos" sistema de archivos para obtener las tablas de asignacin
de archivo de estilo de ms edad (y ms pequeas). Despus se prepara un disquete, puede
ser montado como otros dispositivos.

Mover los datos directamente a / desde dispositivos


Aunque solemos pensar en los datos en nuestros ordenadores como siendo organizado en
archivos, tambin es posible pensar en los datos en forma "cruda". Si nos fijamos en una
unidad de disco, por ejemplo, vemos que se compone de un gran nmero de "bloques" de
datos que el sistema operativo ve como directorios y archivos. Sin embargo, si pudiramos
tratar a una unidad de disco simplemente como una gran coleccin de bloques de datos,
podramos realizar tareas tiles, como los dispositivos de clonacin.
El programa dd realiza esta tarea. Se copia bloques de datos de un lugar a otro. Utiliza una
sintaxis nica (por razones histricas) y por lo general se utiliza de esta manera:

dd if = archivo_entrada de output_file = [bs = block_size [count =


bloques]]
Vamos a decir que tuvimos dos unidades de memoria flash USB del mismo tamao y
queramos copiar exactamente la primera unidad a la segunda. Si nos apegamos ambas
unidades a la computadora y son como - firmado a los dispositivos / dev / sdb y / dev / sdc,
respectivamente, podramos copiar todo en la primera unidad de la segunda unidad con lo
siguiente:

dd if = / dev / sdb of = / dev /


sdc

190

Mover los datos directamente a / desde dispositivos

dd if = / dev / sdb de = flash_drive.img


Alternativamente, si slo el primer dispositivo se conecta al equipo, podemos copiar su
contenido a un archivo normal para su posterior restauracin o copia:

Advertencia! El comando dd es muy potente. A pesar de su nombre deriva de


"definicin de datos", que a veces se llama "destruir el disco" ya que los usuarios a
menudo mistype ya sea si los o de las especificaciones. Siempre vuelva a comprobar
sus especificaciones de entrada y salida antes de pulsar ENTER!

Creacin de CD-ROM Imgenes


Escribir un CD-ROM grabable (ya sea un CD-R o CD-RW) consta de dos pasos; en primer
lugar, la construccin de un archivo de imagen ISO que es la imagen exacta del sistema de
archivos del CD-ROM y en segundo lugar, escribir el archivo de imagen en los medios de
comunicacin de CD-ROM.

Creacin de una imagen de copia de un CD-ROM


Si queremos hacer una imagen ISO de un CD-ROM existente, podemos utilizar dd para leer
todos los bloques de datos fuera de la unidad de CD-ROM y copiarlos en un archivo local.
Decir que tuvimos un CD de Ubuntu y queramos hacer un archivo ISO que podramos
utilizar ms adelante para hacer ms copias. Despus de insertar el CD y la determinacin de
su nombre de dispositivo (asumiremos / dev / cdrom), podemos hacer que el archivo iso de
dd if = / dev / cdrom of = ubuntu.iso
este modo:
Esta tcnica funciona para DVDs de datos, as, pero no va a funcionar para los CD de audio, ya
que no utilizan un sistema de archivos para su almacenamiento. Para los CDs de audio, mira
el comando cdrdao.

Creacin de una imagen de una coleccin de archivos


Para crear un archivo de imagen ISO que contiene el contenido de un directorio, se utiliza el
programa genisoimage. Para ello, primero creamos un directorio que contiene todos los
archivos que deseamos incluir en la imagen, y luego ejecutar el comando genisoimage para
crear el archivo de imagen. Por ejemplo, si hubiramos creado un directorio llamado ~ /
CD-ROM en archivos y lo llen con los archivos de nuestro CD-ROM, se podra crear un
archivo de imagen llamado rom.iso CD con el siguiente comando:
191

Un Programa por cualquier otro nombre ...


Si nos fijamos en los tutoriales en lnea para la creacin y grabacin de medios pticos
como CD-ROM y DVD, se encontrar con frecuencia dos programas llamados mkisofs
y cdrecord.
Estos programas
parte ende un paquete popular llamado
cd-rom.iso
genisoimage
-o -R -J ~ /eran
CD-ROM
archivos
"Herramientas CDR" escritos por Jrg Schilling. En el verano de 2006, el Sr. Schilling
hizo un cambio de licencia a una porcin del paquete cdrtools que, en la opinin de
muchos en la comunidad Linux, crea una incompatibilidad con la licencia GPL de
GNU. Como resultado, se inici un tenedor de la cdrtools proy ect que ahora incluye
los programas de sustitucin de cdrecord y mkisofs llamado wodim y genisoimage,
respectivamente.
15 - Soporte de almacenamiento
La opcin "-R", aade metadatos para las extensiones Rock Ridge, lo que permite el uso de
nombres de archivo largos y los permisos de archivos de estilo POSIX. Del mismo modo, la
opcin "-J" permite a las extensiones Joliet, que permiten nombres de archivo largos para
Windows.

Escribir CD-ROM Imgenes


Despus tenemos un archivo de imagen, podemos grabarlo en nuestro medio ptico. La
mayora de los comandos que discutiremos a continuacin se puede aplicar tanto a los medios
de comunicacin de CD-ROM y DVD grabables.

Montaje de una imagen ISO directamente


Hay un truco que podemos utilizar para montar una imagen ISO, mientras que todava est en
nuestro disco duro y la tratamos como si ya estuviera en medios pticos. Mediante la adicin

mkdir / mnt / iso_image


mount -t iso9660 -o loop image.iso / mnt / iso_image
de la opcin "-o loop" para montar (junto con el "-t iso9660" Tipo de sistema de archivos es
necesario), se puede montar el archivo de imagen como si se tratara de un dispositivo y
conctelo al rbol del sistema de archivos:
En el ejemplo anterior, hemos creado un punto de montaje llamado / mnt / iso_image y luego
montamos la image.iso archivo de imagen en ese punto de montaje. Despus se monta la
imagen, se puede tratar como si se tratara de un verdadero CD-ROM o DVD. Recuerde que
debe desmontar la imagen cuando ya no es necesaria.
192

Escribir CD-ROM Imgenes

Tapas de CD-ROM Un Re-grabable


Regrabables CD-RW necesita ser borrado o borrado antes de que pueda ser reutilizado. Para
ello, podemos utilizar wodim, especificando el nombre del dispositivo para la grabadora de
CD y el tipo de borrado a realizar. El programa wodim ofrece varios tipos. El ms mnimo (y
wodim dev = / dev / CDRW en
blanco = rpido
ms rpido) es el tipo "rpido":

Escribiendo Una Imagen


wodim dev = / dev / CDRW
image.iso
Para escribir una imagen, una vez ms utilizamos wodim, especificando el nombre de los
medios de comunicacin dispositivo ptico escritor y el nombre del archivo de imagen:
Adems del nombre del dispositivo y el archivo de imagen, wodim soporta un conjunto muy
grande de opciones. Dos de los ms comunes son "-v" para salida detallada, y "-dao", que
escribe el disco en el modo disc-at-once. Este modo se debe utilizar si se est preparando un
disco para la reproduccin comercial. El modo por defecto para wodim es Track-at-once, que
es til para la grabacin de pistas de msica.

Resumiendo
En este captulo hemos visto las tareas bsicas de gestin de almacenamiento. Hay, por
supuesto, muchos ms. Linux soporta una amplia gama de dispositivos de almacenamiento y
esquemas del sistema de archivos. Tambin ofrece muchas caractersticas para la
interoperabilidad con otros sistemas.

Lectura adicional
Echa un vistazo a las pginas de manual de los comandos que hemos cubierto. Algunos de
ellos soportan un gran nmero de opciones y operaciones. Tambin, busque los tutoriales en
lnea para aadir unidades de disco duro a su sistema Linux (hay muchos) y el trabajo con los
medios de comunicacin ptica.

Crdito extra
A menudo es til para verificar la integridad de una imagen ISO que hemos descargado. En la
mayora de los casos, un distribuidor de una imagen iso tambin suministrar un archivo de
suma de comprobacin. Una suma de control es el resultado de un clculo matemtico extico
que resulta en un nmero que representa el con-

193

15 - Soporte de
almacenamiento
tienda de campaa del archivo de destino. Si el contenido del cambio de archivos, incluso por
un bit, la suma de comprobacin resultante ser muy diferente. El mtodo ms comn de la
generacin de suma de control utiliza el programa md5sum. Cuando utilice md5sum,
produce un nmero hexadecimal nico:

image.iso md5sum
Image.iso 34e354760f9bb7fbf85c96f6a3f94ece
Despus de descargar una imagen, se debe ejecutar md5sum en contra de ella y comparar los
resultados con el valor md5sum proporcionada por el editor.
Adems de comprobar la integridad de un archivo descargado, podemos usar md5sum para
verificar medios pticos recin escritos. Para ello, primero calculamos la suma de
comprobacin del archivo de imagen y luego calcular una suma de comprobacin de los
medios de comunicacin. El truco para la verificacin de los medios de comunicacin es la de
limitar el clculo a slo la parte de los medios de comunicacin ptica que contiene la imagen.
Hacemos esto mediante la determinacin de la cantidad de 2.048 bloques de byte contiene la
imagen (medios pticos siempre se escribe en 2048 bloques de bytes) y la lectura de esa
cantidad de bloques de los medios de comunicacin. En algunos tipos de medios de
comunicacin, esto no es necesario. Un CD-R escrita en disc-at-once modo se puede
comprobar de esta manera:

md5sum / dev / cdrom


34e354760f9bb7fbf85c96f6a3f94ece / dev / cdrom
Muchos tipos de medios de comunicacin, tales como DVDs, requieren un clculo preciso del
nmero de bloques. En el siguiente ejemplo, comprobamos la integridad del archivo de
imagen de DVD-image.iso y el disco en el lector de DVD / dev / dvd. Puedes averiguar
cmo funciona esto?

md5sum dvd-image.iso; dd if = / dev / dvd bs = 2048 count = $ (($ (dvd-image.iso


stat -c "% s") / 2048)) | md5sum

194

16 - Redes

16 - Redes
Cuando se trata de la creacin de redes, probablemente no hay nada que no se puede hacer
con Linux. Linux se utiliza para construir todo tipo de sistemas y dispositivos de red,
incluidos los servidores de seguridad, enrutadores, servidores de nombres, NAS (Network
Attached Storage) cajas y as sucesivamente.
As como el tema de la creacin de redes es enorme, por lo que son el nmero de comandos
que se pueden usar para configurar y controlar. Nos vamos a centrar nuestra atencin en slo
algunos de los ms utilizados queridos. Los comandos elegidos para examen incluyen los
utilizados para supervisar las redes y los utilizados para transferir archivos. Adems, vamos a
explorar el programa ssh que se utiliza para realizar conexiones remotas. Este captulo
cubrir:

d e p i n g - Enviar un ECHO_REQUEST ICMP a los hosts de la red

t r a c e r o u t e - Imprimir la traza enrutar paquetes a un host de red

n e t s t a t - Conexiones de red de impresin, tablas de enrutamiento, estadsticas de la


interfaz, mascarada conexiones, y las pertenencias de multidifusin

programa de transferencia de archivos de Internet - ftp

w g e t - Descargador de red no interactivo

ssh - cliente SSH OpenSSH (programa de inicio de sesin remoto)


Vamos a asumir un poco de historia en la creacin de redes. En esta, la era de Internet, todo el
mundo utilizando un ordenador necesita una comprensin bsica de los conceptos de
networking. Para hacer un uso completo de este captulo hay que estar familiarizado con los
siguientes trminos:

Direccin IP (Protocolo de Internet)

Host y nombre de dominio

URI (Uniform Resource Identifier)


Por favor, consulte la seccin "Otras lecturas" a continuacin para algunos artculos tiles con
respecto a estos trminos.

Nota: Algunos de los comandos que cubriremos puede (dependiendo de su distribucin)


requieren la instalacin de paquetes adicionales desde los repositorios de su distribucin,

195

16 - Redes
y algunos pueden requerir privilegios de superusuario para ejecutar.

El examen y el seguimiento de una Red


Incluso si usted no es el administrador del sistema, a menudo es til para examinar el
rendimiento y funcionamiento de una red.

de ping
El comando ms bsico de la red es de ping. El comando ping enva un paquete de red
especial llamada ECHO_REQUEST IMCP a un host especificado. La mayora de los
dispositivos de red que reciben este paquete respondern a la misma, lo que permite la
conexin de red para ser verificada.

Nota: Es posible configurar la mayora de los dispositivos de red (incluyendo los hosts
de Linux) hacer caso omiso de estos paquetes. Esto se hace generalmente por razones
de seguridad, para ocultar parcialmente una serie de un atacante potencial. Tambin es
[Me @ linuxbox ~] $ de ping linuxcommand.org
PING linuxcommand.org (66.35.250.210) 56 (84) bytes de datos.
64 bytes de vhost.sourceforge.net (66.35.250.210): icmp_seq = 1 TTL = 43 tiempo
= 107 ms
64 bytes de vhost.sourceforge.net (66.35.250.210): icmp_seq = 2 TTL = 43 tiempo
linuxbox ~] $ de ping linuxcommand.org
=[Me
108@ms
64 bytes de vhost.sourceforge.net (66.35.250.210): icmp_seq = 3 ttl = 43 tiempo =
106 ms
64 bytes de vhost.sourceforge.net (66.35.250.210): icmp_seq = 4 TTL = 43 tiempo
= 106 ms
64 bytes de vhost.sourceforge.net (66.35.250.210): icmp_seq = 5 TTL = 43 tiempo
= 105 ms
64 bytes de vhost.sourceforge.net (66.35.250.210): icmp_seq = 6
comn que los servidores de seguridad para ser configurados para bloquear el trfico
de IMCP.
Por ejemplo, para ver si podemos llegar a linuxcommand.org (uno de nuestros sitios
favoritos;-), podemos utilizar el uso de ping como esto:
Una vez iniciado, mesa de ping contina enviando paquetes a un intervalo especificado (por
defecto es de un segundo) hasta que se interrumpe:

196

ttl = 43 tiempo = 107 ms


- estadsticas de ping linuxcommand.org 6 paquetes transmitidos, 6 recibieron, 0% de prdida de paquetes, tiempo
6010ms rttpara
min /slashdot.org
avg / max / MDEV
= 105.647 30
/ 107.052
/ 108.118
/ 0.824
traceroute
(216.34.181.45),
saltos max,
paquetes
de ms
40 bytes
1 ipcop.localdomain (192.168.1.1)
1.066 ms 1.366 ms 1.720 ms
2 ***
3 ge-4-13-ur01.rockville.md.bad.comcast.net (68.87.130.9)
14.622
ms 14.885 ms
15.169 ms
4 po-30-ur02.rockville.md.bad.comcast.net (68.87.129.154)
17.634
ms 17.626 ms
17.899 ms
5 po-60-ur03.rockville.md.bad.comcast.net (68.87.129.158)
15.992
ms 15.983 ms
16.256 ms
6 po-30-ar01.howardcounty.md.bad.comcast.net (68.87.136.5)
22.835
ms 14.233 ms
14.405 ms
7 po-10-ar02.whitemarsh.md.bad.comcast.net (68.87.129.34)
16.154
ms 13.600 ms
18.867 ms
8 te-0-3-0-1-cr01.philadelphia.pa.ibone.comcast.net (68.86.90.77) 21,951 ms 21.073
ms 21.557 ms
9 pos-0-8-0-0-cr01.newyork.ny.ibone.comcast.net (68.86.85.10) 22,917 ms 21.884
ms
ms ~] $ traceroute slashdot.org
[Me22.126
@ linuxbox
10 204.70.144.1 (204.70.144.1)
43.110 ms 21.248 ms 21.264 ms
11 cr1-pos-0-7-3-1.newyork.savvis.net (204.70.195.93)
21.857 ms
cr2-pos-0-0-3-1.newyork.savvis.net (204.70.204.238)
19.556 ms cr1El examen y el seguimiento de una Red
Despus de que se interrumpe (en este caso despus del sexto paquete) presionando Ctrl-c, las
estadsticas de rendimiento de ping impresiones. Una red adecuada de realizar exhibir cero
por ciento de prdida de paquetes. Un "ping" con xito indicar que los elementos de la red
(las tarjetas de interfaz, el cableado, enrutamiento y gateways) son en general buenas
condiciones de funcionamiento.

traceroute
El programa traceroute (algunos sistemas utilizan el programa tracepath similar en lugar)
muestra una lista de todo el trfico de la red "saltos" tarda en llegar desde el sistema local a un
host especificado. Por ejemplo, para ver la ruta tomada para llegar slashdot.org, que bamos a
hacer esto:
La salida es la siguiente:
197

pos-0-7-3-1.newyork.savvis.net (204.70.195.93)
19.634 ms
12 cr2-pos-0-7-3-0.chicago.savvis.net (204.70.192.109)
41.586 ms
42.843 ms cr2-tengig-0-0-2-0.chicago.savvis.net (204.70.196.242) 43,115 ms
13 hr2-tengigabitethernet-12-1.elkgrovech3.savvis.net
(204.70.195.122)
44.215 ms 41.833 ms 45.658 ms
14 csr1-ve241.elkgrovech3.savvis.net (216.64.194.42)
46.840 ms
43.372 ms 47.041 ms
15 64.27.160.194 (64.27.160.194)
56.137 ms 55.887 ms 52.810 ms
16 slashdot.org (216.34.181.45)
42.727 ms 42.016 ms 41.437 ms
[Me @ linuxbox ~] $ netstat -ie
eth0
Enlace encap: Ethernet HWaddr 00: 1d: 09: 9b: 99: 67
inet addr: 192.168.1.2 Bcast: Mscara 192.168.1.255: 255.255.255.0 inet6
addr: fe80 :: 21d: 9ff: fe9b: 9967/64 Alcance: Enlace ARRIBA DIFUSIN
CORRIENDO MULTICAST MTU: 1500 Mtrica: 1 paquetes RX: 238488
errores: 0 cado: 0: 0 sobrecostos marco: 0 paquetes TX: 403217 Errores: 0
cado: 0: 0 sobrecostos de transporte: 0 colisiones: 0 txqueuelen: 100
Bytes RX: 153098921 (146,0 MB) TX bytes: 261 035 246 (248.9 MB)
Memoria: fdfc0000-fdfe0000
he aqu Enlace encap: Bucle local
inet addr: 127.0.0.1
Mscara: 255.0.0.0
inet6 addr: :: 1/128 Alcance: Anfitrin
UP LOOPBACK FUNCIONANDO MTU: 16436 Mtrica: 1
Paquetes RX: errores 2208: 0 bajaron: 0 sobrecostos: 0 marco: 0
Paquetes TX: errores 2208: 0 bajaron: 0 sobrecostos: 0 portadora: 0
colisiones: 0 txqueuelen: 0
Bytes RX: 111490 (108.8 KB) TX bytes: 111490 (108.8 KB)
16 - Redes
En la salida, se puede ver que la conexin de nuestro sistema de prueba para slashdot.org
requiere que atraviesan diecisis routers. Para los routers que proporcionan informacin de
identificacin, vemos sus nombres de host, direcciones IP y los datos de rendimiento, que
incluye tres muestras de tiempo de ida y vuelta desde el sistema local al router. Para los
routers que no proporcionan informacin de identificacin (debido a la configuracin del
router, la congestin de red, cortafuegos, etc.), vemos como asteriscos en la lnea de salto
nmero 2.

netstat
El programa netstat se usa para examinar diversas configuraciones y estadsticas de la red. A
travs del uso de sus muchas opciones, podemos mirar a una variedad de caractersticas en
nuestra configuracin de red. El uso de la opcin ", es decir", podemos examinar las interfaces
de red en nuestro sistema:
En el ejemplo anterior, podemos ver que nuestro sistema de prueba tiene dos interfaces de
red. La primera,
198

El examen y el seguimiento de una Red


llamada eth0, es la interfaz de Ethernet y el segundo, llamado he aqu, es la interfaz de bucle
de retorno, una interfaz virtual que utiliza el sistema para "hablar a s mismo."
Cuando se realiza el diagnstico de red causales, las cosas importantes a tener en cuenta son la
presencia de la palabra "UP" al comienzo de la cuarta lnea para cada interfaz, lo que indica
que la interfaz de red est habilitada, y la presencia de una direccin IP vlida en la inet addr
campo en la segunda lnea. Para los sistemas que utilizan DHCP (Dynamic Host
Configuration Protocol), una direccin IP vlida en este campo ser verificar que el DHCP est
funcionando.
El uso de la opcin "-r" mostrar la tabla de enrutamiento de red del ncleo. Esto muestra
cmo se configura la red para enviar paquetes de una red a:
[Me @ linuxbox ~] $ Netstat
Tabla de enrutamiento del
ncleo IP
Destino
Entrada
192.168.1.0
defecto

*
192.168.1.1

-r
Banderas Genmask
255.255.255.0 U
0.0.0.0 UG

MSS Ventana
00
00

irtt De Iface
0 eth0
0 eth0

En este sencillo ejemplo, vemos una tabla de enrutamiento tpica de una mquina cliente en
un (Red de rea local) LAN detrs de un firewall / router. La primera lnea de la lista muestra
el destino 192.168.1.0. Direcciones IP que terminan en cero se refiere a las redes en lugar de
hosts individuales, por lo que este destino se refiere a cualquier host en la LAN. El siguiente
campo, puerta de enlace, es el nombre o direccin IP de la puerta de enlace (enrutador) que se
utiliza para ir desde el host actual de la red de destino. Un asterisco en este campo indica que
no se necesita ninguna puerta de enlace.
La ltima lnea contiene el valor por defecto de destino. Esto significa que cualquier trfico
destinado a una red que no aparece en la lista de otro modo en la tabla. En nuestro ejemplo,
vemos que la puerta de entrada se define como un router con la direccin de 192.168.1.1, que
presumiblemente sabe qu hacer con el trfico de destino.
El programa netstat tiene muchas opciones y slo hemos mirado un par. Echa un vistazo a la
pgina man netstat para ver la lista completa.

Transporte de archivos en una red


De qu sirve una red a menos que sepamos cmo mover archivos a travs de ella? Hay
muchos programas que se mueven los datos a travs de redes. Vamos a cubrir dos de ellos
ahora y varias ms en las secciones posteriores.

ftp
Uno de los verdaderos programas "clsicos", ftp obtiene su nombre del protocolo que utiliza el
Protocolo de transferencia de archivos. FTP se utiliza ampliamente en la Internet para las
descargas de archivos. La mayora, si no todos,

199

[Me @ linuxbox ~] servidor de ficheros ftp $ Ests conectado


con fileserver.localdomain.
220 (vsftpd 2.0.1)
Nombre (servidor de ficheros: yo): annimo 331 Por favor,
especifique la contrasea.
Contrasea:
230 Inicio de sesin con xito.
Tipo de sistema remoto es UNIX.
Utilizando el modo binario para transferir archivos. ftp> cd pub /
cd_images / Ubuntu-8.04 250 Directorio cambiado
correctamente. ftp> ls
200 PORT command successful. Considere el uso de PASV.
150 Aqu viene la lista de directorios.
-rw-rw-r-- 1 500
500
733079552 25 de abril 3:53 ubuntu-8.04escritorio-i386.iso
226 Directorio de enviar en Aceptar.
ftp> lcd de escritorio
Directorio local ahora / home / me / ftp Escritorio> get
ubuntu-8.04-desktop-i386.iso
locales: ubuntu-8.04-desktop-i386.iso remoto: ubuntu-8.04-tablero del escritorio i386.iso
200 PORT command successful. Considere el uso de PASV.
150 Apertura de conexin de datos en modo binario para ubuntu-8.04-ordenador de
sobremesa i386.iso (733079552 bytes).
226 Archivo enviar Aceptar.
733079552 bytes recibidos en 68,56 segundos (10.441,5 kB / s) ftp> bye
16 - Redes ______________________________________________________________________
navegadores lo soportan y que a menudo ven los URI que comienzan con el protocolo ftp: //.
Antes de que hubiera navegadores web, no fue el programa ftp. FTP se utiliza para
comunicarse con los servidores de FTP, mquinas que contienen archivos que pueden ser
cargados y descargados a travs de una red.
FTP (en su forma original) no es seguro, ya que enva los nombres de cuenta y contraseas en
texto claro. Esto significa que no son encriptados y nadie husmeando la red puedan verlos.
Debido a esto, casi todos FTP hecho a travs de Internet se realiza mediante servidores FTP
annimo. Un servidor annimo permite que cualquiera pueda iniciar sesin utilizando el
nombre de usuario "annimo" y una contrasea sin sentido.
En el siguiente ejemplo, se muestra una sesin tpica con el programa ftp descarga de una
imagen ISO de Ubuntu ubicado en el directorio /pub/cd_images/Ubuntu-8.04 del servidor
de archivos servidor FTP annimo:
He aqu una explicacin de los comandos introducidos durante este perodo de sesiones:

200

Transporte de archivos en una red


Comando
ftp servidor de archivos

annimo

pub cd / cd_images / Ubuntu-8.04

ls
LCD de escritorio

get ubuntu-8.04-tablero del escritorio i386.iso

adis

Significado
Invoque el programa ftp y haga que la
conexin con el servidor de archivos del
servidor FTP.
Nombre de inicio de sesin. Despus de la
indicacin de inicio de sesin, aparecer
una solicitud de contrasea. Algunos
servidores aceptarn una contrasea en
blanco, otros requerirn una contrasea
en la forma de una direccin de correo
electrnico. En ese caso, intente algo como
"user@example.com".
Cambie al directorio en el sistema remoto
que contiene el archivo deseado. Tenga en
cuenta que en los servidores FTP ms
annimos, los archivos para descarga
pblica se encuentran en algn lugar bajo
el directorio pub.
Anote el directorio en el sistema remoto.
Cambie el directorio en el sistema local de
- / escritorio. En el ejemplo, el programa
de ftp se invoca cuando el directorio de
trabajo era ~. Este comando cambia el
directorio de trabajo a - / escritorio.
Dgale al sistema remoto para transferir el
archivo i386.iso-ubuntu-8.04 tablero del
escritorio para el sistema local. Desde el
directorio de trabajo en el sistema local se
cambi a - / escritorio, el archivo se
descargar all.
Cierre la sesin en el servidor remoto y
poner fin a la sesin del programa ftp. Los
comandos de dejar de fumar y de salida
tambin se pueden usar.

Al escribir "ayuda" en el "ftp>" del sistema mostrar una lista de los comandos admitidos. El
uso de FTP en un servidor en el que se han concedido los permisos necesarios, es posible
llevar a cabo
201

16 - Redes _______________________________________________________________________
muchas de las tareas de gestin de archivos ordinarios. Es torpe, pero funciona.

lftp - A Better ftp


FTP no es la nica lnea de comandos del cliente FTP. De hecho, hay muchos. Uno de los
mejores (y ms populares) los est lftp por Alexander Lukyanov. Funciona al igual que el
programa de ftp tradicional, pero tiene muchas caractersticas de conveniencia adicionales,
[Me @ linuxbox ~] $ wget http://linuxcommand.org/index.php
--11: 02: 51-- http://linuxcommand.org/index.php => 'Index.php'
Resolver linuxcommand.org ... 66.35.250.210
Conexin a linuxcommand.org | 66.35.250.210 |: 80 ... conectado.
Peticin HTTP enviada, esperando respuesta ... 200 OK Longitud: sin
especificar [text / html]
[<=>

] 3120

--.-- K / s

11:02:51 (161.75 MB / s) - 'index.php' salvado [3120]


incluyendo soporte de protocolo mltiple (incluyendo HTTP), re-intentar automtica en
descargas fallidas, procesos en segundo plano, la implementacin del tabulador de nombres
de ruta, y muchos ms.

wget
Otro programa de lnea de comandos populares para la descarga de archivos es wget. Es til
para la descarga de contenido de ambas web y sitios FTP. Archivos individuales, mltiples
archivos, e incluso sitios enteros se pueden descargar. Para descargar la primera pgina de
linuxcommand.org podramos hacer esto:
Muchas opciones del programa permiten wget para descargar de forma recursiva, la descarga
de archivos en segundo plano (lo que le permite cerrar la sesin pero contina la descarga), y
completar la descarga de un archivo descargado parcialmente. Estas caractersticas estn bien
documentados en su pgina hombre medio mejor que la prevista.

Comunicacin segura con hosts remotos


Durante muchos aos, los sistemas operativos tipo Unix han tenido la capacidad de ser
administrado de forma remota a travs de una red. En los primeros das, antes de la adopcin
general de Internet, haba un par de programas populares que se utilizan para conectarse a
mquinas remotas. Estos fueron los programas rlogin y telnet. Estos programas, sin embargo,
sufren el mismo error fatal que el programa ftp hace; que transmiten todas sus
comunicaciones (incluyendo nombres de usuario y contraseas) en texto plano. Esto los hace
totalmente inadecuado para su uso en el
202

Comunicacin segura con hosts remotos


Era de Internet.

ssh
Para abordar este problema, un nuevo protocolo llamado SSH (Secure Shell) fue desarrollado.
SSH resuelve los dos problemas bsicos de la comunicacin segura con un host remoto. En
primer lugar, autentica que la mquina remota es que se dice que es (evitando as llamado
"hombre en el medio" ataques), y en segundo lugar, que encripta todas las comunicaciones
entre los anfitriones locales y remotos.
SSH consta de dos partes. Un servidor SSH se ejecuta en el host remoto, la escucha de
conexiones entrantes en el puerto 22, mientras que un cliente SSH se utiliza en el sistema local
para comunicarse con el servidor remoto.
La mayora de las distribuciones de Linux enviar una implementacin de SSH llamada
OpenSSH desde el proyecto OpenBSD. Algunas distribuciones incluyen tanto el cliente como
los paquetes de servidor por defecto (por ejemplo, Red Hat), mientras que otros (como
Ubuntu) slo suministran el cliente. Para habilitar un sistema para recibir las conexiones
remotas, debe tener el paquete penSSH-servidor S instalado, configurado y funcionando, y (si
el sistema es o bien corriendo o est detrs de un servidor de seguridad) que debe permitir las
conexiones de red entrantes en el puerto TCP 22.

Punta : Si usted no tiene un sistema remoto para conectarse a pero quieres probar
estos ejemplos, asegrese de que el paquete OpenSSH-servidor est instalado en el
[me @ linuxbox ~] $ ssh remotas-sys
La autenticidad de acogida 'remotas-sys (192.168.1.4)' no se puede
establecer.
RSA huella digital es clave
41: ed: 7a: df: 23: 19: BF: 3c: a5: 17: BC: 61: b3: 7f: D9: bb.
Seguro que quieres continuar la conexin (s / no)?
sistema y utilizar localhost como el nombre de la mquina remota. De esta forma, la
mquina crear conexiones de red con s mismo.
El programa cliente SSH utilizado para conectarse a servidores SSH remotos se llama, muy
apropiadamente, ssh. Para conectarse a un host remoto denominado remoto-sys, usaramos el
programa cliente de ssh de este modo:
La primera vez que la conexin se intenta, se muestra un mensaje que indica que la
autenticidad del host remoto no se puede establecer. Esto se debe a que el programa cliente
nunca ha visto este host remoto antes. Para aceptar las credenciales del host remoto, escriba
"s" cuando se le solicite. Una vez establecida la conexin, el usuario se le solicita su / su
contrasea:
203

16 - Redes
Advertencia: Permanentemente aadido "a distancia-sys, 192.168.1.4 '(RSA) a la lista de
hosts conocidos. me @ contrasea del remote-sys:

Despus de introducir la contrasea correctamente, recibimos el intrprete de comandos del


sistema remoto:

ltima entrada: sbado 30 de agosto 2008


13:00:48 [me @ remotas-sys ~] $
La sesin de shell remota contina hasta que el usuario introduce el comando exit en el
indicador de shell remoto, cerrando de este modo la conexin remota. En este punto, la sesin
de shell locales se reanuda y el intrprete de comandos locales reaparece.
Tambin es posible conectarse a sistemas remotos usando un nombre de usuario diferente.
Por ejemplo, si el usuario local "me" haba una cuenta llamada "bob" en un sistema remoto, el
usuario poda iniciar sesin en el bob cuenta en el sistema remoto de la siguiente manera:

[Me @ linuxbox ~] $ ssh bob @ remotas-sys


bob @ contrasea del remote-sys:
ltima entrada: sbado 30 de agosto 2008
13:03:21 [bob @ remotas-sys ~] $
Como se dijo antes, ssh verifica la autenticidad del host remoto. Si el host remoto no se
autentica correctamente, aparecer el siguiente mensaje:

[me @ linuxbox ~] $ ssh remotas-sys


@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@ @@@@@@@
@ ADVERTENCIA: IDENTIFICACIN host remoto ha cambiado!
@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@ @@@@@@@
ES POSIBLE QUE ALGUIEN EST HACIENDO ALGO DESAGRADABLE!
Alguien podra estar escuchando a escondidas en usted en este momento
(man-in-the-middle ataque)!
Tambin es posible que la clave de host RSA slo se ha cambiado.
La huella digital de la clave RSA enviado por el host remoto es 41: ed: 7a: df: 23: 19: BF:
3c: a5: 17: BC: 61: b3: 7f: D9: bb.
Por favor, pngase en contacto con el administrador del sistema.
Aadir clave de host correcta en /home/me/.ssh/known_hosts para deshacerse de este
mensaje.
Clave infractor en /home/me/.ssh/known_hosts:1
Clave de host RSA para remotos-sys ha cambiado y que ha requerido estricta
204

Comunicacin segura con hosts remotos


Este mensaje es causada por uno de dos posibles situaciones. En primer lugar, un atacante
cheques.
Organiza verificacin clave fall.
puede ser intentar un ataque "man-in-the-middle". Esto es raro, ya que todo el mundo sabe
que ssh alerta al usuario de esto. El culpable ms probable es que el sistema remoto se ha
cambiado de alguna manera; por ejemplo, su sistema operativo o el servidor SSH se ha vuelto
a instalar. En aras de la seguridad y la seguridad, sin embargo, la primera posibilidad no debe
descartarse de plano. Siempre consulte con el administrador del sistema remoto cuando se
produce este mensaje.
Despus de que se ha determinado que el mensaje es debido a una causa benigna, es seguro
para corregir el problema en el lado del cliente. Esto se hace mediante el uso de un editor de
texto (vim tal vez) para eliminar la clave obsoleta del / archivo ~ .ssh / known_hosts. En el
mensaje de ejemplo anterior, vemos esto:
Esto significa que la lnea uno del archivo known_hosts contiene la clave infractor. Eliminar
Clave infractor en /home/me/.ssh/known_hosts:1
esta lnea del archivo, y el programa ssh ser capaz de aceptar nuevas credenciales de
autenticacin del sistema remoto.
Adems de abrir una sesin de shell en un sistema remoto, ssh tambin nos permite ejecutar
un solo comando en un sistema remoto. Por ejemplo, para ejecutar el comando libre en un
host remoto denominado remoto-sys y tener los resultados que se muestran en el sistema
local:
[Me @ linuxbox ~] $ ssh libre remote-sys
me @ contrasea de twin4:
total utilizado buffers compartidos gratuitas MEM: 775536

cach

154596
507184
268352
0
110068
- Buffers / + / cache:
242520
533016
Intercambio: 1572856
0
1572856
[Me @ linuxbox ~] $
Es posible utilizar esta tcnica en formas ms interesantes, como este ejemplo en el que
llevamos a cabo un ls en el sistema remoto y redirigir la salida a un archivo en el sistema local:

205

16 - Redes
[me @ linuxbox ~] $ ssh 'ls *' Remote-sys> ListaDir.txt
me @ contrasea de twin4:
[Me @ linuxbox ~] $
Observe el uso de las comillas simples en el comando anterior. Esto se hace porque no
queremos que el nombre de ruta de expansin realizado en el equipo local; ms bien,
queremos que se lleva a cabo en el sistema remoto. Del mismo modo, si hubiramos querido la
salida redirigida a un archivo en la mquina remota, podramos haber colocado el operador
de redireccin y el nombre del archivo dentro de las comillas simples:

[Me @ linuxbox ~] $ ssh remotas-SYS 'ls *> ListaDir.txt'

Con SSH Tunneling


Parte de lo que sucede cuando se establece una conexin con un servidor remoto a
travs de SSH es que se crea un tnel encriptado entre los sistemas locales y remotos.
Normalmente, este tnel se utiliza para permitir comandos escritos en el sistema local
para ser transmitidos de forma segura al sistema remoto, y por los resultados que
deben transmitirse con seguridad de vuelta. Adems de esta funcin bsica, el
protocolo SSH permite que la mayora de los tipos de trfico de red que se enviarn a
travs del tnel encriptado, creando una especie de VPN (red privada virtual) entre
los sistemas locales y remotos.
Tal vez el uso ms comn de esta funcin es permitir el trfico del sistema de ventanas
X a ser transmitida. En un sistema que ejecuta un servidor X (es decir, una mquina
que muestra una interfaz grfica de usuario), es posible poner en marcha y ejecutar un
programa X cliente (una aplicacin grfica) en un sistema remoto y tener su pantalla
aparece en el sistema local. Es fcil de hacer; aqu est un ejemplo: Digamos que
estamos sentados en un sistema Linux llamada linuxbox que se est ejecutando un
servidor X, y queremos ejecutar el programa xload en un sistema remoto denominado
remoto-sys y ver la salida grfica del programa en nuestro sistema local. Podramos
hacer esto:
[Me @ linuxbox ~] $ ssh -X me
remotas-sys @ contrasea de
remotas-sys:
ltima entrada: Lunes 08 de septiembre
2008 13:23:11 [me @ remotas-sys ~] $ xload
Despus de la orden xload se ejecuta en el sistema remoto, aparece la ventana en el
sistema local. En algunos sistemas, es posible que tenga que utilizar la opcin "-Y" en
lugar de la opcin "-X" para hacer esto.
206

Comunicacin segura con hosts remotos

SCP y SFTP
El paquete OpenSSH tambin incluye dos programas que pueden hacer uso de un tnel SSH
encriptado para copiar archivos a travs de la red. La primera, scp (copia de seguridad) se
utiliza al igual que el programa cp familiar para copiar archivos. La diferencia ms notable es
[Me @ linuxbox ~] $ scp remotas-sys: document.txt.
me @ contrasea del remote-sys:
document.txt
100% 5581
5,5 KB / s 00:00
[Me @ linuxbox ~] $
que los nombres de ruta de origen o destino pueden estar precedidas por el nombre de un
host remoto, seguido de un carcter de dos puntos. Por ejemplo, si queremos copiar un
documento llamado doc- ument.txt de nuestro directorio personal en el sistema remoto,
Remote-sys, al directorio de trabajo actual en nuestro sistema local, podramos hacer esto:

[Me @ linuxbox ~] $ scp bob @ remotas-sys: document.txt.


Al igual que con ssh, puede solicitar un nombre de usuario para el inicio del nombre de la
[Me @ linuxbox ~] $ sftp remotas-sys Conexin a
distancia-sys ... me @ contrasea de
Remote-sys: sftp> ls
ubuntu-8.04-desktop-i386.iso sftp> lcd de
escritorio
sftp> get ubuntu-8.04-desktop-i386.iso
Obtencin /home/me/ubuntu-8.04-desktop-i386.iso a ubuntu-desktop-8.04- i386.iso
/home/me/ubuntu-8.04-desktop-i386.iso 100%
699MB 7.4MB / s 1:35
sftp> bye
mquina remota si el nombre deseado cuenta host remoto no coincide con la del sistema local:
El segundo programa de copia de archivos SSH SFTP es que, como su nombre lo indica, es un
sustituto seguro para el programa ftp. sftp funciona de manera similar al programa ftp
original que hemos utilizado anteriormente; Sin embargo, en lugar de transmitir todo en texto
claro, que utiliza un tnel SSH encriptado. sftp tiene una ventaja importante sobre ftp
convencional en que no requiere un servidor FTP que se ejecuta en el host remoto. Slo se
requiere que el servidor SSH. Esto significa que cualquier mquina remota que se puede
conectar con el cliente SSH tambin puede ser utilizado como un servidor FTP similares. He
aqu una sesin de ejemplo:

207

Un cliente SSH para Windows?


Digamos que usted est sentado en una mquina Windows, pero es necesario iniciar
sesin en el servidor de Linux y conseguir un poco de verdadero trabajo hecho; qu
haces? Obtener un programa cliente de SSH para su caja de Windows, por supuesto!
Hay un nmero de estos. El ms popular es probablemente PuTTY por Simon Tatham
y su equipo. El programa PuTTY muestra una ventana de terminal y permitir que un
usuario de Windows para abrir un SSH (o telnet) sesin en un host remoto. El
programa tambin proporciona anlogos para los programas de SCP y SFTP.
PuTTY est disponible en http://www.chiark.greenend.org.uk/~sgtatham/putty/
16 - Redes

Consej o: El protocolo SFTP con el apoyo de muchos de los administradores de


archivos grficos que se encuentran en las distribuciones de Linux. Utilizando
cualquiera de Nautilus (GNOME) o Konqueror (KDE), podemos entrar en un URI que
comienza con sftp: // en la barra de direcciones y operar en los archivos almacenados
en un sistema remoto que ejecuta un servidor SSH.

Resumiendo
En este captulo, hemos estudiado el campo de las herramientas que se encuentran en la
mayora de los sistemas Linux en red. Desde Linux es tan ampliamente utilizado en servidores
y equipos de red, hay muchos ms que se puede aadir mediante la instalacin de software
adicional. Pero incluso con el conjunto bsico de herramientas, es posible realizar muchas
tareas relacionados con la red de utilidad.

Lectura adicional

208

Para un amplio (aunque anticuado) vistazo a la administracin de redes, el Proyecto


de Documentacin de Linux proporciona el Administrador de Linux Red Gua S:
http://tldp.org/LDP/nag2/index.html

Wikipedia contiene muchos buenos artculos de redes. stos son algunos de los
conceptos bsicos:http://en.wikipedia.org/wiki/Internet direccin de protocolo
http://en.wikipedia.org/wiki/Host nombre Resource Identifier
http://en.wikipedia.org/wiki/Uniform

17 Bsqueda
archivos

de

- Bsqueda de archivos

17

Como hemos vagado alrededor de nuestro sistema Linux, una cosa ha quedado muy claro: Un
sistema tpico de Linux tiene una gran cantidad de archivos! Esto plantea la pregunta, "Cmo
encontramos cosas?" Ya sabemos que el sistema de archivos de Linux est bien organizado de
acuerdo a las convenciones que se han transmitido de generacin en generacin de los
sistemas de tipo Unix a la siguiente, pero el gran nmero de archivos puede presentar un
problema de enormes proporciones.
En este captulo, vamos a ver dos herramientas que se utilizan para buscar archivos en un
sistema. Estas herramientas son:

l o c a l i z a r - Buscar archivos por nombre

e n c o n t r a r - Bsqueda de archivos en una jerarqua de directorios

Tambin vamos a mirar a un comando que se utiliza a menudo con comandos de archivos de
bsqueda para procesar la lista resultante de archivos:

x a r g s - Elaborar y ejecutar lneas de comandos desde la entrada estndar

Adems, vamos a introducir un par de comandos para que nos ayuden en nuestras
exploraciones:

t o c a r - tiempos de modificacin del archivo

s t a t - Visualizacin de archivos o el sistema de archivo de estado

Locate - Buscar archivos La Manera Ms Fcil


El programa de localizar realiza una bsqueda de base de datos de rutas de acceso rpido, y
luego da salida a todo nombre que coincide con una subcadena dada. Digamos, por ejemplo,
queremos encontrar todos los programas con nombres que comienzan con "cremallera".
Desde que estamos buscando programas, podemos suponer que el nombre del directorio que
contiene los programas terminara con "bin /". Por lo tanto, podramos tratar de usar localizar
[Me @ linuxbox ~] localizo $ bin / zip
esta manera de encontrar nuestros archivos:
l o c a l i z a r buscar su base de datos de rutas de acceso y salida de cualquier que contiene la
cadena
209

[Me @ linuxbox ~] localizo $ zip | grep bin


/ Bin / bunzip2
/ Bin / bzip2
/ Bin / bzip2recover
/ Bin / gunzip
/ Bin / gzip
/ Usr / bin / funzip
/ Usr / bin / gpg-zip
/ Usr / bin / preunzip
/ Usr / bin / prezip
/ Usr / bin / prezip-bin
/ Usr / bin / unzip
/ Usr / bin / UnZipSFX
/ Usr / bin / zip
/ Usr / bin / zipcloak
/ Usr / bin / zipgrep
/ Usr / bin / zipinfo
/ Usr / bin / zipnote
/ Usr / bin / zipsplit
17 - Bsqueda de archivos "Bin / zip":
Si el requisito de bsqueda no es tan simple, localizar se puede combinar con otras
herramientas como grep para disear bsquedas ms interesantes:
El programa de localizar ha sido de alrededor de un nmero de aos, y hay varias versiones
diferentes de uso comn. Los dos ms comunes que se encuentran en las distribuciones
modernas de Linux son slocate y mlocate, aunque por lo general se accede por un enlace
simblico llamado de localizar. Las diferentes versiones de localizar conjuntos tienen opciones
que se superponen. Algunas versiones incluyen concordancia en expresiones regulares (que
vamos a cubrir en un prximo captulo) y el apoyo de comodn. Compruebe la pgina de
manual para localizar a determinar que se ha instalado la versin de localizar.

210

Locate - Buscar archivos La


Manera Ms Fcil

De Dnde Viene La Base de Datos localizar viene?


Usted puede notar que, en algunas distribuciones, localizar falla a trabajar justo
despus de que se instala el sistema, pero si intenta de nuevo al da siguiente, que
trabaja muy bien. Qu pasa? La base de datos localizar es creado por otro programa
llamado updatedb. Por lo general, se ejecuta peridicamente como un trabajo cron; es
decir, una tarea realizada a intervalos regulares por el demonio cron. La mayora de
los sistemas equipados con ubican el correr updatedb una vez al da. Desde la base de
datos no se actualiza continuamente, te dars cuenta de que los archivos muy
recientes no se muestran cuando se utiliza localizar. Para superar esto, es posible
ejecutar el programa updatedb manualmente al convertirse en el superusuario y
ejecutar updatedb en el indicador.

Find - Buscar archivos The Hard Way


Mientras que el programa de localizar puede encontrar un archivo basado nicamente en su
nombre, el programa busca encontrar un directorio dado (y sus subdirectorios) para los
archivos basados en una variedad de atributos. Vamos a pasar mucho tiempo con hallazgo, ya
que tiene un montn de caractersticas interesantes que veremos una y otra vez cuando
empezamos a cubrir los conceptos de programacin en los captulos posteriores.
En su uso ms simple, encontramos es dado uno o ms nombres de directorios para buscar.
Por ejemplo, para producir una lista de nuestro directorio home:

[Me @ linuxbox ~] encontrar $


~
En la mayora de las cuentas de usuario activas, esto producir una lista grande. Dado que la
lista se enva a la salida estndar, que puede canalizar la lista en otros programas. Usemos wc
para contar el nmero de archivos:

[Me @ linuxbox ~] encontrar $ ~ | wc -l


47068
Wow, que hemos estado muy ocupados! La belleza de hallazgo es que puede ser utilizado
para identificar archivos que cumplen con criterios especficos. Lo hace a travs de la (un poco
extrao) la aplicacin de opciones, pruebas y acciones. Pronto nos ocuparemos de las pruebas
en primer lugar.

211

17

- Bsqueda de archivos

Pruebas
Digamos que queremos una lista de directorios de nuestra bsqueda. Para hacer esto,
podramos aadir la siguiente prueba:
[Me @ linuxbox
~] Encontrar $ ~ -type d | wc -l
1695
La adicin de la prueba - tipo d limita la bsqueda a los directorios. Por el contrario,
podramos haber limitado la bsqueda a los archivos regulares con esta prueba:
[Me @ linuxbox
~] Encontrar $ ~ -type f | wc -l
38737

Aqu estn los ensayos de tipo de archivo comunes soportados por hallazgo:
Tabla 17-1: encontrar Tipos de archivo
Expediente
Tipo

Descripcin

Archivo de dispositivo especial de bloques

Carcter archivo de dispositivo especial

d
F

Directorio
Archivo regular

Enlace simblico

[Me @ linuxbox ~] encontrar $ ~ -type f -name "* .JPG" -size + 1M | wc -l


840
Podemos tambin buscar por tamao de archivo y nombre de archivo mediante la adicin de
algunas pruebas adicionales: Echemos un vistazo a todos los archivos regulares que coinciden
con el patrn de comodn "* .JPG" y son ms grandes que un megabyte:
En este ejemplo, se aade la - prueba de nombre seguido por el patrn de comodines. Ntese
cmo encerrarlo entre comillas para evitar la expansin ruta por el shell. A continuacin,
aadimos la prueba -size seguido por la cadena "+ 1M". El signo ms indica que estamos
buscando para archivos ms grandes que el nmero especificado. Un signo menos cambiara
el significado de
212

Find - Buscar archivos The Hard Way


la cadena a ser menor que el nmero especificado. El uso de ningn signo significa, "coincide
con el valor exactamente." La carta de salida "M" indica que la unidad de medida es
megabytes. Los siguientes caracteres se pueden usar para especificar las unidades:
Tabla 17-2: encontrar unidades Tamao
Personaje
b

Unidad
Bloques de 512 bytes. Este es el valor por defecto si no se especifica
ninguna unidad.

Bytes

Palabras de 2 bytes

Kilobytes (unidades de 1024 bytes)

M
G

Megabytes (unidades de 1048576 bytes)


Gigabytes (unidades de 1,073,741,824 bytes)

e n c o n t r a r soporta un gran nmero de diferentes pruebas. A continuacin se muestra un


resumen de los ms comunes. Tenga en cuenta que en los casos donde se requiere un
argumento numrico, el mismo "+" y "-" notacin comentado anteriormente se puede aplicar:
Tabla 17-3: encontrar pruebas
Prueba
-cmin n

archivo -cnewer
-ctime n

-empty
-Grupo nombre

-iname patrn
-inum n

213

Descripcin
Archivos de partido o directorios cuyo contenido o atributos
fueron modificada por ltima vez hace exactamente n minutos.
Para especificar hace menos de n minutos, utilizar y -n para
especificar hace ms de n minutos, uso + n.
Coinciden con los archivos o directorios cuyo contenido o
atributos eran modificada por ltima vez ms recientemente
que los de archivo.
Archivos de partido o directorios cuyo contenido o atributos
eran modificada por ltima vez n * hace 24 horas.
Coinciden con los archivos y directorios vacos.
Partido archivo o directorios pertenecientes al grupo. grupo puede
ser expresada ya sea como un nombre de grupo o como un ID de
grupo numrico.
Al igual que el - prueba de nombre pero maysculas y
minsculas.
Coinciden con los archivos con el nmero de inodo n. Esto es
til para encontrar todos los enlaces duros a un inodo
particular.

17 - Bsqueda de archivos
-mmin n
-mtime n
-name patrn
archivo -newer

-nouser

-nogroup
modo -perm

nombre -samefile

Archivos de partido o directorios cuyos contenidos fueron


modificados por ltima vez hace n minutos.
Archivos de partido o directorios cuyo contenido era
modificada por ltima vez n * hace 24 horas.
Coinciden con los archivos y directorios con el patrn de
comodines especificados.
Coinciden con los archivos y directorios cuyo contenido fue
modificado ms recientemente que el archivo especificado. Esto es
muy til cuando se escriben scripts de shell que realizan copias de
seguridad de archivos. Cada vez que realice una copia de
seguridad, actualizar un archivo (por ejemplo, un registro), y luego
utilizar la funcin Buscar para determinar qu archivos han
cambiado desde la ltima actualizacin.
Partido archivo y directorios que no pertenecen a un usuario
vlido. Esto puede ser usado para encontrar los archivos que
pertenecen a cuentas eliminadas o para detectar la actividad de los
atacantes.
Coinciden con los archivos y directorios que no pertenecen a un
grupo vlido.
Coinciden con los archivos o directorios que tienen permisos
establecidos para el modo especificado. modo puede ser
expresado por cualquiera de octal o notacin simblica.
Similar a la prueba -inum. Coincide con los archivos que
comparten el mismo nmero de inodo como nombre de archivo.

-size n

Coincidir con archivos de tamao n.

de tipo c
nombre -user

Coincidir con archivos de tipo c.


Archivos de partido o directorios pertenecientes al nombre de
usuario. El usuario puede ser expresado por un nombre de
usuario o un ID de usuario numrico.

Esta no es una lista completa. La pgina de manual hallazgo tiene todos los detalles.

Operadores
Incluso con todas las pruebas que se encuentran proporciona, todava es posible que
necesitemos una mejor manera de describir las relaciones lgicas entre las pruebas. Por
ejemplo, qu pasa si lo que necesitbamos para determinar si todos los archivos y
subdirectorios de un directorio tenan permisos seguras? Nos buscar todos los archivos con
permisos que no son 0600 y los directorios con permisos que no son 0700. Afortunadamente,
encontrar proporciona una manera de combinar las pruebas utilizando los operadores lgicos
214

____________________________________________________ Find - Buscar archivos The Hard

[Me @ linuxbox ~] encontrar $ ~ \ (-type f -no -perm 0600 \) -o \ (-type d -no -perm 0700 \)
Way
para crear relaciones lgicas ms complejas. Para expresar la prueba mencionada, podramos
hacer esto:
Caramba! Eso seguro que se ve extrao. Qu es todo esto? En realidad, los operadores no son
tan complicado una vez que llegue a conocerlos. Aqu est la lista:
Tabla 17-4: encontrar operadores lgicos
Operador
-y

-o
-no
()

Descripcin
Coincide si las pruebas en ambos lados del operador son
verdaderas. Puede ser acortado a - a. Tenga en cuenta que
cuando ningn operador est presente, -y se implic de forma
predeterminada.
Partido si una prueba a cada lado del operador es verdadero.
Puede ser acortado a -o.
Coincide si la prueba siguiente el operador es falso. Se puede
abreviar con un signo de exclamacin (!).
Grupos pruebas y operadores juntos para formar expresiones
ms grandes. Esto se utiliza para controlar la precedencia de las
evaluaciones lgicas. Por defecto, encontrar evala de izquierda
a derecha. A menudo es necesario para anular el orden de
evaluacin predeterminado para obtener el resultado deseado.
Incluso si no es necesario, a veces es til incluir los caracteres de
agrupamiento para mejorar la legibilidad de la orden. Tenga en
cuenta que dado que los personajes parntesis tienen un
significado especial para el shell, deben ser citados cuando se
utiliza en la lnea de comandos para que puedan ser pasados
como argumentos a encontrar. Por lo general, el carcter de
barra invertida se utiliza para escapar de ellos.

Con esta lista de operadores en la mano, vamos a deconstruir nuestro comando find. Cuando
se ve desde el nivel superior, vemos que nuestras pruebas estn dispuestos como dos grupos
separados por un operador -o:
(expresin 1) -o (expresin 2)
Esto tiene sentido, ya que estamos en busca de archivos con un determinado conjunto de
permisos y de directorios con un conjunto diferente. Si estamos buscando a los archivos y
directorios, por qu hacer

215

17 - Bsqueda de archivos usamos -o en lugar de -y? Porque como encontrar las


exploraciones a travs de los archivos y directorios, cada uno es evaluado para ver si coincide
con las pruebas especificadas. Queremos saber si se trata de un archivo con permisos de malas
o un directorio con permisos malas. No puede ser ambas cosas al mismo tiempo. As que si
ampliamos las expresiones agrupadas, podemos ver de esta manera:
(Archivo con malas permanentes) -o (directorio con malas permanentes)
Nuestro prximo desafo es cmo poner a prueba para "malos permisos." Cmo hacemos
eso? En realidad no lo hacemos. Lo que vamos a probar es "no buenos permisos," ya que
sabemos lo que significa "buenas permisos" son. En el caso de los archivos, se define bueno
como 0600 y para los directorios, como 0700. La expresin que pondr a prueba los archivos
para los "no buenos" permisos es:
-type f -y -no -perms 0600
y para los directorios:
-type d -y -no -perms 0700
Como se indica en la tabla de los operadores anteriores, el operador -y se puede eliminar de
forma segura, ya que se da a entender de forma predeterminada. As que si ponemos todo esto
de nuevo juntos, conseguimos nuestra orden final:
encontrar ~ (-type f -no -perms 0600) -o (de tipo d -no -perms 0700 )
Sin embargo, dado que los parntesis tienen un significado especial para el shell, tenemos que
escapar de ellos para evitar que el shell de tratar de interpretarlos. Precediendo a cada uno con
un carcter de barra invertida hace el truco.
Hay otra caracterstica de los operadores lgicos que es importante entender. Digamos que
tenemos dos expresiones separadas por un operador lgico:
exprl -operator expr2
En todos los casos, siempre se realizar exprl; Sin embargo, el operador determinar si se
realiza expr2. He aqu cmo funciona:
Tabla 17-5: encontrar lgica Y / O
Resultados de exprl

Operador

expr2 es ...

Verdadero
Falso

-y
-y

Siempre realizado
Nunca realizado

Verdadero

-o

Nunca realizado

Falso

-o

Siempre realizado

Por qu sucede esto? Se hace para mejorar el rendimiento. Tome -y, por ejemplo. Sabemos
que la expresin exprl -y expr2 no puede ser verdad si el resultado de exprl es
216

Find - Buscar archivos The Hard Way


falsa, por lo que no hay ningn punto en la realizacin de expr2. Del mismo modo, si tenemos
la expresin expri -o expr2 y el resultado de expri es cierto, no hay ningn punto en expr2
realizar, como ya sabemos que la expresin -o expri expr2 es cierto.
Aceptar, por lo que ayuda a que vaya ms rpido. Por qu es esto importante? Es importante
porque podemos confiar en este comportamiento para controlar cmo se llevan a cabo
acciones, como pronto veremos.

Acciones predefinidas
Vamos a trabajar un poco! Tener una lista de los resultados de nuestro comando find es til,
pero lo que realmente queremos hacer es actuar sobre los elementos de la lista.
Afortunadamente, hallazgo permite acciones a realizar sobre la base de los resultados de
bsqueda. Hay una serie de acciones predefinidas y varias formas de aplicar las acciones
definidas por el usuario. Primero echemos un vistazo a algunas de las acciones predefinidas:
Tabla 17-6: find acciones predefinidas
Accin

Descripcin

-delete
-ls

Elimine el archivo actualmente a juego.

-print

-QUIT

Lleve a cabo el equivalente de ls -dils en el archivo


correspondiente. La salida se enva a la salida estndar.
Salida de la ruta de acceso completa del archivo
correspondiente a la salida estndar. Esta es la accin por
defecto si no se especifica ninguna otra accin.
Salga de una vez un partido se ha hecho.

Al igual que con las pruebas, hay muchas ms acciones. Vea la pgina man hallazgo para los

encon
trar ~
detalles completos. En nuestro primer ejemplo, hemos hecho esto:

que produjo una lista de todos los archivos y subdirectorios contenidos dentro de nuestro

encontrar ~
-print
directorio personal. Produjo una lista porque la accin -print est implcito si no se especifica
ninguna otra accin. Por lo tanto nuestro comando tambin podra expresarse como:
Podemos utilizar find para eliminar los archivos que cumplen con ciertos criterios. Por
ejemplo, para eliminar los archivos que
217

encontrar ~ -type f - name '* .BAK'


-delete
17 - Bsqueda de archivos tener la extensin ".bak" (que a menudo se utiliza para designar los
archivos de copia de seguridad), podramos utilizar este comando:
En este ejemplo, todos los archivos en el directorio home del usuario (y sus subdirectorios) se
busca ficheros que terminen en .BAK. Cuando se encontraron, se eliminan.

Advertencia: No hace falta decir que usted debe tener mucho cuidado al usar la
accin -delete. Siempre pruebe el comando por primera vez por la sustitucin de la
accin para -print - Eliminar para confirmar los resultados de la bsqueda.
encontrar ~ -type f - name '* .BAK'
-print
Antes de continuar, vamos a echar otro vistazo a cmo los operadores lgicos afectan a las
acciones. Considere el siguiente comando:
Como hemos visto, este comando buscar todos los archivos regulares (-type f) cuyo nombre
termina con .BAK (-name '* .BAK') y te mostrar el nombre de ruta relativa de cada archivo
correspondiente a la salida estndar (-print) . Sin embargo, la razn el comando realiza la
manera que lo hace est determinado por las relaciones lgicas entre cada una de las pruebas
y acciones. Recuerde, no es, por defecto, una relacin -y implcita entre cada prueba y la
accin. Tambin podramos expresar el comando de esta forma de hacer las relaciones lgicas
ms fciles de ver:

encontrar ~
-type f -

y -name '* .BAK' -y - print

Con nuestro comando plenamente expresada, echemos un vistazo a cmo los operadores
lgicos afectan su ejecucin:
Prueba / Accin
-print

Se realiza solamente si ...


- t y p e f - n a m e y ' * . B A K ' son verdaderas

-name '* .BAK'

- t i p o f es cierto

-type f

218

Siempre se lleva a cabo, ya que es la primera prueba / accin en


una relacin -y.

Find - Buscar archivos The Hard


Way
Dado que la relacin lgica entre las pruebas y las acciones determina cul de ellos se lleva a
cabo, podemos ver que el orden de las pruebas y las acciones es importante. Por ejemplo, si
tuviramos que volver a ordenar las pruebas y acciones para que la accin -print fue el
primero, el comando sera comportarse de manera muy diferente:

encontrar ~ -print -y -type f -name -y '* .BAK'


Esta versin del comando imprimir cada fichero (la - accin de impresin siempre se evala
como verdadera) y luego la prueba de tipo de archivo y la extensin de archivo especificada.

Acciones definidas por el usuario


Adems de las acciones predefinidas, tambin podemos invocar comandos arbitrarios. La
forma tradicional de hacerlo es con la accin -exec. Esta accin funciona as:
-exec comando {};
donde comando es el nombre de un comando, {} es una representacin simblica de la ruta
actual y el punto y coma es un delimitador necesario que indica el final del comando. He aqu
un ejemplo del uso de - ejecutivo a actuar como la accin -delete discutido anteriormente:

rm -exec '{}' ';'


Una vez ms, ya que los caracteres de llave y punto y coma tienen un significado especial para
el shell, que podr ser citado ni escapado.
Tambin es posible ejecutar una accin definida por el usuario de forma interactiva. Mediante
el uso de la accin en lugar de -Ok - exec, se solicita al usuario antes de la ejecucin de cada
comando especificado:

encontrar ~ -type f - name "foo * ' -Ok ls -l' {} ''; '


< ls ... / home / me / bin / foo>? y
-rwxr-xr-x me me 1 224 2007-10-29 18:44 / home / me / bin / foo
< ls ... /home/me/foo.txt>? y
-rw-r - r-- m me 1 0 2008-09-19 12:53 /home/me/foo.txt
En este ejemplo, que la bsqueda de archivos con nombres que comienzan con la cadena "foo"
y ejecutar el comando ls -l cada vez que uno se encuentra. El uso de la accin -Ok pide al
usuario antes de ejecutar el comando ls.

219

17 - Bsqueda de archivos

Mejora de la Eficiencia
Cuando se utiliza la accin -exec, se pone en marcha una nueva instancia del comando
especificado cada vez que un archivo coincidente se encuentra. Hay momentos en los que
podramos preferir combinar todos los resultados de bsqueda y lanzar una sola instancia de
comando. Por ejemplo, en lugar de ejecutar los comandos como este:
ls -l archivol
ls -l archivo2
podemos preferir ejecutarlos de esta manera:
ls -l archivol archivo2
haciendo as que el comando se ejecute slo una vez en lugar de varias veces. Hay dos
maneras en que podemos hacer esto. La forma tradicional, utilizando los comando xargs
externos y la forma alternativa, el uso de una nueva caracterstica de encontrarse. Vamos a
hablar de la forma alternativa de primera.

encontrar ~ -type f - name "foo * 'ls -l -exec' {} ''; '


- r w x r - x r - x m e 1 me 224 29/10/2007 18:44 / home / me / bin / foo
- r w - r - r - - m e 1 me 0 2008-09-19 12:53 /home/me/foo.txt
Al cambiar el carcter punto y coma final a un signo ms, activamos la capacidad de
descubrimiento de combinar los resultados de la bsqueda en una lista de argumentos para
encontrar ~ -type f - name "foo * 'ls -l -exec' {} '+
- r w x r - x r - x m e 1 me 224 29/10/2007 18:44 / home / me / bin / foo
- r w - r - r - - m e 1 me 0 2008-09-19 12:53 /home/me/foo.txt
una sola ejecucin del comando deseado. Volviendo a nuestro ejemplo, esto:
ejecutar ls cada vez que un archivo coincidente se encuentra. Al cambiar la orden de:
Podemos obtener los mismos resultados, pero el sistema slo tiene que ejecutar el comando ls
vez.

xargs
El comando xargs realiza una funcin interesante. Se acepta la entrada de la entrada estndar
y lo convierte en una lista de argumentos de un comando especificado. Con nuestro ejemplo,
podramos utilizar de esta manera: 220

Lidiando con divertidos nombres de archivo


Sistemas de tipo Unix permiten espacios incrustados (e incluso saltos de lnea!) En los
nombres de archivo. Esto causa problemas para los programas como xargs que
construyen listas de argumentos para otros programas. Un espacio incrustado ser
tratado como un delimitador, y el comando resultante interpretar cada palabra
separada por espacios como un argumento separado. Para superar esto, encontrar y
xarg permiten el uso opcional de un carcter nulo como argumento separador. Un
carcter nulo se define en ASCII como el personaje representado por el nmero cero (a
diferencia de, por ejemplo, el carcter de espacio, que se define en ASCII como el
personaje representado por el nmero 32). El comando find proporciona la accin
-print0, lo que produce una salida nula separados, y el comando xargs tiene la opcin
- -null, que acepte la entrada nula separada. He aqu un ejemplo:
encontrar ~ -iname '* .jpg' -print0 | xargs ls -l --null Usando esta
tcnica, podemos asegurar que todos los archivos, incluso los que
encontrar ~ -type f - name "foo * ' -Impresin | xargs ls -l
contienen espacios incrustados en sus nombres, se manejan
- r w x r - x r - x m e 1 me 224 29/10/2007 18:44 / home / me / bin / foo
c o- rr r-e cr t- a- m
-rw
meen t1e . me 0 2008-09-19 12:53 / home / me /foo.txt
Find - Buscar archivos The Hard Way
Aqu vemos la salida del comando find hilo en xargs que, a su vez, construye una lista de
argumentos para el comando ls y luego lo ejecuta.

Nota: Mientras que el nmero de argumentos que se pueden colocar en una lnea de
comandos es bastante grande, no es ilimitada. Es posible crear comandos que son
demasiado largos para el shell para aceptar. Cuando una lnea de comandos supera la
longitud mxima soportada por el sistema, xargs ejecuta el comando especificado con
el nmero mximo de argumentos posibles y luego repite este proceso hasta que se
agote la entrada estndar. Para ver el tamao mximo de la lnea de comandos, ejecute
xargs con la opcin --show-lmites.

Un retorno a la Zona de juegos


Es hora de poner un poco de encontrar a (casi) el uso prctico. Vamos a crear una zona de
juegos y probar algo de lo que hemos aprendido.
En primer lugar, vamos a crear un parque infantil con una gran cantidad de subdirectorios y
archivos: 221

17 - Bsqueda de
archivos
[Me @ linuxbox ~] $ mkdir -p patio de recreo / dir- {001..100} [me @ linuxbox ~]
$ touch patio de recreo / dir- {001..100} / {Archivo- A..Z}
Marvel en el poder de la lnea de comandos! Con estas dos lneas, hemos creado un directorio
de parque infantil con 100 subdirectorios que contienen cada una 26 archivos vacos. Trate de
que con la interfaz grfica de usuario!
El mtodo que empleamos para lograr esta magia involucrado un comando familiarizado
(mkdir), una expansin extica concha (tirantes) y un nuevo comando, toque. Al combinar
mkdir con la opcin -p (que causa mkdir para crear los directorios principales de las rutas
especificadas) con la expansin de llaves, hemos sido capaces de crear 100 subdirectorios.
El comando touch se suele utilizar para establecer o actualizar el acceso, cambiar y modificar
los tiempos de los archivos. Sin embargo, si un argumento de nombre de archivo es el de un
archivo que no existe, se crea un archivo vaco.
En nuestro patio de recreo, hemos creado 100 casos de un archivo llamado archivo-A. Vamos
a ver ellos:

[Me @ linuxbox ~] $ encuentro -type f -name parque infantil 'archivo-A'


Tenga en cuenta que a diferencia de ls, encontrar no produce resultados en forma ordenada.
Su orden est determinada por el diseo del dispositivo de almacenamiento. Podemos
confirmar que en realidad tenemos 100 instancias del archivo de esta manera:

[Me @ linuxbox ~] $ find -type f -name parque infantil 'archivo-A' | wc -l


100
A continuacin, echemos un vistazo a la bsqueda de archivos en base a sus tiempos de
modificacin. Esto ser til para crear copias de seguridad o la organizacin de los archivos
en orden cronolgico. Para ello, vamos a crear primero un archivo de referencia contra el cual
compararemos hora de modificacin:
[Me @ linuxbox ~] $ patio toque / marca de tiempo
Esto crea un archivo con el nombre de marca de hora vaca y fija su hora de modificacin a la
hora actual. Podemos comprobar esto mediante el uso de otro comando til, stat, que es una
especie de versin mejorada de ls. El comando stat revela todo lo que el sistema entiende
acerca de un archivo y sus atributos:

222

Find - Buscar archivos The Hard


Way
[Me @ linuxbox ~] $ stat patio de recreo / marca de tiempo
Archivo: 'patio de recreo / marca de tiempo'
Tamao: 0
Bloques: 0
IO Bloque: 4096 archivo vaco ordinario
Dispositivo: 803h / 2051d Inode: 14265061 Links: 1
Acceso: (0644 / -rw-r - r--) Uid: (1001 / Me) Gid: (1001 / Me) Acceso: 2008-10-08
15: 15: 39.000000000 -0400 Modificar: 2008-10-08 15: 15: 39.000000000 -0400
Cambio: 2008-10-08 15: 15: 39.000000000 -0400

Si tocamos de nuevo el archivo y, a continuacin examinamos con estadsticas, veremos que


los tiempos del archivo se han actualizado .:

[Me @ linuxbox ~] $ touch patio de recreo / timestamp


[me @ linuxbox ~] $ stat patio de recreo / marca de
tiempo
Archivo: 'patio de recreo / marca de tiempo'
Tamao: 0
Bloques: 0
IO Bloque: 4096 archivo vaco ordinario
Dispositivo: 803h / 2051d Inode: 14265061 Links: 1
Acceso: (0644 / -rw-r - r--) Uid: (1001 / Me) Gid: (1001 / Me) Acceso: 2008-10-08
15: 23: 33.000000000 -0400 Modificar: 2008-10-08 15: 23: 33.000000000 -0400
Cambio: 2008-10-08 15: 23: 33.000000000 -0400
A continuacin, vamos a utilizar la funcin Buscar para
actualizar algunos de nuestros archivos parque infantil:
[Me @ linuxbox ~] $ find -type f -name parque infantil 'archivo-B' toque -exec '{}' ';'

Esto actualiza todos los archivos en el patio de recreo llamado archivo-B. A continuacin
vamos a utilizar la funcin Buscar para identificar los archivos actualizados mediante la
comparacin de todos los archivos a la marca de tiempo de archivos de referencia:
[Me @ linuxbox ~] $ encuentro parque -type f -newer patio de recreo / marca de tiempo
Los resultados contienen todas las 100 instancias del archivo-B. Desde realizamos un toque en
todos los archivos en el patio de recreo nombramos archivo-B despus actualizamos marca de
tiempo, que ahora son "ms nuevo" de marca de tiempo y por lo tanto se pueden identificar
con la - prueba ms reciente.
Por ltimo, vamos a ir de nuevo a la prueba permisos mal que realizamos anteriormente y
aplicarlo a patio de recreo:

22
3

[Me @ linuxbox ~] $ encuentro parque \ (-type f -no -perm 0600 \) -o \ (-type d -no -perm
0700 \)
17 - Bsqueda de archivos
Este comando enumera todos los directorios 100 y 2.600 archivos en patio (as como la
indicacin de la hora y la zona de juegos en s, para un total de 2.702), ya que ninguno de ellos
[Me @ linuxbox ~] $ encuentro parque \ (-type f -no -perm 0600 chmod -exec 0600 '{}'
';' \) -o \ (-type d -no -perm 0700 chmod -exec 0700 '{ } ''; '\)
cumple con nuestra definicin de "buenas permisos." Con nuestro conocimiento de los
operadores y las acciones, podemos aadir acciones a este comando para aplicar los nuevos
permisos a los archivos y directorios en nuestro patio de recreo:
Sobre una base del da a da, podemos encontrar que es ms fcil emitir dos comandos, uno
para los directorios y otra para los archivos, en lugar de este comando un gran complejo, pero
es bueno saber que podemos hacerlo de esta manera. El punto importante aqu es entender
cmo los operadores y las acciones pueden ser utilizados en conjunto para realizar tareas
tiles.

Opciones
Por ltimo, tenemos las opciones. Las opciones se utilizan para controlar el alcance de una
bsqueda hallazgo. Pueden ser incluidos con otras pruebas y acciones cuando la construccin
de expresiones de bsqueda. Aqu est una lista de los ms comnmente utilizados:
Tabla 17-7: encontrar opciones
Opcin
-depth

- m a x d e p t h niveles

- m i n d e p t h niveles

-mount

224

Descripcin
Hallazgo directa para procesar los archivos de un directorio
antes de que el propio directorio. Esta opcin se aplica
automticamente cuando se especifica la accin -delete.
Establecer el nmero mximo de niveles que se encuentran
descender en un rbol de directorios al realizar pruebas y
acciones.
Establecer el nmero mnimo de los niveles que se encuentran
descender en un rbol de directorios antes de la aplicacin
de pruebas y acciones.
Directo Buscar Si no es para atravesar los directorios que se
montan en otros sistemas de archivos.

Find - Buscar archivos The Hard Way


-noleaf
el

Directo e n c o n t r a r no para optimizar su bsqueda basada en


supuesto de que se est buscando un sistema de
archivos tipo Unix. Esto es necesario para escanear los
sistemas de archivos de DOS / Windows y los
CD-ROM.

Resumiendo
Es fcil ver que localizar es tan simple como hallazgo es complicado. Ambos tienen sus usos.
Tmese el tiempo para explorar las muchas caractersticas del hallazgo. Se puede, con el uso
regular, mejorar su comprensin de las operaciones del sistema de archivos de Linux.

Lectura adicional
El updatedb localizar,, encontrar, y los programas de xargs son todos parte del paquete
findutils del Proyecto GNU. El proyecto GNU ofrece un sitio web con una amplia
documentacin en lnea, lo cual es bastante bueno y se debe leer si usted est usando
estos programas en entornos de alta seguridad:
http://www.gnu.org/software/findutils/

18 - Archivado y copia de seguridad

225

18 - Archivado y copia de seguridad


Una de las tareas principales del administrador de un sistema informtico es mantener los
datos del sistema de seguridad. Una forma de hacer esto es mediante la realizacin de copias
de seguridad oportunas de los archivos del sistema. Incluso si no eres un administrador de
sistemas, a menudo es til para hacer copias de las cosas y para mover grandes colecciones de
archivos de un lugar a otro y de un dispositivo a otro.
En este captulo, vamos a ver varios programas comunes que se utilizan para gestionar
colecciones de archivos. Hay los programas de compresin de archivos:

g z i p - Comprimir archivos o ampliar

b z i p 2 - Un bloque de clasificacin

compresor de archivos Los programas de archivo:

utilidad de archivo de cinta - tar

zip - Paquete y comprimir archivos

y el programa de sincronizacin de
archivos:

r s y n c - Archivo remoto y la sincronizacin de directorios

Compresin de Archivos
A lo largo de la historia de la informtica, ha habido una lucha para conseguir la mayor
cantidad de datos en el menor espacio disponible, ya que el espacio sea de memoria,
dispositivos de almacenamiento, o el ancho de banda de red. Muchos de los servicios de datos
que damos por sentado hoy en da, tales como reproductores porttiles de msica, la
televisin de alta definicin, o Internet de banda ancha, deben su existencia a las tcnicas
eficaces de compresin de datos.
La compresin de datos es el proceso de eliminacin de la redundancia de los datos. Vamos a
considerar un ejemplo imaginario. Digamos que tenamos un archivo de imagen
completamente negro con las dimensiones de 100 pxeles por 100 pxeles. En trminos de
almacenamiento de datos (suponiendo 24 bits, o 3 bytes por pxel), la imagen ocupar 30.000
bytes de almacenamiento:
100 * 100 * 3 = 30.000
Una imagen que es de un solo color contiene datos totalmente redundantes. Si furamos

inteligentes, podramos codificar los datos de tal manera que simplemente describe el hecho
de que tenemos un bloque
226

Compresin de Archivos
de 10.000 pxeles negros. As, en lugar de almacenar un bloque de datos que contienen ceros
30000 (negro se representa normalmente en archivos de imagen como cero), se podra
comprimir los datos en el nmero 10000, seguido por un cero para representar nuestros datos.
Tal esquema de compresin de datos se denomina codificacin de longitud de ejecucin y es
una de las tcnicas de compresin de ms rudimentarias. Tcnicas de hoy en da son mucho
ms avanzado y complejo, pero el objetivo bsico sigue siendo el mismo: conseguir deshacerse
de los datos redundantes.
Los algoritmos de compresin (Las tcnicas matemticas utilizadas para llevar a cabo la
compresin) se dividen en dos categoras generales, sin prdidas y con prdidas. La
compresin sin prdidas conserva todos los datos contenidos en el original. Esto significa que
cuando un archivo se restaura desde una versin comprimida, el archivo restaurado es
exactamente la misma que la versin original, sin comprimir. La compresin con prdida, por
otro lado, elimina los datos como se lleva a cabo la compresin, para permitir que ms de
compresin que debe aplicarse. Cuando se restaura un archivo con prdidas, que no coincide
con la versin original; ms bien, es una aproximacin cercana. Ejemplos de compresin con
prdida son JPEG (para imgenes) y MP3 (msica). En nuestra discusin, vamos a tener
[Me @ linuxbox ~] $ ls -l / etc> foo.txt [me @ linuxbox ~] $ ls -l foo. *
-rw-r -. r-- 1 me me 15738 2008 -10-14 07:15 foo.txt [me @
linuxbox ~] foo.txt $ gzip [me @ linuxbox ~] $ ls -l foo *
-rw-r -. r-- 1 me me 3230 2008-10-14 07:15 foo.txt.gz [me
@ linuxbox ~] $ gunzip foo.txt [me @ li nuxbox ~] $ ls -l foo
*
-rw-r - r-- m me 1 15738 2008 -10-14 07:15 foo.txt
exclusivamente en cuenta la compresin sin prdidas, ya que la mayora de los datos en las
computadoras no pueden tolerar ninguna prdida de datos.

gzip
El programa gzip se utiliza para comprimir uno o ms archivos. Cuando se ejecuta, sustituye
el archivo original con una versin comprimida del original. El programa gunzip
correspondiente se utiliza para restaurar los archivos comprimidos a su forma original, sin
comprimir. He aqu un ejemplo:
En este ejemplo, creamos un archivo de texto llamado foo.txt de una lista de directorios. A
continuacin, se corre gzip, que sustituye el archivo original con una versin llamada
foo.txt.gz. comprimido En la lista de directorios de foo. *, Vemos que el archivo original se ha
sustituido por la versin comprimida, y que la versin comprimida es de aproximadamente
una quinta parte del tamao del original. Tambin podemos ver que el archivo comprimido
tiene los mismos permisos y marca de tiempo que el original.
A continuacin, ejecutamos el programa gunzip para descomprimir el archivo. Despus,
podemos ver que la versin comprimida del archivo se ha sustituido por el original, de nuevo
con el permiso
227

18 - Archivado y copia de seguridad ___


siones y marca de tiempo conservan. gzip
tiene muchas opciones. Aqu estn
algunos:
Tabla 18-1: Opciones gzip
Opcin
-c
-d
-f
-h
-l
-r

-t
-v
-nmero

Descripcin
Escribe la salida a la salida estndar y mantener los archivos originales.
Tambin puede ser especificado con --stdout y --to-stdout.
Descomprimir. Esto hace que gzip para actuar como gunzip. Tambin
puede ser especificado con - -decompress o - -uncompress.
Fuerza de compresin, incluso si ya existe una versin comprimida del
archivo original. Tambin puede ser especificado con - -force.
Muestra informacin de uso. Tambin puede ser especificado con - -help.
Las estadsticas de compresin de lista para cada archivo comprimido.
Tambin puede ser especificado con --list.
Si uno o ms argumentos en la lnea de comandos son los directorios, de
forma recursiva comprimir archivos contenidos dentro de ellos. Tambin
puede ser especificado con - -Recursive.
Pon a prueba la integridad de un archivo comprimido. Tambin puede ser
especificado con --test.
Mostrar mensajes detallados, mientras que la compresin. Tambin puede
ser especificado con - -verbose.
Cantidad de compresin Set. nmero es un nmero entero en el intervalo
de 1 (la ms rpida, menos compresin) a 9 (la ms lenta, la mayor parte de
compresin). Los valores 1 y 9 tambin pueden expresarse como --fast y -mejor, respectivamente. El valor por defecto es 6.

Volviendo a nuestro ejemplo anterior:

[Me @ linuxbox ~] $ Gzip foo.txt


[Me @ linuxbox ~] $ Gzip tv foo.txt.gz
foo.txt.gz:
Okay
[Me @ linuxbox ~] $ Gzip -d foo.txt.gz
Aqu, hemos sustituido la foo.txt archivo con una versin llamada foo.txt.gz. comprimido A
continuacin, probamos la integridad de la versin comprimida, utilizando las opciones -t y
-v. Fi228

Compresin de
Archivos
finalmente, hemos descomprimido el archivo de nuevo a su forma original.
gzip tambin se puede utilizar de manera interesante a
travs de la entrada y salida estndar:
[Me @ linuxbox ~] $ ls -l / etc | gzip> foo.txt.gz
Este comando crea una versin comprimida de un anuncio en el directorio.
El programa gunzip, que descomprime archivos gzip, asume que los nombres de archivo
terminen en la extensin .gz, as que no es necesario especificar que, siempre y cuando el
nombre especificado no est en conflicto con un archivo comprimido existente:

[Me @ linuxbox ~] $ gunzip foo.txt


Si nuestro objetivo fuera slo para ver el contenido de un archivo de texto comprimido,
podramos hacer esto:
[Me @ linuxbox ~] $ gunzip -c foo.txt | menos
Alternativamente, hay un programa suministrado con gzip, llamado zcat, que es equivalente a
gunzip con la opcin -c. Puede ser utilizado como el comando cat sobre archivos gzip
comprimido:

[Me @ linuxbox ~] $ zcat foo.txt.gz | menos

Sugerencia: Hay u n programa zless, tambin. Se realiza l a misma


funcin que la tubera anteriormente.

bzip2
El programa bzip2, por Julian Seward, es similar a gzip, pero utiliza un algoritmo de
compresin diferente que logra niveles ms altos de compresin a costa de la velocidad de
compresin. En la mayora de lo que se refiere, funciona de la misma manera como gzip. Un
archivo comprimido con bzip2 se denota con la extensin .bz2:

22
9

[Me @ linuxbox ~] $ ls -l / etc> foo.txt [me @


linuxbox ~] $ ls -l foo.txt
-rw-r - r-- 1 me me 15738 2008-10-17 13:51 foo.txt [me @
linuxbox ~] $ bzip2 foo.txt [me @ linuxbox ~] $ ls -l
f oNo
o . t xsea
t . b z 2la compresin Compulsivo
- r De
w - rvez
- r en
-- 1
m e mveo
e 2a7la
9 2gente
2 0 0 tratando
8 - 1 0 - 1 7de1 3comprimir
: 5 1 f o o . tun
x t .archivo,
b z 2 [ mque
e ya se ha
cuando
@comprimido
l i n u x b o x con
~ ] $unbalgoritmo
u n z i p 2 fde
o ocompresin
. t x t . b z 2 efectiva, haciendo algo como esto:
$ Gzip imagen.jpg
No lo hagas. Probablemente usted est perdiendo el tiempo y el espacio! Si se aplica la
compresin de un archivo que ya est comprimido, usted realmente va a terminar en
un archivo ms grande. Esto se debe a que todas las tcnicas de compresin implican
cierta sobrecarga que se aade al archivo para describir la compresin. Si intenta
comprimir un archivo que ya no contiene informacin redundante, la compresin no
dar lugar a ningn ahorro para compensar la sobrecarga adicional.
18 - Archivado y copia de seguridad
Como podemos ver, bzip2 se pueden utilizar de la misma manera como gzip. Todas las
opciones (excepto -r) que discutimos para gzip tambin se apoyan en bzip2. Tenga en cuenta,
sin embargo, que la opcin de nivel de compresin (alto) tiene un significado algo diferente a
bzip2. bzip2 viene con bunzip2 y bzcat para descomprimir archivos.
b z i p 2 Tambin viene con el programa bzip2recover, que tratar de recuperar archivos .bz2
daados.

Almacenamiento de archivos
Una tarea comn de administracin de archivos a menudo se utiliza junto con la compresin
est archivando. El archivo es el proceso de reunir a muchos archivos y agrupar juntos en un
nico archivo de gran tamao. Archiving se hace a menudo como parte de las copias de
seguridad del sistema. Tambin se utiliza cuando los datos de edad se mueve desde un
sistema a algn tipo de almacenamiento a largo plazo.

alquitrn
En el mundo Unix de software, el programa de alquitrn es la herramienta clsica para
archivar los archivos. Su nombre, abreviatura de archivo de cinta, revela sus races como una
herramienta para la toma de las cintas de copia de seguridad. A pesar de que todava se utiliza
para esa tarea tradicional, es igualmente hbil en otros dispositivos de almacenamiento
tambin.
230

Almacenamient
o de archivos
A menudo vemos los nombres de archivo que terminen con la extensin .tar o .tgz, que
indican un archivo "llanura" alquitrn y un archivo comprimido con gzip, respectivamente.
Un archivo tar puede consistir de un grupo de archivos separados, uno o ms jerarquas de
directorios, o una mezcla de ambos. La sintaxis del comando funciona as:
modo de alquitrn [opciones] nombre de ruta ...
donde mode es uno de los siguientes modos de funcionamiento (slo se muestra una lista
parcial aqu, ver la pgina de manual de alquitrn para una lista completa):
Tabla 18-2: Modos de alquitrn
Modo
c

Descripcin
Crear un archivo de una lista de archivos y / o directorios.

Extraer un archivo.

Aada los nombres de ruta especificado al final de un archivo.

Listar el contenido de un archivo.

alquitrn utiliza una forma un poco extraa de expresar opciones, por lo que vamos a
necesitar algunos ejemplos para mostrar cmo funciona. En primer lugar, vamos a volver a
crear nuestro patio de recreo del captulo anterior:
[Me @ linuxbox ~] $ mkdir -p patio de recreo / dir- {001..100} [me @ linuxbox ~]
$ touch patio de recreo / dir- {001..100} / {Archivo- A..Z}
A continuacin, vamos a crear un archivo tar de toda la
zona de juegos:
[Me @ linuxbox ~] $ tar cf playground.tar parque infantil
Este comando crea una playground.tar llamado archivo tar que contiene toda la jerarqua de
directorios de juegos. Podemos ver que el modo y la opcin f, que se utiliza para especificar el
nombre del archivo tar, pueden estar unidos entre s, y no requieren de un guin que conduce.
Tenga en cuenta, sin embargo, que el modo siempre se debe especificar primero, antes de
cualquier otra opcin.
Para listar el contenido del archivo, podemos hacer esto:

[Me @ linuxbox ~] $ tar tf playground.tar

231

18 - Archivado y copia de seguridad ________________________


Para obtener una lista ms detallada, podemos aadir la opcin v
(detallado):
[Me @ linuxbox ~] $ tar tvf playground.tar
Ahora, vamos a extraer el patio de recreo en una nueva ubicacin. Haremos esto mediante la
creacin de un nuevo directorio llamado foo, cambiar el directorio y extraer el archivo tar:

[Me @ linuxbox ~] $ mkdir foo [me @ linuxbox ~] foo $


cd
[Me @ linuxbox foo] $ tar xf ../playground.tar
[Me @ foo linuxbox] $ ls parque infantil

Si examinamos el contenido de ~ / foo / parque, vemos que el archivo se ha instalado


correctamente, la creacin de una reproduccin exacta de los archivos originales. Hay una
advertencia, sin embargo: A menos que usted est operando como superusuario, archivos y
directorios extrados de archivos asumen la propiedad del usuario que realiza la restauracin,
en lugar del propietario original.
Otro comportamiento interesante de alquitrn es la forma en que maneja los nombres de ruta
en los archivos. El valor predeterminado para los nombres de ruta es relativa, no absoluta.
alquitrn hace esto por la simple eliminacin de cualquier barra que va desde la ruta de acceso
al crear el archivo. Para demostrarlo, vamos a volver a crear nuestro archivo, esta vez
especificando una ruta absoluta:
[Me @ foo linuxbox] $ cd
[Me @ linuxbox ~] $ tar cf playground2.tar - / parque
Recuerde, - / parque ampliar en / home / me / patio de recreo cuando pulsamos la tecla
Intro, por lo que obtendr una ruta absoluta para nuestra demostracin. A continuacin,
vamos a extraer el archivo como antes y ver lo que sucede:

[Me @ linuxbox ~] foo $ cd


[Me @ linuxbox foo] $ tar xf ../playground2.tar
[Me @ foo linuxbox] $ ls casa del patio de recreo [me @
linuxbox foo] $ ls caseros m
[Me @ foo linuxbox] $ ls casa / mi patio de recreo

232

Almacenamiento de archivos
Aqu podemos ver que cuando hemos extrado nuestro segundo archivo, se vuelve a crear el
directorio home / me / parque infantil con relacin a nuestro directorio de trabajo actual, ~ /
foo, no en relacin con el directorio raz, como hubiera sido el caso con un absoluto nombre de
ruta. Esto puede parecer una manera extraa para que funcione, pero en realidad es ms til
de esta manera, ya que nos permite extraer los archivos a cualquier lugar en vez de ser
forzados a extraer a sus ubicaciones originales. Repetir el ejercicio con la inclusin de la opcin
verbosa (v) dar una idea ms clara de lo que est pasando.
Vamos a considerar un hipottico, pero prctico, ejemplo de alquitrn en la accin.
Imaginemos que queremos copiar el directorio de inicio y su contenido desde un sistema a
otro y tenemos un gran disco duro USB que podemos utilizar para la transferencia. En nuestro
moderno sistema Linux, la unidad es "automgicamente" montado en el directorio / media.
[Me @ linuxbox ~] $ sudo tar cf /media/BigDisk/home.tar / casa
Tambin vamos a imaginar que el disco tiene un nombre de volumen de BigDisk cuando nos

[Me @ linuxbox2 ~] $ cd /
[Me @ linuxbox2 /] $ sudo tar xf /media/BigDisk/home.tar
concedemos la misma. Para hacer que el archivo tar, podemos hacer lo siguiente:
Despus de que el archivo tar est escrito, que desmontar la unidad y colquelo en el segundo
equipo. Una vez ms, se monta en / media / BigDisk. Para extraer el archivo, hacemos esto:
Lo que es importante ver aqu es que primero tenemos que cambiar el directorio a /, por lo que
la extraccin es relativa al directorio raz, ya que todas las rutas de acceso dentro del archivo
son relativos.

tar xf archive.tar ruta


Al extraer un archivo, es posible limitar lo que se extrae del archivo. Por ejemplo, si
quisiramos extraer un nico archivo de un archivo comprimido, que se poda hacer as:
Mediante la adicin de la ruta posterior al comando, alquitrn slo restaurar el archivo
especificado. Mltiples nombres de ruta pueden ser especificados. Tenga en cuenta que la ruta
debe ser el, nombre de ruta relativa exacta completo como se almacena en el archivo. Al
especificar las rutas de acceso, los comodines no estn normalmente apoyadas; Sin embargo, la
versin GNU de tar (que es la versin con mayor frecuencia en las distribuciones de Linux) los
apoya con la opcin - -wildcards. Aqu hay un ejemplo usando nuestro archivo playground.tar
anterior:

233

[Me @ linuxbox ~] foo $ cd


[Me @ linuxbox foo] $ tar xf ../playground2.tar --wildcards 'casa / me / yground pla / dir - * /
archivo-A'
18 - Archivado y copia de seguridad
Este comando va a extraer slo los archivos que coinciden con el nombre de ruta especificado
incluyendo el comodn DIR- *.
a l q u i t r n se utiliza a menudo en combinacin con encontrar a crear archivos. En este
[Me @ linuxbox ~] $ find -name parque infantil 'archivo-A' -exec playground.tar
rf alquitrn '{}' '+'
ejemplo, vamos a utilizar la funcin Buscar para producir un conjunto de archivos a incluir en
un archivo:
Aqu usamos encontrar para que coincida con todos los archivos de zona de juegos llamado
archivo-A y, a continuacin, utilizando la accin -exec, invocamos el alquitrn en el modo
append (r) para aadir los archivos que coinciden con el playground.tar archivo.
El uso de alquitrn con hallazgo es una buena manera de crear copias de seguridad
incrementales de un rbol de directorios o todo un sistema. Mediante el uso de hallazgo para
que coincida con los archivos ms recientes que un archivo de marca de tiempo, podramos
[Me @ foo linuxbox] $ cd
[Me @ linuxbox ~] $ find -name parque infantil 'archivo-A' | tar cf - --files- from = - | gzip>
playground.tgz
crear un archivo que slo contiene archivos ms recientes que el anterior archivo, suponiendo
que el archivo timestamp se actualiza justo despus de crear cada archivo.
tar tambin puede hacer uso de la entrada y salida estndar. Aqu est un ejemplo completo:
En este ejemplo, se utiliz el programa de descubrimiento para producir una lista de archivos
que coinciden y los canaliza en alquitrn. Si el nombre de archivo "-" no se especifica, se toma
en el sentido de entrada o de salida estndar, segn sea necesario (Por cierto, esta convencin
de usar "-" para representar la entrada estndar / OUTPUT es utilizado por un nmero de
otros programas, tambin.) Los --files-de opcin (que tambin se puede especificar como -T)
causa alquitrn a leer su lista de nombres de ruta de un archivo en lugar de la lnea de
comandos. Por ltimo, el archivo producido por tar se canaliza en gzip para crear el
playground.tgz archivo comprimido. La extensin .tgz es la extensin convencional dado a
archivos tar comprimidos con gzip. La extensin .tar.gz tambin se utiliza a veces.
Aunque hemos utilizado el programa gzip externamente al producido nuestro archivo
comprimido, mo-

234

Almacenamiento de archivos
ern versiones de GNU tar apoyan tanto gzip y bzip2 compresin directa, con el uso de las
[Me @ linuxbox ~] $ find -name parque infantil 'archivo-A' | tar czf
playground.tgz -T opciones de z y j, respectivamente. Usando nuestro ejemplo anterior como base, se puede
[Me @ linuxbox ~] $ find -name parque infantil 'archivo-A' | tar CJF
playground.tbz -T simplificar de la siguiente manera:
Si hubiramos querido crear un archivo comprimido bzip2 lugar, podramos haber hecho esto:
Simplemente cambiando la opcin de compresin de la Z a j (y cambiar la extensin del
archivo de salida para .tbz para indicar un archivo comprimido bzip2) hemos habilitado la
[Me @ linuxbox ~] $ mkdir remoto-cosas
[Me @ linuxbox ~] $ cd remoto-cosas
[Me @ linuxbox remoto cosas] $ ssh remotas-sys 'tar cf - Documentos' | tar xf me @ contrasea del remote-sys:
[Me @ linuxbox remoto-stuff] $ ls Documentos
compresin bzip2.
Otro uso interesante de la entrada estndar y la salida con el comando tar implica la
transferencia de archivos entre sistemas en una red. Imagina que tenamos dos mquinas que
ejecutan un sistema operativo tipo Unix equipado con alquitrn y ssh. En tal escenario,
podramos transferir un directorio de un sistema remoto (llamado remoto-sys para este
ejemplo) a nuestro sistema local:
Aqu hemos sido capaces de copiar un directorio de documentos con nombre del sistema
remoto a distancia-sys a un directorio dentro del directorio llamado remoto-cosas en el sistema
local. Cmo hacemos esto? En primer lugar, pusimos en marcha el programa de alquitrn en
el sistema remoto usando ssh. Usted recordar que ssh nos permite ejecutar un programa de
forma remota en un equipo en red y "ver" los resultados en el sistema de la salida estndar
local producido en el sistema remoto se enva al sistema local para su visualizacin. Podemos
tomar ventaja de esto por tener alquitrn crear un archivo (el modo c) y enviarlo a la salida
estndar, en lugar de un archivo (la opcin f con el argumento de guin), el transporte de este
modo el archivo sobre el tnel cifrado proporcionado por ssh a el sistema local. En el sistema
local, ejecutamos el alquitrn y hacer que se expanda un archivo (el modo x) suministrada
desde la entrada estndar
235

18 - Archivado y copia de seguridad ________


(De nuevo, la opcin f con el argumento de
guin).

cremallera
El programa de compresin es a la vez una herramienta de compresin y un archivador. El
formato de archivo utilizado por el programa es familiar para los usuarios de Windows, ya
que lee y escribe archivos .zip. En Linux, sin embargo, gzip es el programa de compresin
predominante con bzip2 ser un cercano segundo lugar.
En su uso ms bsico, zip se invoca as:
Opciones zip ZipFile archivo ...
Por ejemplo, para hacer un archivo zip de nuestro patio de recreo, que bamos a hacer esto:

[Me @ linuxbox ~] $ zip -r playground.zip parque infantil


A menos que se incluye la opcin -r para recursividad, slo el directorio parque infantil (pero
ninguno de sus contenidos) se almacenan. A pesar de la adicin de la extensin .zip es
automtica, que incluir la extensin de archivo para mayor claridad.
Durante la creacin del archivo zip, zip normalmente mostrar una serie de mensajes como
este:

aadiendo: parque infantil / dir-020 / archivo-Z


(almacenado 0%) aadir: patio de recreo / dir-020 /
archivo-Y (almacenado 0%) aadir: patio de recreo /
dir-020 / archivo-X (almacenado 0%) y agreg: patio de
recreo / dir-087 / (almacenado 0%) aadir: patio de recreo /
dir-087 / archivo-S (almacenado 0%)
Estos mensajes muestran el estado de cada archivo aadido al archivo. zip aadir archivos al
archivo mediante uno de dos mtodos de almacenamiento: o lo har "guardar" un archivo sin
compresin, como se muestra aqu, o que se "desinfle" el archivo que realiza la compresin. El
valor numrico que se muestra despus de que el mtodo de almacenamiento indica la
cantidad de compresin logrado. Desde nuestro patio de recreo slo contiene archivos vacos,
sin compresin se lleva a cabo en su contenido.
Extraer el contenido de un archivo zip es sencillo cuando se utiliza el programa de
descompresin:
[Me @ linuxbox ~] foo $ cd
[Me @ foo linuxbox] $ unzip ../playground.zip

236

Almacenamiento de archivos
Una cosa a tener en cuenta sobre postal (a diferencia de alquitrn) es que si no se especifica un
archivo existente, se actualiza en lugar de reemplazarlo. Esto significa que el archivo existente
se conserva, pero se aaden nuevos archivos y los archivos coincidentes se sustituyen.
Los archivos se pueden enumerar y extrajeron de forma selectiva desde un archivo zip
mediante la especificacin de ellos para descomprimir:
[Me @
linuxbox
Archivo: ..
Longitud

~] $ Unzip -l playground.zip patio de recreo / dir-087 / archivo-Z


/playground.zip
Fecha Hora Nombre

0 05/10/08 09:25 patio de recreo / dir-087 / archivo-Z


0
1 archivo
[Me @
~] Foo $ cd
linuxbox
[Me
@ linuxbox foo] $ descomprimir ../playground.zip patio de recreo / dir-087 / archivo-Z
Archivo: ..
/playground.zip
reemplazar patio / dir-087 / archivo-Z? [Y] es, [n] o [A] ll, [N] uno,
[R] ename: y
extraccin: patio de recreo / dir-087 / archivo-Z
Usando las causas opcin -l descomprima en la lista simplemente el contenido del archivo sin
necesidad de extraer el archivo. Si no se especifica ningn archivo (s), descomprimir listar
todos los archivos en el archivo. La opcin -v puede ser aadido para aumentar el nivel de
detalle de la lista. Tenga en cuenta que cuando los conflictos de extraccin de archivo con un
archivo existente, se le pide al usuario antes de que se sustituya el archivo.
Al igual que tar, zip puede hacer uso de la entrada y salida estndar, aunque su aplicacin es
[Me @ foo linuxbox] $ cd
[Me @ linuxbox ~] $ find -name parque infantil "archivo-A" | zip - @ file-A.zip
algo menos til. Es posible canalizar una lista de nombres de archivo zip a travs de la opcin
- @:
Aqu usamos encontramos para generar una lista de archivos que coinciden con la prueba nombre "archivo-A", y luego tubo la lista en zip, que crea el archivo file-A.zip que contiene los
archivos seleccionados.
postal tambin es compatible con la escritura de su salida a la salida estndar, pero su uso es
limitado porque muy pocos programas pueden hacer uso de la salida. Desafortunadamente, el
programa de descompresin no acepta la entrada estndar. Esto evita comprimir y
descomprimir de ser utilizados en conjunto para realizar la copia de archivos de red como el
alquitrn.
c r e m a l l e r a puede, sin embargo, aceptar la entrada estndar, por lo que se puede utilizar
para comprimir la salida de otros programas:

237

[Me @ linuxbox ~] $ ls -l / etc / | ls-etc.zip zip aadiendo: - (deflactado 80%)


18 - Archivado y copia de seguridad
En este tubo de ejemplo que la salida de ls en zip. Al igual que tar, zip interpreta el guin
posterior como "utilizar la entrada estndar para el archivo de entrada."
[Me @ linuxbox ~] $ unzip -p ls-etc.zip | menos
El programa de descompresin permite su salida que se enviar a la salida estndar cuando se
especifica la opcin -p (tubo de):
Hemos tocado en algunas de las cosas bsicas que zip / unzip puede hacer. Ambos tienen una
gran cantidad de opciones que se suman a su flexibilidad, aunque algunas son especficas de
la plataforma a otros sistemas. Las pginas del manual para comprimir y descomprimir
ambos son bastante buenos y contienen ejemplos tiles. Sin embargo, el uso principal de estos
programas es para el intercambio de archivos con sistemas Windows, en lugar de realizar la
compresin y archivado en Linux, donde se prefieren en gran medida tar y gzip.

Sincronizacin de archivos y directorios


Una estrategia comn para el mantenimiento de una copia de seguridad de un sistema
consiste en mantener uno o ms directorios sincronizados con otro directorio (o directorios)
situados ya sea en el sistema local (por lo general un dispositivo de almacenamiento extrable
de algn tipo) o un sistema remoto. Podramos, por ejemplo, tener una copia local de un sitio
web en fase de desarrollo y sincronizar de vez en cuando con la copia de "vivir" en un servidor
web remoto.
En el mundo Unix, la herramienta preferida para esta tarea es rsync. Este programa puede
sincronizar directorios locales y remotos mediante el protocolo de actualizacin remota de
rsync, que permite a rsync para detectar rpidamente las diferencias entre los dos directorios y
realizar el mnimo de la copia requerida para ponerlos en sincrona. Esto hace rsync muy
rpido y econmico de usar, en comparacin con otros tipos de programas de copia.
r s y n c se invoca as:
r s y n c origen destino opciones
donde origen y destino son uno de los siguientes:
Un archivo local o el directorio
Un archivo o directorio remoto en forma de [usuario @] host: ruta
Un servidor rsync remoto especificado con un URI de rsync: // [usuario @] host [:
puerto] / ruta Tenga en cuenta que el origen o el destino debe ser un archivo local.
-Remoto-a-remoto de autor 238

Sincronizacin de archivos y
directorios
ING no es compatible.
Vamos a tratar de rsync a cabo en algunos archivos locales. En primer lugar, vamos
a limpiar nuestro directorio foo:
[Me @ linuxbox ~] $ rm -rf foo / *
A continuacin, vamos a sincronizar el directorio de parque infantil con una copia
correspondiente en foo:
[Me @ linuxbox ~] $ rsync parque -av foo
Hemos incluido tanto la opcin -a (para archivar causa-recursividad y la preservacin de los
atributos de archivo) y la opcin -v (salida detallada) para hacer un espejo de la zona de
juegos dentro del directorio foo. Mientras que el comando se ejecuta, vamos a ver una lista de
los archivos y directorios que va a copiar. Al final, vamos a ver un mensaje de resumen as:

enviaron 135759 bytes recibieron 57.870 bytes 387.258,00 bytes / seg tamao
total es de 3230 aumento de velocidad es de 0,02
indicando la cantidad de copias a realizar. Si ejecutamos el comando de nuevo, vamos a ver
un resultado diferente:

[Me @ linuxbox ~] $ rsync playgound -av foo


lista de archivos edificio ... hecho
enviaron 22.635 bytes recibidos 20 bytes 45.310,00 bytes / seg tamao
total es de 3230 aumento de velocidad es de 0,14

Observe que no haba ninguna lista de archivos. Esto se debe a rsync detecta que no hubo
diferencias entre - / parque infantil y ~ / foo / zona de juegos, y por lo tanto no tena
necesidad de copiar nada. Si modificamos un archivo en el parque y correr de nuevo rsync:

[Me @ linuxbox ~] $ touch patio de recreo / dir-099 / archivo-Z


[me @ linuxbox ~] $ rsync parque -av foo
lista de archivos edificio ... hecho
patio / dir-099 / archivo-Z
enviaron 22.685 bytes recibidos 42 bytes 45.454,00 bytes / seg tamao
total es de 3230 aumento de velocidad es de 0,14

239

18 - Archivado y copia de seguridad _________________________________________________


vemos que rsync detecta el cambio y copiar slo el archivo actualizado.
Como ejemplo prctico, vamos a considerar la unidad de disco duro externa imaginaria que
hemos utilizado anteriormente con alquitrn. Si le damos la unidad a nuestro sistema y, una
vez ms, que se monta en / me- dia / BigDisk, podemos realizar una copia de seguridad del
[Me @ linuxbox ~] $ mkdir / media / BigDisk / copia de seguridad
[Me @ linuxbox ~] $ sudo rsync -av --delete / etc / home / usr / local
/ Media / BigDisk / copia de seguridad
sistema til al crear primero un directorio llamado / copia de seguridad en el disco duro
externo, y luego usando rsync para copiar las cosas ms importantes de nuestro sistema a la
unidad externa:
En este ejemplo, hemos copiado el archivo / etc, / home y / usr / directorios locales de
nuestro sistema a nuestro dispositivo de almacenamiento imaginario. Incluimos la opcin -delete para eliminar archivos que puedan haber existido en el dispositivo de copia de
seguridad que ya no exista en el dispositivo fuente (esto es irrelevante la primera vez que
hacemos una copia de seguridad, pero ser til en las copias posteriores). Repetir el
procedimiento de fijacin de la unidad externa y ejecutar este comando rsync sera una forma
copia de seguridad de alias = 'sudo rsync -av --delete / etc / home / usr / local
/ media / BigDisk / copia de seguridad'
til (aunque no es lo ideal) de mantener un pequeo sistema de copia de seguridad. Por
supuesto, un alias sera til, tambin. Podramos crear un alias y agregarlo a nuestro archivo
.bashrc para proporcionar esta funcin:
Ahora todo lo que tenemos que hacer es unir nuestra unidad externa y ejecutar el comando de
copia de seguridad para hacer el trabajo.

Usando rsync travs de una red


Una de las bellezas reales de rsync es que puede ser usado para copiar archivos a travs de
una red. Despus de todo, la "r" en rsync significa "a distancia." Copia remota se puede hacer
en una de dos maneras. La primera manera es con otro sistema que ha instalado rsync, junto
con un programa de shell remoto tal como ssh. Vamos a decir que tuvimos otro sistema en
nuestra red local con una gran cantidad de espacio disponible en disco duro y queramos
llevar a cabo nuestra operacin de copia de seguridad mediante el sistema remoto en lugar de
un disco duro externo. Suponiendo que ya haba un directorio llamado / copia de seguridad
[Me @ linuxbox ~] $ sudo rsync -av --delete --rsh = ssh / etc / home
donde podramos ofrecer nuestros archivos, podramos hacer esto:

240

/ usr remotos / local es -sys: /


copia de seguridad

Sincronizacin de archivos y directorios

Hemos hecho dos cambios en nuestro comando para facilitar la copia de red. En primer lugar,
hemos aadido la opcin --rsh = ssh, que indica a rsync de utilizar el programa ssh como su
shell remoto. De esta manera, hemos sido capaces de utilizar un tnel ssh cifrado para
transferir de forma segura los datos del sistema local al host remoto. En segundo lugar,
especificamos el host remoto con el prefijo de su nombre (en este caso el host remoto se
nombra a distancia-sys) para la ruta de destino.
La segunda forma en que se puede utilizar rsync para sincronizar archivos a travs de una red
es mediante el uso de un servidor de rysnc. rsync puede ser configurado para ejecutarse como
un demonio y escuche las peticiones de entrada para la sincronizacin. Esto se hace a menudo
para permitir la creacin de reflejo de un sistema remoto. Por ejemplo, Red Hat Software
mantiene un gran repositorio de paquetes de software en fase de desarrollo para su
distribucin Fedora. Es til para los probadores de software para reflejar esta coleccin
durante la fase de pruebas del ciclo de liberacin de distribucin. Dado que los archivos en el
repositorio de cambio con frecuencia (a menudo ms de una vez al da), es deseable mantener
[Me @ linuxbox ~] $ mkdir fedora-devel
[Me @ linuxbox ~] $ rsync -av -delete rsync: //rsync.gtlib.gatech.edu/fed ora-linux-core /
desarrollo / i386 / os fedora-devel
una rplica local por la sincronizacin peridica, en vez de por la copia grueso del repositorio.
Uno de estos repositorios se mantiene en Georgia Tech; podramos reflejar que el uso de
nuestra copia local de rsync y su servidor rsync como esto:
En este ejemplo, se utiliza el URI del servidor rsync remoto, que consta de un protocolo (rsync:
//), seguido por el nombre de host-remoto (rsync.gtlib.gatech.edu), seguido por el nombre de
ruta del repositorio .

Resumiendo
Hemos visto los programas de compresin y archivo comunes utilizados en Linux y otros
sistemas operativos tipo Unix. Para los archivos de archivo, la combinacin tar / gzip es el
mtodo preferido en sistemas tipo Unix mientras zip / unzip se utiliza para la
interoperabilidad con los sistemas Windows. Por ltimo, nos fijamos en el programa rsync (un
favorito personal) que es muy til para la sincronizacin eficiente de los archivos y directorios
a travs de los sistemas.

Lectura adicional
Las pginas de manual para todos los comandos discutidos aqu son bastante claras y
contienen ejemplos tiles. Adems, el proyecto GNU tiene un buen manual en lnea
para su versin de alquitrn. Se puede encontrar aqu:
241

18 - Archivado y copia de
seguridad
http://www.gnu.org/software/tar/manual/index.h
tml

242

19 regulares

Expresiones

19 - Expresiones regulares
En los prximos captulos, vamos a mirar a las herramientas que se utilizan para manipular el
texto. Como hemos visto, los datos de texto juega un papel importante en todos los sistemas
de tipo Unix, como Linux. Pero antes de que podamos apreciar plenamente todas las
caractersticas que ofrecen estas herramientas, tenemos que examinar en primer lugar una
tecnologa que se asocia con frecuencia a los usos ms sofisticados de estas herramientas
expresiones regulares.
Como hemos navegado las funciones y prestaciones que ofrece la lnea de comandos, nos
hemos encontrado con algunas de las caractersticas y comandos de shell realmente arcanos,
como la expansin de shell y citando, atajos de teclado, y la historia de comandos, por no
mencionar el editor vi. Las expresiones regulares siguen esta "tradicin" y pueden ser
(posiblemente) la caracterstica ms arcano de todos ellos. Esto no es para sugerir que el
tiempo que se necesita para aprender acerca de ellos no vale la pena el esfuerzo. Muy por el
contrario. Una buena comprensin nos permitir realizar hazaas increbles, aunque su valor
total puede no ser evidente de inmediato.

Qu son las expresiones regulares?


En pocas palabras, las expresiones regulares son notaciones simblicas que se utilizan para
identificar patrones de texto. En cierto modo, se parecen mtodo comodn de la cscara de
archivo y rutas de acceso a juego, pero en una escala mucho mayor. Las expresiones regulares
son apoyados por muchas herramientas de lnea de comandos y por la mayora de los
lenguajes de programacin para facilitar la solucin de problemas de manipulacin de texto.
Sin embargo, para confundir an ms las cosas, no todas las expresiones regulares son las
mismas; que varan ligeramente de una herramienta a otra y de lenguaje de programacin con
el lenguaje. Para nuestro anlisis, nos limitaremos a las expresiones regulares tal como se
describe en el estndar POSIX (que cubrir la mayor parte de las herramientas de lnea de
comandos), en comparacin con muchos lenguajes de programacin (sobre todo de Perl), que
utilizan conjuntos un poco ms grandes y ms ricos de notaciones .

grep
El programa principal que utilizaremos para trabajar con expresiones regulares es nuestro
viejo amigo, grep. El nombre de "grep" en realidad se deriva de la frase "impresin global de la
expresin regular", por lo que podemos ver que grep tiene algo que ver con las expresiones
regulares. En esencia, grep busca en archivos de texto para la aparicin de una expresin

regular especificada y da salida a cualquier lnea que contenga un partido a la salida estndar.

19 - Expresiones regulares _______________________

243

Hasta el momento, hemos utilizado grep con cuerdas fijas, as:

[Me @ linuxbox ~] $ ls / usr / bin | grep postal


Esto mostrar una lista de todos los archivos en el directorio / usr / bin cuyos nombres
contengan la subcadena "zip".
El programa grep acepta opciones y argumentos de esta
manera: grep [opciones] regex [archivo ...] donde regex es una
expresin regular.
Aqu est una lista de las opciones de grep comnmente utilizados:
Table20-1: Opciones grep
Opcin
-i
-v

-c

-l
-L

-n
-h

Descripcin
Ignorar caso. No distinguir entre maysculas y minsculas. Tambin
puede ser especificado --ignore caso.
Invertir partido. Normalmente, grep muestra las lneas que contienen un
partido. Esta opcin hace que grep para imprimir cada lnea que no
contenga un partido. Tambin puede ser especificado - -invert-partido.
Imprimir el nmero de partidos (o no-partidos si tambin se especifica la
opcin -v) en lugar de las propias lneas. Tambin puede ser especificado
- -count.
Escriba el nombre de cada archivo que contiene un partido en lugar de
las lneas mismas. Tambin se puede especificar --files-con-partidos.
Al igual que la opcin -l, pero imprimir slo los nombres de los archivos
que no contienen coincidencias. Tambin se puede especificar partido
--files-Without-.
Prefijo en cada lnea coincidente con el nmero de la lnea en el archivo.
Tambin puede ser especificado --line-nmero.
Para bsquedas de varios archivos, suprimir la salida de los nombres de
archivo. Tambin puede ser especificado - -no-nombre de archivo.

Con el fin de explorar ms a fondo grep, vamos a crear algunos archivos de texto a buscar: 244

gre
EUR
[Me @ linuxbox ~] $ ls / bin> listadir-bin.txt [me @ linuxbox ~] $ ls / usr / bin>
listadir-USR-bin.txt [me @ linuxbox ~] $ ls / sbin> listadir-sbin .txt [me @
linuxbox ~] $ ls / usr / sbin> listadir-USR-sbin.txt
[Me @ linuxbox ~] $ ls * .txt listadir
listadir-bin.txt listadir-sbin.txt listadir-USR-sbin.txt listadir-USR-bin.txt

Podemos realizar una bsqueda simple de nuestra lista de los


archivos como ste:
[Me @ linuxbox ~] $ grep bzip listadir * .txt
listadir-bin.txt: bzip2
listadir-bin.txt: bzip2recover
En este ejemplo, grep busca en todos los archivos de la lista para el bzip cadena y encuentra
dos partidos, tanto en el archivo listadir-bin.txt. Si tuviramos que slo est interesado en la
lista de archivos que contenan partidos en lugar de los propios partidos, podramos
especificar la opcin -l:

[Me @ linuxbox ~] $ grep -l bzip listadir * .txt


listadir-bin.txt
Por el contrario, si slo queramos ver una lista de los archivos que no contena un partido,
podramos hacer esto:

[Me @ linuxbox ~] $ grep -L bzip listadir * .txt


listadir-sbin.txt
listadir-USR-bin.txt
listadir-USR-sbin.txt

Metacaracteres y literales
Aunque no lo parezca evidente, nuestras bsquedas grep han sido el uso de expresiones
regulares todo el tiempo, aunque sean muy simples. La expresin "bzip" regular se entiende
que un partido se producir slo si la lnea del archivo contiene al menos cuatro caracteres y
que en algn lugar en la lnea de los personajes "b", "z", "i", y "p "se encuentran en ese orden,
sin otros caracteres en el medio. Los personajes de la "bzip" cadena son todos los caracteres
literales, ya que coincide con ellos mismos. Adems de los literales, expresiones regulares
tambin pueden in245

19

- Expresiones regulares eludir metacaracteres que se utilizan para especificar partidos


ms complejas. Metacaracteres de expresiones regulares consisten en lo siguiente:
A $.
[] {} -? * + ()
|\
Todos los dems caracteres se consideran literales, aunque el carcter de barra invertida se
utiliza en algunos casos para crear secuencias de meta, as como permitir que los
metacaracteres que se escaparon y se tratan como literales en lugar de ser interpretado como
metacaracteres.
[Me @ linuxbox ~] $ grep -h '.zip' listadir * .txt
bunzip2
bzip2
bzip2recover
gunzip
gzip
funzip
gpg-zip
preunzip
prezip
prezip-bin
abrir la cremallera
UnZipSFX
Nota: Como podemos ver, muchos de los metacaracteres de expresiones regulares son
tambin caracteres que tienen significado para la cscara cuando se lleva a cabo la
expansin. Cuando pasamos expresiones regulares contienen metacaracteres en la
lnea de comandos, es vital que ir entre comillas para evitar que el shell de tratar de
ampliarlos.

El Cualquier carcter
La primera metacaracter vamos a ver es el punto o perodo de carcter, que se utiliza para que
coincida con cualquier carcter. Si incluimos en una expresin regular, que coincidir con
cualquier carcter en esa posicin de carcter. He aqu un ejemplo:
Se realizaron bsquedas de cualquier lnea en nuestros archivos que coincide con la expresin
regular ".zip". Hay un par de cosas interesantes a tener en cuenta sobre los resultados.
Observe que no se encontr el programa de compresin. Esto se debe a la inclusin de la
metacarcter punto en nuestra expresin regular aumenta la longitud del partido necesario
para cuatro personajes, y porque el nombre de "zip" slo contiene tres, no coincide. Adems, si
los archivos de nuestras listas haban contenido la extensin de archivo .zip, habran sido
acompaados tambin, porque el carcter de punto en la extensin de archivo se trata como
"cualquier carcter", tambin.

246

Anclas

Anclas
El smbolo de intercalacin (A) y el signo de dlar ($) caracteres se tratan como anclas en
expresiones regulares. Esto significa que causan el partido a ocurrir solamente si la expresin
regular se encuentra al comienzo de la lnea (a) o al final de la lnea ($):

[Me @ linuxbox ~] $ grep -h listadir 'Azip' * .txt


cremallera
zipcloak
zipgrep
zipinfo
zipnote
zipsplit
[Me @ linuxbox ~] $ grep -h 'zip $' listadir * .txt
gunzip
gzip
funzip
gpg-zip
preunzip
prezip
abrir la cremallera
cremallera
[Me @ linuxbox ~] $ grep -h 'Azip $' listadir * .txt
cremallera
Aqu se realizaron bsquedas en la lista de archivos de la cadena "zip" situado al principio de
la lnea, el extremo de la lnea, y en una lnea donde se encuentra en el principio y el final de la
lnea (es decir, por s mismo en la lnea.) Tenga en cuenta que la expresin regular 'A $' (un
principio y un final con nada en el medio) coincidir con lneas en blanco.

Un Crucigrama Helper
Incluso con nuestro conocimiento limitado de las expresiones regulares en este punto,
podemos hacer algo til.
Mi esposa ama crucigramas y ella a veces me pide ayuda con una pregunta en
particular. Algo as como: "Qu es una palabra de cinco letras cuya tercera letra es 'j'
y la ltima letra es" r "que significa ...?" Este tipo de pregunta me hizo pensar.
Saba usted que su sistema Linux contiene un diccionario? Lo hace. Echa un vistazo
en el directorio / usr / share / dict y usted puede encontrar uno, o varios. Los
archivos de diccionario ubicados slo hay largas listas de palabras, una por lnea,
dispuestos en orden alfabtico. En mi sistema, el archivo de palabras contiene un poco
ms de 98.500

247

palabras. Para encontrar posibles respuestas a la pregunta crucigrama de arriba,


podramos hacer esto:
[me @ linuxbox ~] $ grep -i 'A..jr $' / usr / share / dict / words
Mayor
mayor
El uso de esta expresin regular, podemos encontrar todas las palabras en nuestro
archivo de diccionario que son cinco letras de largo y tienen una "j" en la tercera
posicin y una "r" en la ltima posicin.
19 - Expresiones regulares

Expresiones soporte y Clases de personajes


Adems de coincidir con cualquier carcter en una posicin dada en nuestra expresin
regular, tambin podemos coincidir con un solo carcter de un conjunto de caracteres
[Me @ linuxbox ~] $ grep -h '[bg] zip' listadir * .txt
bzip2
bzip2recover
gzip
mediante el uso de expresiones del soporte. Con expresiones del soporte, podemos especificar
un conjunto de caracteres (incluidos los caracteres que de otro modo seran interpretados
como metacaracteres) para ser emparejado. En este ejemplo, utilizando un conjunto de dos
caracteres:
nosotros igualaremos cualquier lnea que contiene la cadena "bzip" o "gzip".
Un conjunto puede contener cualquier nmero de caracteres, y metacaracteres pierden su
significado especial cuando se coloca entre parntesis. Sin embargo, hay dos casos en los que
se utilizan metacaracteres dentro de las expresiones del soporte, y tienen diferentes
significados. El primero es el smbolo de intercalacin (A), que se utiliza para indicar la
negacin; el segundo es el guin (-), que se utiliza para indicar un intervalo de caracteres.

Negacin
Si el primer carcter de una expresin entre corchetes es un smbolo de intercalacin (A), se
[Me @ linuxbox ~] -h $ grep '[Abg] zip' listadir * .txt
bunzip2
gunzip
toman los caracteres restantes a ser un conjunto de caracteres que no deben estar presentes en
la posicin del carcter dado. Hacemos esto mediante la modificacin de nuestro ejemplo
anterior:

248

Expresiones soporte y Clases de personajes


funzip
gpg-zip
preunzip
prezip
prezip-bin
abrir la
cremallera
UnZipSFX
Con la negacin activa, se obtiene una lista de archivos que contengan la cadena "zip"
precedido de cualquier carcter excepto "b" o "g". Observe que no se encontr el archivo zip.
Un personaje negada establecido todava requiere un carcter en la posicin dada, pero el
personaje no debe ser un miembro del conjunto negada.
El carcter de intercalacin slo invoca negacin si es el primer carcter dentro de un soporte
de expresin; de lo contrario, pierde su significado especial y se convierte en un carcter
ordinario en el conjunto.

Rangos de carcter tradicional


Si quisiramos construir una expresin regular que encontrar todos los archivos de nuestras
listas que comienzan con una letra mayscula, podramos hacer esto:

[Me @ linuxbox ~] $ grep -h 'A [ABCDEFGHIJKLMNOPQRSTUVWXZY]' listadir * .txt


Es slo una cuestin de poner todas las cartas 26uppercase en una expresin con corchetes.
Pero la idea de todo lo que escribir es muy preocupante, por lo que no es de otra manera:

[Me @ linuxbox ~] $ grep -h 'A [A-Z]' listadir * .txt


MAKEDEV
Panel de Control
LLEGAR
CABEZA
POSTE
X
X11
Xorg
MAKEFLOPPIES
NetworkManager
NetworkManagerDispatcher
Mediante el uso de una serie de tres caracteres, podemos abreviar las 26 letras. Cualquier serie
de caracteres se puede expresar de esta manera incluyendo varios rangos, como esta
expresin que
249

19 - Expresiones regulares ___________________________


partidos todos los nombres de archivo a partir de letras y
nmeros:
[Me @ linuxbox ~] $ grep -h 'A [A-Za-z0-9]' listadir * .txt
En rangos de caracteres, vemos que el carcter guin es tratado especialmente, por lo que
cmo podemos realmente incluimos un carcter de guin en una expresin con corchetes?
Por lo que es el primer carcter de la expresin. Tenga en cuenta estos dos ejemplos:

[Me @ linuxbox ~] $ grep -h '[A-Z]' listadir * .txt


Esto coincidir con cada nombre de archivo que contiene una letra
mayscula. Mientras que:
[Me @ linuxbox ~] -h $ grep '[-AZ]' listadir * .txt
coincidir con cada nombre de archivo que contiene un guin, o una mayscula "A" o una "Z"
mayscula.

Clases de caracteres POSIX


Los rangos de caracteres tradicionales son una manera fcil de entender y eficaz para manejar
el problema de especificar rpidamente conjuntos de caracteres. Por desgracia, no siempre
funcionan. Si bien no hemos encontrado ningn problema con el uso de grep hasta ahora,
podramos tener problemas con otros programas.
De vuelta en el captulo 4, nos fijamos en cmo se usan caracteres comodn para realizar la
expansin ruta. En esa discusin, dijimos que los rangos de caracteres podran utilizarse de
manera casi idntica a la forma en que se utilizan en expresiones regulares, pero aqu est el
problema:
[Me @ linuxbox ~] $ ls / usr / sbin / [ABCDEFGHIJKLMNOPQRSTUVWXYZ] *
/ Usr / sbin / MAKEFLOPPIES
/ Usr / sbin / NetworkManagerDispatcher
/ Usr / sbin / NetworkManager
(En funcin de la distribucin de Linux, obtendremos una lista diferente de archivos,
posiblemente, una lista vaca. Este ejemplo es de Ubuntu). Este comando produce la espera
resultante una lista de slo los archivos cuyos nombres comienzan con una letra mayscula,
pero:

250

[Me @ linuxbox ~] $ ls / usr / sbin / [A-Z] *


/ Usr / sbin / biosdecode
/ Usr / sbin / charla
/ Usr / sbin / chgpasswd
/ Usr / sbin / chpasswd
/ Usr / sbin / chroot
/ Usr / sbin / limpieza-info
/ Usr / sbin / quejarse
/ Usr / sbin / console-kit-daemon

Expresiones soporte y Clases de personajes

con este comando se obtiene un resultado totalmente diferente (slo se muestra una lista
parcial de los resultados). Porqu es eso? Es una historia larga, pero aqu est la versin corta:
Antes, cuando Unix fue desarrollado por primera vez, slo se saba de caracteres ASCII, y esta
caracterstica se refleja este hecho. En ASCII, los primeros 32 caracteres (nmeros 0-31) son
cdigos de control (cosas como pestaas, retrocesos, y los retornos de carro). El prximo 32
(32-63) contienen caracteres imprimibles, incluyendo la mayora de los signos de puntuacin y
los nmeros del cero al nueve. Los siguientes 32 (nmeros 64 a 95) contienen las letras
maysculas y un poco ms de los smbolos de puntuacin. Los ltimos 31 (nmeros 96-127)
contienen las letras minsculas y sin embargo ms smbolos de puntuacin. En base a este
acuerdo, los sistemas que utilizan ASCII utilizan un orden de clasificacin que se vea as:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
Esto difiere de la orden de diccionario adecuado, que es como esta:
aAbBcCdDeEfFgGhHiljJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ
A medida que la popularidad de Unix se extendi ms all de los Estados Unidos, all creci la
necesidad de apoyar a los personajes que no se encuentran en los Estados Unidos Ingls. La
tabla ASCII se ampli a utilizar un total de ocho bits, aadiendo los nmeros 128 a 255
caracteres, que alojan muchos ms idiomas. Para apoyar esta capacidad, las normas POSIX
introdujeron un concepto llamado un entorno local, lo que podra ser ajustado para
[Me @ linuxbox ~] $ echo $ LANG
en_US.UTF-8
seleccionar el conjunto de caracteres necesario para una ubicacin particular. Podemos ver la
configuracin del idioma de nuestro sistema con este comando:
Con esta configuracin, las aplicaciones compatibles con POSIX usarn una colacin para el
diccionario en lugar de orden ASCII. Esto explica el comportamiento de los comandos
anteriores. Una gama carcter de [AZ] cuando se interpreta con el fin diccionario incluye
todos los caracteres alfabticos en minsculas, excepto la "a", por lo tanto, nuestros resultados.
Para trabajar parcialmente alrededor de este problema, el estndar POSIX incluye una serie de
clases de caracteres que proporcionan intervalos tiles de caracteres. Se describen en la tabla
BE- 251

19 - Expresiones regulares __________


baja:
Tabla 19-2: Las clases de caracteres de POSIX
Carcter de clase
[: Alnum:]
[: Palabra:]
[: Alpha:]

Descripcin
Los caracteres alfanumricos. En ASCII, lo que equivale a:
[A-Za-z0-9]
El mismo que [: alnum:], con la adicin de el carcter de
subrayado (_) carcter.
Los caracteres alfabticos. En ASCII, lo que equivale a: [A-Za-z]

[: Blank:]
[: Cntrl:]

Incluye los caracteres de espacio y tabulador.

[: Dgito:]
[: Graph:]

Los nmeros del cero al nueve.

[: Lower:]
[: Punct:]

Las letras minsculas.

[: Print:]
[: Space:]

[: Upper:]
[: Xdigit:]

Los cdigos de control ASCII. Incluye los caracteres ASCII del 0 al


31 y 127.

Los caracteres visibles. En ASCII, que incluye personajes de 33 a


126.
Los caracteres de puntuacin. En ASCII, lo que equivale a: [-! "#
$% & '.? () * +, / :; <=> @ [\\\] _' {|} ~]
Los caracteres imprimibles. Todos los personajes de [: graph:] ms
el carcter de espacio.
Los espacios en blanco incluidos espacio, tabulador, retorno de
carro, salto de lnea, tabulacin vertical, y la forma de
alimentacin. En ASCII, lo que equivale a:
[\ T \ r \ n \ v \ f]
Los caracteres en maysculas.
Caracteres utilizados para expresar nmeros hexadecimales. En
ASCII, lo que equivale a:
[0-9A-Fa-f]

Incluso con las clases de caracteres, todava no hay una manera conveniente de expresar
rangos parciales, tales como [AM].
El uso de clases de personajes, podemos repetir nuestra lista de directorios y ver un resultado
mejorado: 252

Expresiones soporte y Clases de personajes


[Me @ linuxbox ~] $ ls / usr / sbin / [[: upper:]] *
/ Usr / sbin / MAKEFLOPPIES
/ Usr / sbin / NetworkManagerDispatcher
/ Usr / sbin / NetworkManager
Recuerde, sin embargo, que esto no es un ejemplo de una expresin regular, sino que es el
shell realiza la expansin de nombre de camino. Mostramos aqu porque las clases de
caracteres de POSIX se pueden utilizar para ambos.

Volviendo a la tradicional Colacin Orden


Usted puede optar por tener su sistema utiliza el (ASCII) para el cotejo tradicional
cambiando el valor de la variable de entorno LANG. Como vimos anteriormente, la
variable LANG contiene el nombre de la lengua y el carcter conjunto utilizado en su
localidad. Este valor se determin originalmente cuando ha seleccionado un idioma
de instalacin como se instal su Linux.
Para ver la configuracin regional, utilice el comando locale:
[Me @ linuxbox ~] $ locale
LANG = en_US.UTF-8
LC_CTYPE = "en_US.UTF-8"
LC_NUMERIC = "en_US.UTF -8"
LC_TIME = "en_US.UTF -8"
LC_COLLATE = "en_US.UTF -8"
LC_MONETARY = "en_US.UTF-8"
LC_MESSAGES = "en_US.UTF -8"
LC_PAPER = "en_US.UTF-8"
LC_NAME = "en_US.UTF -8"
LC_ADDRESS = "en_US.UTF -8"
LC_TELEPHONE = "en_US.UTF -8"
LC_MEASUREMENT = "en_US.UTF -8"
LC_IDENTIFICATION = "en_US.UTF -8"
LC_ALL =
Para cambiar la configuracin regional a usar los comportamientos tradicionales de
Unix, establezca la variable LANG en POSIX:
[Me @ linuxbox ~] $ export LANG = POSIX
Tenga en cuenta que este cambio convierte el sistema para que utilice EE.UU. Ingls
(ms especficamente, ASCII) para su juego de caracteres, as que sea seguro de si esto
es realmente lo que quieres.
Usted puede hacer este cambio permanente aadiendo esta lnea para que su archivo
.bashrc:

253

export LANG =
POSIX
19 - Expresiones regulares

POSIX bsico vs. Expresiones regulares extendidas


Justo cuando pensbamos que esto no poda ser ms confuso, descubrimos que POSIX
tambin divide las implementaciones de expresiones regulares en dos tipos: las expresiones
regulares bsicas (BRE) y expresiones regulares extendidas (ERE). Las caractersticas que
hemos cubierto hasta ahora son apoyados por cualquier aplicacin que sea compatible con
POSIX e implementa BRE. Nuestro programa grep es uno de esos programas.
Cul es la diferencia entre BRE y ERE? Es una cuestin de metacaracteres. Con BRE, los
siguientes metacaracteres se reconocen:
La

$. [] *

Todos los dems caracteres se consideran literales. Con ERE, se aaden los siguientes

POSIX
Durante la dcada de 1980, Unix lleg a ser un sistema operativo comercial muy
popular, pero en 1988, el mundo de Unix estaba en la agitacin. Muchos fabricantes de
ordenadores han licenciado el cdigo fuente de Unix de sus creadores, AT & T, y
fueron el suministro de varias versiones del sistema operativo con sus sistemas. Sin
embargo, en sus esfuerzos para crear la diferenciacin de productos, cada fabricante
aade cambios de propiedad y extensiones. Esto comenz a limitar la compatibilidad
del software. Como siempre con los vendedores propietarios, cada uno estaba
tratando de jugar un partido ganador de "lock-in" con sus clientes. Esta poca oscura
en la historia de Unix es conocido hoy en da como "la balcanizacin".
metacaracteres (y sus funciones asociadas):
() {}? + I
Sin embargo (y esta es la parte divertida), el "(", ")", "{" y "}" personajes son tratados como
metacaracteres en BRE si se escaparon con una barra invertida, mientras que con el ERE, que
precede cualquier metacaracter con una barra invertida hace que sea tratado como un literal.
Cualquier rareza que viene ser cubierto en las discusiones que siguen.
Dado que las caractersticas que vamos a discutir el prximo son parte del ERE, que vamos a
tener que utilizar un grep diferente. Tradicionalmente, esto se ha realizado por el programa
egrep, pero la versin GNU de grep tambin soporta expresiones regulares extendidas cuando
se utiliza la opcin -E.

254

POSIX bsico vs. Expresiones regulares extendidas

Alternancia
La primera de las funciones de expresiones regulares extendidas que discutiremos se llama
Introduzca el IEEE (Instituto de Ingenieros Elctricos y Electrnicos). En la dcada de
1980 a mediados, el IEEE comenz a desarrollar un conjunto de normas que definen
cmo Unix (y Unix) sistemas realizaran. Estas normas, conocidas formalmente como
IEEE 1003, definen los interfaces de programacin de aplicaciones (API), la cscara y
los servicios pblicos que se van a encontrar en un sistema de tipo Unix estndar. El
nombre "POSIX", que significa Interfaz de sistema operativo porttil (con la "X" se
aade al final de Snappiness extra), fue sugerido por Richard Stallman (s, que
Richard Stallman), y fue aprobado por la IEEE.
alternancia, que es la instalacin que permite a un partido que se produzca entre un conjunto
de expresiones. As como una expresin de soporte permite un solo carcter para que coincida
de un conjunto de caracteres especificados, la alternancia permite partidos a partir de un
conjunto de cadenas u otras expresiones regulares.
Para demostrarlo, vamos a utilizar grep en conjunto con eco. En primer lugar, vamos a tratar
de una llanura partido cadena antigua:

[Me @ linuxbox ~] $ echo "AAA" AAA


[Me @ linuxbox ~] $ echo
"acreditacin" [me @ linuxbox ~] $

grep AAA
grep AAA

Un ejemplo bastante sencillo, en el que canalizar la salida de eco en grep y ver los resultados.
Cuando se produce una coincidencia, lo vemos impreso; cuando se produce ninguna
coincidencia, no vemos resultados.
Ahora vamos a aadir la alternancia, significada por el meta-carcter vertical de la barra:
Aqu vemos la expresin regular 'AAA | BBB', lo que significa que "corresponde a ninguno de
[Me @ linuxbox ~] $ echo AAA 1 grep -E 'AAA |
AAA
"
BBB'
[Me @ linuxbox ~] $ echo Acre 1 grep -E 'AAA |
ditac
BBB'
acreditacin
in
"
CCC
'AAA |
[Me @ linuxbox ~] $ echo
1 grep -E BBB'
"
[me @ linuxbox ~] $
la AAA cuerda o la cadena de la acreditacin." Tenga en cuenta que dado que esta es una
caracterstica extendida, hemos aadido la -E

255

19 - Expresiones regulares opcin a grep (aunque podramos haber utilizado el programa


[Me @ linuxbox ~] $ echo "AAA" | grep -E 'AAA | BBB | CCC'
AAA
egrep lugar), y que encierra la expresin regular entre comillas para evitar que el shell
interprete el meta-carcter vertical de la barra como un operador de la tubera. Alternando no
se limita a dos opciones:

[Me @ linuxbox ~] $ grep -Eh 'A (BZ | gz | zip)' listadir * .txt


Para combinar la alternancia con otros elementos de expresiones regulares, podemos utilizar
() para separar la alternancia:
Esta expresin coincidir con los nombres de archivo en nuestras listas que comienzan con
[Me @ linuxbox ~] $ grep -Eh 'Abz | gz | zip' listadir * .txt
cualquiera "BZ", "gz", o "zip". Si hubiramos dejamos los parntesis, el significado de esta
expresin regular:
cambios para que coincida con cualquier nombre de archivo que comienza con "BZ" o contiene
"gz" o contiene "zip".

Cuantificadores
Expresiones regulares extendidas soportan varias formas de especificar el nmero de veces
que un elemento se corresponde.

? - Un ajuste de cero elemento o Una Hora


Esto significa cuantificador, en efecto, "Hacer que el elemento anterior opcional". Digamos que
queramos comprobar un nmero de telfono para la validez y hemos considerado un nmero
de telfono para ser vlido si coincide alguna de estas dos formas:
(Nnn) nnn-nnnn
nnn nnn-nnnn

donde "n" es un nmero. Podramos construir una expresin regular de esta manera: A \ ([0-9]
[0-9] [0-9] \?)?
[0-9] [0-9] [0-9] - [0-9] [0-9] [0-9] [0-9] $
En esta expresin, seguimos los caracteres de parntesis con signos de interrogacin para
indicar que estn a emparejar cero o una vez. Una vez ms, ya que los parntesis son
normalmente metacaracteres (en ERE), que los preceden con barras invertidas para hacer que
ser tratados como literales en lugar.
256

[Me @ linuxbox ~] $ echo "(555) 123-4567" | (? [0-9] [0-9] [0-9] \) grep -E 'A \? [0-9] [0-9]
[0-9] - [0-9] [0-9] [0-9] [0-9] $ '
(555) 123-4567
[Me @ linuxbox ~] $ echo "555 123-4567" | grep -E 'A \ (? [0-9] [0-9] [0-9] \)? [0-9] [0-9] [0-9]
- [0-9] [0-9] [0-9] [0-9] $ '
555 123-4567
[Me @ linuxbox ~] echo $ "AAA 123-4567" | grep -E 'A \ (? [0-9] [0-9] [0-9] \)? [0-9] [0-9]
[0-9] - [0-9] [0-9] [0-9] [0-9] $ '
[Me @ linuxbox ~] $
Cuantificadores
Vamos a intentarlo:
Aqu vemos que la expresin coincide con las dos formas del nmero de telfono, pero no
coincide con uno que contiene caracteres no numricos.

* - Un ajuste de cero Elemento o ms veces


Al igual que el? metacaracter, el * se utiliza para denotar un elemento opcional; Sin embargo, a
diferencia del?, el elemento se puede producir cualquier nmero de veces, no slo una vez.
Digamos que queramos ver si una cadena era una sentencia; es decir, que comienza con una
letra mayscula, a continuacin, contiene cualquier nmero de letras y espacios en
maysculas y minsculas, y termina con un punto. Para que coincida con esta definicin (muy
[Me @ linuxbox ~] $ echo "Esto funciona." | Grep -E '[[: upper:]] [[: upper:] [: lower:]] * \.'
Esto funciona.
[Me @ linuxbox ~] $ echo "Esto funciona." | Grep -E '[[: upper:]] [[: upper:] [: lower:]] * \.'
Esto funciona.
[Me @ linuxbox ~] $ echo "Esto no" | grep -E '[[: upper:]]. [[: Upper:] [: lower:]] * \'
[Me @ linuxbox ~] $
crudo) de una frase, podramos usar una expresin regular de esta manera:
[[: Upper:]] [[: upper:] [: lower:]] * \.
La expresin se compone de tres elementos: una expresin que contiene el soporte [: upper:]
clase de caracteres, una expresin entre corchetes que contiene tanto el [: upper:] y [: lower:]
clases de personajes y un espacio, y un perodo escaparon con una barra invertida . El segundo
elemento se desvaneci con un * metacaracter, por lo que despus de la letra mayscula de
liderazgo en nuestra sentencia, cualquier nmero de letras y espacios en maysculas y
minsculas puede seguirlo y an coincidir:
La expresin coincide con las dos primeras pruebas, pero no el tercero, ya que carece de la
necesaria
257

19 - Expresiones regulares __________________________________________________________

[Me @ linuxbox ~] $ echo "Esto que" | grep -E 'A (? [[: Alpha:]] +) + $'
Esto que
[Me @ linuxbox ~] $ echo "abc" | grep -E 'A (? [[: Alpha:]] +) + $'
abc
[Me @ linuxbox ~] $ echo "ab 9" | grep -E 'A ([[: alpha:]]? +) + $' [Me @ linuxbox ~] $
echo "abc d" | grep -E 'A ([[: alpha:]]? +) + $ '
[Me @ linuxbox ~] $
lder carcter en mayscula y posterior perodo.

+ - Un elemento de ajuste de una o ms veces


El + metacaracter funciona como el *, excepto que requiere por lo menos una instancia del
elemento anterior a causa de un partido. Aqu es una expresin regular que slo igualar
lneas que consisten en grupos de uno o ms caracteres alfabticos separados por espacios:
A ([[: alpha:]]? +) + $
Vemos que esta expresin no coincide con la lnea de "ab 9", ya que contiene un carcter no
alfabtico; ni tampoco coincide con "ABC D", porque ms de un carcter de espacio que separa
a los caracteres "c" y "d".

{} - Partido Un elemento Un nmero especfico de veces


Los {} y metacaracteres se utilizan para expresar los nmeros mnimo y mximo de partidos
requeridos. Pueden especificarse de cuatro maneras posibles:
Tabla 19-3: Especificar el nmero de partidos
Prescripcin

Significado

{N}

Coincidir con el elemento anterior si ocurre exactamente n veces.

{N, m}

Coincidir con el elemento anterior si ocurre al menos n veces, pero no


ms de m veces.

{N,}
{, M}

Coincidir con el elemento anterior si ocurre n veces o ms.


Coincidir con el elemento anterior si se produce no ms de m veces.

Volviendo a nuestro ejemplo anterior con los nmeros de telfono, podemos utilizar este
mtodo para especificar repeticiones para simplificar nuestra expresin regular original: A \
(? [0-9] [0-9] [0-9] \)?
[0-9] [0-9] [0-9] - [0-9] [0-9] [0-9] [0-9] $
258

[Me @ linuxbox ~] $ echo "(555) 123-4567" | (? [0-9] {3} \) grep -E 'A \? [0- 9] {3} - [0-9] {4}
$'
(555) 123-4567
[Me @ linuxbox ~] $ echo "555 123-4567" | grep -E 'A \ ([0-9] {3} \?)? [0-9] {3} - [0-9] {4} $ '
555 123-4567
[Me @ linuxbox ~] $ echo "5555 123-4567" | (? [0-9] {3} \) grep -E 'A \? [0-9] {3} - [0-9] {4} $
'
[Me @ linuxbox ~] $
Cuantificadores
a:
La

\ (? [0-9] {3} \)?

[0-9] {3} - [0-9] {4} $

Vamos a intentarlo:

Como podemos ver, nuestra expresin revisada puede validar correctamente los nmeros con
y sin los parntesis, al tiempo que rechaza esos nmeros que no tienen el formato correcto.

Poner expresiones regulares para trabajar


Echemos un vistazo a algunos de los comandos que ya conocemos y vemos la forma en que se
pueden utilizar con las expresiones regulares.

La validacin de una lista de telfonos con grep


En nuestro ejemplo anterior, nos fijamos en los nmeros de telfono individuales y los
registramos en el formato adecuado. Un escenario ms realista sera la comprobacin de una
lista de nmeros en lugar, por lo que vamos a hacer una lista. Haremos esto recitando un
[Me @ linuxbox ~] $ for i in {1..10}; hacer eco "($ {RANDOM: 0: 3}) {$ RANDO M: 0: 3} $ {RANDOM: 0: 4}" >> phonelist.txt; hecho
conjuro mgico para la lnea de comandos. Ser la magia porque no hemos cubierto la mayor
parte de los comandos involucrados, pero no se preocupe. Vamos a llegar en los prximos
captulos. Aqu est el encantamiento:
Este comando producir un archivo llamado phonelist.txt contiene diez nmeros de telfono.
Cada vez que el comando se repite, se aaden otros diez nmeros a la lista. Tambin podemos
cambiar el valor 10 cerca del comienzo de la orden para producir un nmero ms o menos
telefnicas. Si examinamos el contenido del archivo, sin embargo, vemos que tenemos un
problema:

259

[Me @ linuxbox ~] $ phonelist.txt gato


(232)
298-2265
(624)
381-1078
(540)
126-1980
(874)
163-2885
(286)
254-2860
(292)
108-518
(129)
44-1379
(458) 273 a
1642 (686 )
299-8268
(198)
307-2440
[Me @ linuxbox ~] $ grep -ev 'A \ ([0-9] {3} \) [0-9] {3} - [0-9] {4} $'
phonelist.txt
(292) 108-518
(129) 44-1379
[me @ linuxbox
~] $
19 - Expresiones regulares
Algunos de los nmeros son malformado, lo cual es perfecto para nuestros propsitos, ya que
vamos a utilizar grep para validarlos.
Un mtodo til de validacin sera para escanear el archivo para los nmeros no vlidos y
mostrar la lista de resultados en la pantalla:
Aqu se utiliza la opcin -v para producir una coincidencia inversa para que nos slo de salida
de las lneas de la lista que no concuerdan con la expresin especificada. La expresin en s
incluye los metacaracteres de anclaje en cada extremo para asegurarse de que el nmero no
tiene caracteres adicionales en cada extremo. Esta expresin tambin requiere que los
parntesis estn presentes en un nmero vlido, a diferencia de nuestro telfono ejemplo
nmero anterior.

Encontrar nombres de archivo Feo con Buscar


El comando find soporta una prueba basada en una expresin regular. No es una
consideracin importante a tener en cuenta al utilizar expresiones regulares en hallazgo frente
a grep. Mientras que grep se imprimirn una lnea cuando la lnea contiene una cadena que
coincide con una expresin, requiere encontrar que la ruta de acceso que coincida exactamente
con la expresin regular. En el siguiente ejemplo, utilizaremos encontrar con una expresin
regular para encontrar cada nombre de ruta que contenga cualquier carcter que no sea un
miembro del siguiente conjunto:
[-_. / 0-9a-zA-Z]
Una exploracin Tal revelara los nombres de ruta que contengan espacios incrustados y otros
personajes potencialmente ofensivos:

260

[Me @ linuxbox ~] $ localizar --regex 'bin / (BZ | gz | zip)'


/ Bin / bzcat
/ Bin / bzcmp
/ Bin / bzdiff
/[Me
Bin @
/ bzegrep
linuxbox ~] $ encuentro. -regex '. * [A -_. / 0-9a-zA-Z]. *'
/ Bin / bzexe
/ Bin / bzfgrep
/ Bin / bzgrep
/ Bin / bzip2
/ Bin / bzip2recover
/ Bin / bzless
/ Bin / zmore
/ Bin / gzexe
/ Bin / gzip
/ Usr / bin / zip
/ Usr / bin / zipcloak
/ Usr / bin / zipgrep
/ Usr / bin / zipinfo
/ Usr / bin / zipnote
/ Usr / bin / zipsplit
Poner expresiones regulares para trabajar
Debido a la exigencia de una coincidencia exacta de toda la ruta, que utilizamos. * En ambos
extremos de la expresin para que coincida con cero o ms instancias de cualquier carcter. En
el medio de la expresin, se utiliza un soporte de expresin negada contiene nuestro conjunto
de caracteres pathname aceptables.

La bsqueda de archivos con ubicar


El programa apoya a localizar tanto bsica (la opcin - -regexp) y extendida (la opcin --regex)
las expresiones regulares. Con l, podemos realizar muchas de las mismas operaciones que
hemos realizado anteriormente con nuestros archivos DirList:
El uso de la alternancia, llevamos a cabo una bsqueda de nombres de rutas que contienen ya
sea bin / BZ, bin / gz, o / bin / zip.

Bsqueda de texto con menos y vim


m e n o s vim y ambos comparten el mismo mtodo de bsqueda de texto. Al pulsar la tecla /
seguida de una expresin regular ser realizar una bsqueda. Si usamos menos para ver
nuestro archivo phonelist.txt:

261

19 - Expresiones regulares
a continuacin, busque nuestra expresin de validacin:
m e n o s pondr de relieve las cadenas que coinciden, dejando a los no vlidos fciles de
[Me @ linuxbox ~] $ Menos phonelist.txt
(232)
2
( 29382- 2
) 265
(269284- 2
) 265
(368214- 1
) 078
( 58410- 1
) 078
3
(152460- 1
) 980
(18
) 9108-518
227
964
2- 1
80
1
6
3
2
885
(129)
( 8 7 4 )44-1379
(126836- 2
) 885
(225846- 2
) 860
( 25942- 2
) 816008 - 5 1 8
2
(129) 44-1379
(458) 273 a
6 4\2 ([0-9]
( 6 8 6{3} )\) [0-9] {3} - [0-9] {4}
/1A
299-8268
$(Fin)
(198)
307-2440

detectar:
v i m , por otra parte, apoya las expresiones regulares bsicas, por lo que nuestra expresin de
bsqueda se vera as:
/ ([0-9] \ {3 \}) [0-9] \ {3 \} - [0-9] \ {4 \}
Podemos ver que la expresin es en su mayora de la misma; Sin embargo, muchos de los
personajes que se consideran metacaracteres en las expresiones extendidas son considerados
en los literales de expresiones bsicas. Ellos slo son tratados como metacaracteres cuando
escapado con una barra invertida. De262

_______________________________________________ Poner
trabajar

expresiones

regulares

para

en espera de la configuracin particular de vim en nuestro sistema, se resaltar el juego. Si no,


pruebe este comando modo de comando:
: Hlsearch
para activar la bsqueda resaltado.

Nota: Dependiendo de su distribucin, vim puede o no es compatible con el texto


resaltado de esta categora. Ubuntu, en particular, suministra una versin muy
reducida de vim por defecto. En tales sistemas, es posible que desee utilizar el gestor de
paquetes para instalar una versin ms completa de vim.

Resumiendo
[Me @ linuxbox ~] $ cd / usr / share / man / MANL
[Me @ linuxbox man1] $ zgrep -El 'regex | expresin regular' * .gz
En este captulo, hemos visto algunos de los muchos usos de las expresiones regulares.
Podemos encontrar an ms si utilizamos expresiones regulares para buscar aplicaciones
adicionales que los utilizan. Podemos hacerlo mediante la bsqueda en las pginas de manual:
El programa zgrep proporciona un front-end para grep, lo que le permite leer archivos
comprimidos. En nuestro ejemplo, buscamos la seccin de un hombre archivos de pginas
comprimidas en su ubicacin habitual. El resultado de este comando es una lista de los
archivos que contienen la cadena "expresiones regulares" o "expresin regular". Como
podemos ver, las expresiones regulares se presentan en una gran cantidad de programas.
Hay una caracterstica que se encuentra en las expresiones regulares bsicas que no cubrimos.
Llamado de nuevo las referencias, esta funcin se discutir en el siguiente captulo.

Lectura adicional
Hay muchos recursos en lnea para el aprendizaje de las expresiones regulares, incluyendo
varios tutoriales y hojas de trucos.
Adems, la Wikipedia tiene buenos artculos sobre los siguientes temas de fondo:

POSIX: http://en.wikipedia.org/wiki/Posix

ASCII: http://en.wikipedia.org/wiki/Ascii

263

20 - Procesamiento de Texto

20 - Procesamiento de Texto
Todos los sistemas operativos tipo Unix se basan en gran medida en los archivos de texto para
varios tipos de almacenamiento de datos. As que tiene sentido que hay muchas herramientas
para la manipulacin de texto. En este captulo, vamos a ver los programas que se utilizan
para "slice and dice" texto. En el prximo captulo, vamos a ver ms de procesamiento de
texto, centrndose en los programas que se utilizan para dar formato al texto para la impresin
y otros tipos de consumo humano.
En este captulo se volver a examinar a algunos viejos amigos y presentarnos a algunos
nuevos:

gato - Concatenar archivos e imprimir en la salida estndar

c l a s e - Ordenar las lneas de los archivos de texto

U n i q - Informe o omitir lneas repetidas

cortar - Retire las secciones de cada lnea de los archivos

p a s t a - Combinar lneas de archivos

u n i r s e - nete a las lneas de dos ficheros en un campo comn

c o m m - Comparar dos archivos ordenados lnea por lnea

d i f f - Comparar los archivos lnea por lnea

p a r c h e - Aplicar un archivo diff a un original

tr - Traducir o eliminar caracteres

SED - editor de flujo para el filtrado y la transformacin de texto

a s p e l l - Hechizo Interactivo corrector

Aplicaciones De Texto
Hasta ahora, hemos aprendido un par de editores de texto (nano y vim), mir a un montn de
archivos de configuracin, y hemos sido testigos de la salida de decenas de comandos, todo
ello en el texto. Pero qu otra cosa se utiliza para texto? Por muchas cosas, resulta que.

264

Aplicaciones De Texto

Documentos
Muchas personas escriben documentos utilizando los formatos de texto sin formato. Si bien es
fcil ver cmo un pequeo archivo de texto que puede ser til para mantener las notas
simples, tambin es posible escribir grandes documentos en formato de texto, tambin. Un
mtodo popular es escribir un documento de gran tamao en un formato de texto y luego usar
un lenguaje de marcas para describir el formato del documento final. Muchos trabajos
cientficos se escriben utilizando este mtodo, ya que los sistemas de procesamiento de texto
basados en Unix fueron de los primeros sistemas que apoyaron el diseo tipogrfico avanzado
que necesitan los escritores en las disciplinas tcnicas.

Pginas Web
Tipo ms popular del mundo de documento electrnico es probablemente la pgina web. Las
pginas Web son documentos de texto que utilizan ya sea HTML (Hypertext Markup
Language) o XML (Extensible Markup Language) como lenguajes de marcas para describir el
formato visual del documento.

Correo electrnico
El correo electrnico es un medio intrnsecamente basado en texto. Incluso los archivos
adjuntos no son de texto se convierten en una representacin de texto para su transmisin.
Esto lo podemos ver por nosotros mismos mediante la descarga de un mensaje de correo
electrnico y luego verlo en menos. Veremos que el mensaje comienza con una cabecera que
describe la fuente del mensaje y el tratamiento que recibi durante su viaje, seguido por el
cuerpo del mensaje con su contenido.

Salida de impresora
En los sistemas Unix, salida con destino a una impresora se enva como texto sin formato o, si
la pgina contiene grficos, se convierte en un formato de texto de descripcin de pgina
conocido como PostScript, que se enva a un programa que genera los puntos grficos para se
va a imprimir.

Programa de Cdigo Fuente


Muchos de los programas de lnea de comandos que se encuentran en los sistemas de tipo
Unix fueron creados para apoyar los programas de administracin de sistemas y desarrollo de
software y procesamiento de texto no son una excepcin. Muchos de ellos estn diseados
para resolver los problemas de desarrollo de software. El procesamiento razn texto es
importante para los desarrolladores de software es que todo el software comienza como texto.
El cdigo fuente, la parte del programa que el programador escribe en realidad, est siempre
en formato de texto.

Revisando algunos viejos amigos


De vuelta en el captulo 6 (redireccin), nos enteramos de algunos comandos que son capaces
de ac265

20 - Procesamiento de Texto concepto de entrada estndar, adems de comando argumentos


de la lnea. Nosotros slo tocamos brevemente a continuacin, pero ahora vamos a echar un
vistazo ms de cerca la forma en que se pueden utilizar para llevar a cabo el procesamiento de
textos.

gato
El programa gato tiene un nmero de opciones interesantes. Muchos de ellos se utilizan para
ayudar a visualizar mejor el contenido del texto. Un ejemplo es la opcin -A, que se utiliza
para mostrar los caracteres no imprimibles en el texto. Hay momentos en los que queremos
saber si los caracteres de control estn integrados en nuestro texto de otra manera visible. El
ms comn de estos son caracteres de tabulacin (por oposicin a los espacios) y retornos de
carro, a menudo se presentan como caracteres de fin de lnea en archivos de texto al estilo de
MS DOS. Otra situacin comn es un archivo que contiene lneas de texto con espacios finales.
Vamos a crear un archivo de prueba utilizando gato como un procesador de palabra primitiva.
Para ello, slo tendremos que entrar en el comando cat (junto con la especificacin de un
archivo para la salida redirigida) y tecleamos nuestro texto, seguido de Enter para terminar
[Me @ linuxbox ~] $ cat> foo.txt
El rpido zorro marrn salt sobre el perro perezoso. [Me
@ linuxbox ~] $
correctamente la lnea, a continuacin, Ctrl-d, para indicar al gato que hemos llegado al final
-de-archivo. En este ejemplo, entramos en un protagonista pestaa y seguimos la lnea con
algunos espacios finales:
A continuacin, vamos a utilizar el gato con la opcin -A para mostrar el texto:
[Me @ linuxbox ~] $ cat -A foo.txt
LaI El rpido zorro marrn salt sobre el perro perezoso.
[Me @ linuxbox ~] $

Como podemos ver en los resultados, el carcter de tabulacin en nuestro texto es


representado por la IA. Esta es una notacin comn que significa "Control-I", que, como
resulta ser, es lo mismo que un carcter de tabulacin. Tambin vemos que un $ aparece en el
verdadero fin de la lnea, lo que indica que nuestro texto contiene espacios finales.

266

MS-DOS Vs. Texto Unix Texto


Una de las razones es posible que desee utilizar el gato para buscar caracteres no
imprimibles en el texto es de ver retornos de carro ocultos. De dnde proceden los
retornos de carro ocultos vienen? DOS y Windows! Unix y DOS no definen el final de
una lnea de la misma manera en archivos de texto. Unix termine una lnea con un
carcter de avance de lnea (ASCII 10), mientras que MS-DOS y sus derivados utilizan
la secuencia de retorno de carro (ASCII 13) y salto de lnea para terminar cada lnea de
texto.
Hay varias formas de convertir archivos de DOS a formato Unix. En muchos sistemas
Linux, existen programas llamados dos2unix y unix2dos, que puede convertir
archivos de texto hacia y desde formato DOS. Sin embargo, si usted no tiene nix
dos2uen su sistema,
no sefoo.txt
preocupe.
[Me
@ linuxbox
~] $ cat>
El El proceso de conversin de texto de DOS a
zorro
marrn
rpido
formato
Unix
es muy simple; simplemente consiste en la eliminacin de los retornos
de carro infractor. Esto se logra fcilmente por un par de los programas discutidos
mssobre
adelante
en este
captulo.
salt
el perro
perezoso.
[Me @ linuxbox
~] $ cat -ns foo.txt
1
El zorro marrn rpido
2
3
salt sobre el perro perezoso.
[Me @ linuxbox ~] $
Revisando algunos viejos amigos
gato tambin tiene opciones que se utilizan para modificar el texto. Los dos ms destacados
son -n, qu nmeros de lneas, y -s, que suprime la produccin de mltiples lneas en blanco.
Podemos demostrar de esta manera:
En este ejemplo, se crea una nueva versin de nuestro archivo de prueba foo.txt, que contiene
dos lneas de texto separado por dos lneas en blanco. Despus del procesamiento por gato con
las opciones - ns, la lnea en blanco adicional se elimina y las lneas restantes estn contados. Si
bien esto no es gran parte de un proceso para llevar a cabo en el texto, es un proceso.

clase
El programa sort ordena el contenido de la entrada estndar, o uno o ms archivos
especificados en la lnea de comandos, y enva los resultados a la salida estndar. Utilizando la
misma tcnica que se utiliz con el gato, podemos demostrar el procesamiento de la entrada
estndar directamente desde el
267

20 - Procesamiento
de Texto teclado:

[Me @ linuxbox ~] $ Sort> foo.txt


c
b
un
[Me @ linuxbox ~] $ Foo.txt gato
un
b
c
Despus de introducir el comando, escribimos las letras "C", "B" y "A", seguido de nuevo por
Ctrl-d para indicar fin de archivo. A continuacin, ver el archivo resultante y vemos que las
lneas aparecen ahora en forma ordenada.
Desde especie puede aceptar mltiples archivos en la lnea de comandos como argumentos, es
posible combinar varios archivos en un todo ordenado. Por ejemplo, si tuviramos tres
archivos de texto y quera combinarlos en un nico archivo ordenado, podramos hacer algo

Ordenar file1.txt fil e2.t xt file3.txt> final_sorted_list.txt

como esto:

c l a s e tiene varias opciones interesantes. Aqu est una lista parcial:


Tabla 20-1: Opciones ordenar Comn
Opcin
-b

Largo Opcin
--ignore lder-espacios en
blanco

-f
-n

--ignore caso
--numeric-tipo

268

Descripcin
Por defecto, la clasificacin se realiza
en toda la lnea, comenzando con el
primer carcter de la lnea. Esta
opcin hace que tipo de ignorar los
espacios iniciales de las lneas y
calcula la clasificacin basada en la
primera no est en blanco en la lnea.
Hace que la clasificacin entre
maysculas y minsculas.
Realiza la clasificacin basan en la
evaluacin numrica de una cadena.
El uso de esta opcin permite ordenar
que se realice en los valores numricos
en lugar de valores alfabticos.

Revisando algunos viejos amigos


-r
--reverse

Ordenar en orden inverso. Los


resultados son en orden descendente
en lugar de orden ascendente.
-k
--key = fieldl [, campo2]
Ordenar basado en un campo clave se
encuentra desde fieldl al campo2 en
lugar de toda la lnea. Vase la
discusin
a continuacin.
Tratar a cada
argumento como el
-m
--merge
nombre
de un archivo preclasificado. Combinar mltiples archivos en un solo resultado ordenados
sin realizar ninguna seleccin adicional.
-o
--output = archivo

-t

--field-separador = Char

Enviar salida ordenada a presentar en


lugar de la salida estndar.
Defina el campo-separador
personaje. Por campos
predeterminados
son o tabuladores.
separados por espacios

Aunque la mayor parte de las opciones anteriores son bastante explica por s mismo, algunos
no lo son. En primer lugar, echemos un vistazo a la opcin -n, que se utiliza para la
clasificacin numrica. Con esta opcin, es posible ordenar los valores basados en valores
numricos. Podemos demostrar esto mediante la clasificacin de los resultados del comando
du para determinar los mayores usuarios de espacio en disco. Normalmente, el comando du
recoge los resultados de un resumen en orden nombre de ruta:

[Me @ linuxbox ~] $ du -s / usr / share / * | cabeza


252
/ Usr / share / aclocal
96
/ Usr / share / acpi-support
8
/ Usr / share / adduser
196
/ Usr / share / alacarte
344
/ Usr / share / alsa
/ Usr / share / alsa-base
8
12488
/ Usr / share / anthy
/ Usr / share / apmd
8
21440
/ Usr / share / app-install
48
/ Usr / share / solicitud-registro
En este ejemplo, canalizar los resultados en la cabeza para limitar los resultados a las diez
primeras lneas. Podemos producir una lista ordenada numricamente para mostrar los diez
mayores consumidores de espacio de esta manera:

269

20 - Procesamiento de Texto
[Me @ linuxbox ~] $ du -s / usr / share / * | sort -nr | cabeza
509940
/ Usr / share / locale-langpack
242660
/ Usr / share / doc
197560
/ Usr / share / fonts
179144
/ Usr / share / gnome
146764
/ Usr / share / myspell
144304
/ Usr / share / gimp
135880
/ Usr / share / dict
76508
/ Usr / share / icons
68072
/ Usr / share / apps
62844
/ Usr / share / foomatic
Mediante el uso de las opciones -NR, producimos un tipo numrico inverso, con los valores
ms grandes que aparece por primera vez en los resultados. Este tipo funciona porque los
valores numricos se producen al comienzo de cada lnea. Pero qu pasa si queremos ordenar
una lista en base a un valor que se encuentra dentro de la lnea? Por ejemplo, los resultados de
un ls -l:
[Me @ linuxbox ~] $ ls -l / usr / bin | altura total de 152.948
-rwxr-xr-x
raz
34824 2008-04-04
1 raz
-rwxr-xr-x
1 raz
raz
101556 2007-11-27
-rwxr-xr-x
raz
13036 2008-02-27
1 raz
-rwxr-xr-x
1 raz
raz
10552 2007-08-15
-rwxr-xr-x
raz
3800 2008-04-14
1 raz
-rwxr-xr-x
raz
7536 2008-04-19
1 raz
-rwxr-xr-x
raz
3576 2008-04-29
1 raz
-rwxr-xr-x
raz
1 raz
20808 2008-01-03
-rwxr-xr-x
raz
489704 2008-10-09
1 raz

02
06
08
10
03
00
07
18
17

42
08
22
34
51
19
57
02
02

a2p
aconnect
acpi
acpi_fakekey
acpi_listen
addpart
addr2line
adept_batch

Haciendo caso omiso, por el momento, que ls pueden ordenar sus resultados por tamao,
podramos usar sort para ordenar esta lista por tamao del archivo, as:
[Me @ linuxbox ~] $ ls -l / usr / bin | sort -k -nr 5 | cabeza
-rwxr-xr-x
raz
8234216 2008-04-07
1 raz
-rwxr-xr-x
raz
8222692 2008-04-07
1 raz
-rwxr-xr-x
1 raz
raz
3746508 2008-03-07
-rwxr-xr-x
raz
3654020 2008-08-26
1 raz
-rwxr-xr-x
raz
2928760 2008-09-10
1 raz
-rwxr-xr-x
raz
2928756 2008-09-10
1 raz
-rwxr-xr-x
1 raz
raz
2602236 2008-10-10
-rwxr-xr-x
raz
2304684 2008-10-10
1 raz
-rwxr-xr-x
raz
2241832 2008-04-04
1 raz
-rwxr-xr-x
1 raz
raz
2202476 2008-10-10

270

17
17
23
16
14
14
12
12
05
12

42
42
45
16
31
31
56
56
56
56

inkscape
inkview
gimp-2.4
quanta
gdbtui
gdb
neto
rpcclient
aptitud
smbcacls

Revisando algunos viejos amigos


Muchos usos de tipo implican el tratamiento de datos tabulares, como los resultados de las ls
comando anterior. Si aplicamos la terminologa de bases de datos para la tabla de arriba,
diramos que cada fila es un registro y cada registro que consiste en mltiples campos, como
los atributos de archivo, nmero de enlaces, nombre de archivo, tamao del archivo y as
sucesivamente. especie es capaz de procesar los campos individuales. En trminos de base de
datos, podemos especificar uno o ms campos clave para usar como claves de ordenacin. En
el ejemplo anterior, especificamos los n y r opciones para llevar a cabo una especie numrico
inverso y especificar -k 5 para hacer una especie utilizar el quinto campo como la clave para la
clasificacin.
La opcin k es muy interesante y tiene muchas caractersticas, pero primero tenemos que
hablar de cmo define especie campos. Consideremos un archivo de texto muy simple que
William Shotts
consiste en una sola lnea que contiene el nombre del autor:
Por defecto, se ve una especie de esta lnea tiene dos campos. El primer campo contiene los
caracteres:
"William"
y el segundo campo contiene los caracteres:
"Shotts"
lo que significa que los caracteres de espacio en blanco (espacios y tabulaciones) se utilizan
como delimitadores entre campos y que los delimitadores se incluyen en el campo cuando se
realiza la clasificacin.
-rwxr-xr-x 1 root root 8234216 2008-04-07 17:42 inkscape
Mirando de nuevo en una lnea desde nuestra salida de ls, podemos ver que una lnea contiene
ocho campos y que el quinto campo es el tamao de archivo:
Para nuestra prxima serie de experimentos, vamos a considerar el siguiente archivo que
contiene la historia de las tres distribuciones de Linux ms populares lanzados entre 2006 y
2008. Cada lnea del archivo tiene tres campos: el nombre de la distribucin, nmero de
versin y fecha de lanzamiento en MM / DD / AAAA formato:
SUSE
Fedora
SUSE
Ubuntu
Fedora
SUSE

10.2 12/07/2006
11/25/2008
10
11.0 06.19.2008
8.04 24.04.2008
11/08/2007
8
10.3 10/04/2007

271

20 - Procesamiento de Texto
Ubuntu
Fedora
Ubuntu
Ubuntu
SUSE
Fedora
Fedora
Ubuntu
Ubuntu
Fedora

6.10 10/26/2006
7
31.05.2007
7.10 10/18/2007
7.04 04/19/2007
10.1 05/11/2006
6
10/24/2006
9
13.05.2008
6.06 06/01/2006
8.10 10/30/2008
5
03.20.2006

Con un editor de texto (tal vez vim), vamos a entrar en estos datos y el nombre del archivo
tros.txt pantalla resultante.
A continuacin, vamos a tratar de clasificar el archivo y observe los resultados:

[Me @ linuxbox ~] $ sort distros.txt


Fedora
10
11/25/2008
Fedora
5
03.20.2006
Fedora
6
10/24/2006
Fedora
7
31.05.2007
Fedora
8
11/08/2007
Fedora
9
13.05.2008
SUSE
10.1 05/11/2006
SUSE
10.2 12/07/2006
SUSE
10.3 10/04/2007
SUSE
11.0 06.19.2008
Ubuntu
6.06 06/01/2006
Ubuntu
6.10 10/26/2006
Ubuntu
7.04 04/19/2007
Ubuntu
7.10 10/18/2007
Ubuntu
8.04 24.04.2008
Ubuntu
8.10 10/30/2008
Bueno, funcion en su mayora. El problema se produce en la clasificacin de los nmeros de
versin de Fedora. Puesto que un "1" viene antes de un "5" en el juego de caracteres, la versin
"10" termina en la parte superior, mientras que la versin "9" cae al fondo.
Para solucionar este problema vamos a tener que ordenar en varias claves. Queremos realizar
una especie alfabtico en el primer campo y luego una ordenacin numrica en el segundo
campo. tipo permite varias instancias de la opcin -k para que mltiples claves de ordenacin
se pueden especificar. De hecho, una llave puede incluir una variedad de campos. Si no se
especifica ningn rango (como ha sido el caso con nuestros ejemplos anteriores), utiliza una
clave de clase que comienza con el campo especificado y se extiende hasta el final de la lnea.
Aqu es la sintaxis para nuestra clase multi-clave:

272

Revisando algunos viejos amigos


[Me @ linuxbox ~] $ sort --key = 1,1 --key = 2n distros.txt
Fedora
5
03.20.2006
Fedora
10/24/2006
6
Fedora
7
31.05.2007
Fedora
8
11/08/2007
Fedora
9
13.05.2008
Fedora
11/25/2008
10
SUSE
10.1 05/11/2006
SUSE
10.2 12/07/2006
SUSE
10.3 10/04/2007
SUSE
11.0 06.19.2008
Ubuntu
6.06 06/01/2006
Ubuntu
6.10 10/26/2006
Ubuntu
7.04 04/19/2007
Ubuntu
7.10 10/18/2007
Ubuntu
8.04 24.04.2008
Ubuntu
8.10 10/30/2008
Aunque hemos utilizado la forma larga de la opcin por la claridad, -k 1,1 -k 2n sera
exactamente equivalente. En la primera instancia de la opcin fundamental, especificamos una
serie de campos a incluir en la primera clave. Ya que queramos limitar el tipo de slo el
primer campo, especificamos 1,1 lo que significa "comenzar en el campo uno y el final en el
campo de uno." En el segundo caso, especificamos 2n, lo que significa que el campo 2 es la
clave de ordenacin y que la especie debe ser numrico. Una letra de opcin puede ser
incluido al final de un especificador de clave para indicar el tipo de especie a realizar. Estas
letras de opciones son las mismas que las opciones globales para el programa tipo: b (ignorar
espacios a la izquierda), n (tipo numrico), R (marcha atrs especie), y as sucesivamente.
El tercer campo en nuestra lista contiene una fecha en un formato incmodo para la
clasificacin. En los equipos, las fechas se suelen formateados con el fin AAAA-MM-DD para
hacer la clasificacin cronolgica fcil, pero la nuestra estn en el formato americano de MM /
DD / AAAA. Cmo podemos clasificar esta lista en orden cronolgico?
Afortunadamente, una especie proporciona una manera. La opcin de clave permite la
especificacin de las compensaciones dentro de los campos, por lo que podemos definir claves
dentro de los campos:

[Me @ linuxbox ~] $ sort -k 3.7nbr -k -k 3.1nbr 3.4nbr distros.txt


Fedora
11/25/2008
10
Ubuntu
8.10 10/30/2008
SUSE
11.0 06.19.2008
Fedora
9
13.05.2008
Ubuntu
8.04 24.04.2008
Fedora
11/08/2007
8
Ubuntu
7.10 10/18/2007
SUSE
10.3 10/04/2007
Fedora
7
31.05.2007

273

20 - Procesamiento de Texto
Ubuntu
7.04 04/19/2007
SUSE
10.2 12/07/2006
Ubuntu
6.10 10/26/2006
Fedora
10/24/2006
6
Ubuntu
6.06 06/01/2006
SUSE
10.1 05/11/2006
Fedora
5
03.20.2006
[Me @ linuxbox ~] $ cabeza / etc / passwd
root: x: 0: 0: root: / root: / bin / bash
demonio: x: 1: 1: demonio: / usr / sbin: / bin / sh
bin: x: 2: 2: bin: / bin: / bin / sh
sys: x: 3: 3: sys: / dev: / bin / sh
sincronizacin: x: 4: 65534: sincronizacin: / bin: /
bin / sync
juegos: x: 5: 60: juegos: / usr / juegos: / bin / sh
hombre: x: 6: 12: hombre: / var / cache / man: / bin /
sh
lp: x: 7: 7: lp: / var / spool / lpd: / bin / sh
mail: x: 8: 8: e: / var / mail: / bin / sh
noticia: x: 9: 9: noticias: / var / spool / news: / bin /
sh
Al especificar -k 3,7 instruimos especie utilizar una clave de clasificacin que comienza en el
carcter sptima dentro del tercer campo, que corresponde al inicio del ao. Del mismo modo,
especificamos -k 3.1 y 3.4 -K para aislar las partes de mes y da de la fecha. Tambin vamos a
aadir los n y r opciones para lograr una ordenacin numrica inversa. La opcin B se incluye
para suprimir los espacios iniciales (cuyo nmero vara de una lnea a otra, lo que afecta el
resultado de la especie) en el campo de fecha.
[Me @ linuxbox ~] $ sort -t ':' -k 7 / etc / passwd | cabeza
me: x: 1001: 1001: Yo Mismo ,,,: / home / me: / bin / bash
root: x: 0: 0: root: / root: / bin / bash
dhcp: x: 101: 102 :: / inexistente: / bin / false
GDM: x: 106: 114: Gnome Display Manager: / var / lib / gdm: / bin / false HPLIP: x:
104: 7: HPLIP usuario del sistema ,,,: / var / run / HPLIP: / bin / false klog : x: 103:
104 :: / home / klog: / bin / false messagebus: x: 108: 119 :: / var / run / dbus: / bin /
false polkituser: x: 110: 122: PolicyKit ,,,: / var / run / PolicyKit: / bin / false
Algunos archivos no utilizan tabulaciones y espacios como delimitadores de campo; por
ejemplo, el archivo / etc / passwd:
Los campos de este archivo estn delimitadas con dos puntos (:), as que cmo podemos
resolver este archivo usando un campo clave? especie proporciona la opcin -t para definir el
carcter separador de campo. Para ordenar el archivo passwd en el sptimo campo (shell por
defecto de la cuenta), podramos hacer esto:

274

Revisando algunos viejos


amigos
pulso: x: 107: 116: demonio de PulseAudio ,,,: / var / / impulso ejecutar: / bin /
false
Al especificar el carcter de dos puntos como separador de campo, podemos clasificar en el
sptimo campo.

Uniq
En comparacin a ordenar, el programa Uniq es un peso ligero. Uniq realiza una tarea
aparentemente trivial. Cuando se administra un archivo ordenado (incluyendo la entrada
estndar), que elimina las lneas duplicadas y enva los resultados a la salida estndar. A
menudo se utiliza en conjuncin con tipo para limpiar la salida de duplicados.

Sugerencia: Mientras Uniq es una herramienta de Unix tradicional a


menudo se utiliza con clase, la versin GNU de especie soporta una
opcin - u, que elimi na los dupli cados de la salida ordenada.
Vamos a hacer un archivo de texto
para probar esto:
[Me @ linuxbox ~] $ cat> foo.txt
un
b
c
un
b
c
Recuerde que debe pulsar Ctrl-d para terminar la entrada estndar. Ahora, si corremos Uniq
en nuestro archivo de texto:

[Me @ linuxbox ~] $ foo.txt Uniq


un
b
c
un
b
c
los resultados no son diferentes de nuestro archivo original; los duplicados no se quitaron.
Para Uniq hacer realidad su trabajo, la entrada debe estar clasificado en primer lugar:

275

20 - Procesamiento de Texto
~] $ Sort foo.txt | Uniq
[Me @ linuxbox
un
b
c

Esto es porque Uniq slo elimina las lneas duplicadas que son adyacentes entre s. Uniq
tiene varias opciones. stos son los ms comunes:
Tabla 20-2: Opciones uniq comunes

Opcin
-c

Descripcin

-d
fn

-i

Slo salida repite lneas, en lugar de lneas nicas.


No haga caso de n campos principales en cada lnea. Los campos estn
separados por espacios en blanco, ya que son en especie; Sin embargo,
a diferencia de clase, Uniq tiene ninguna opcin para configurar un
separador de campo alterno.
Ignorar caso durante las comparaciones de lnea.

-s n

Salta (ignorar) los n caracteres principales de cada lnea.

Salida de una lista de las lneas duplicadas precedido por el nmero de


veces que se produce la lnea.

- u @ linuxbox ~] Slo
Este es el valor predeterminado.
[Me
$ sortsalida
foo.txtlneas
| Uniqnicas.
-c
2 a
2 b
2c
Aqu vemos Uniq utilizados para informar el nmero de duplicados que se encuentran en
nuestro archivo de texto, usando la opcin -c:

Cortar y rebanar
Los siguientes tres programas que discutiremos se utilizan para pelar columnas de texto de los
archivos y se recombinan en formas tiles.

cortada
El programa de corte se utiliza para extraer una seccin de texto de una lnea de salida y la
extrae 276

Cortar y rebanar

seccin a la salida estndar. Se puede aceptar mltiples argumentos de archivo o entrada de la


entrada estndar.
Especificacin de la seccin de la lnea que se extrae es algo torpe y se especifica el uso de las
siguientes opciones:
Tabla 20-3: cortar Opciones de seleccin
Opcin
lista_caracteres -c

-f field_list

delim_char -d

--complement

Descripcin
Se extrae la porcin de la lnea definida por lista_caracteres. La
lista puede consistir en uno o ms rangos numricos separados por
comas.
Extracto de uno o ms campos de la lnea definida por field_list. La
lista puede contener uno o ms campos o rangos de campo
separados por comas.
Cuando se especifica -f, use delim_char como el carcter de
delimitacin de campo. Por defecto, los campos deben estar
separados por un solo carcter de tabulacin.
Extraer toda la lnea de texto, excepto para aquellas partes
especificadas por -c y / o - f.

Como podemos ver, la forma de corte extractos de texto es bastante inflexible. corte se utiliza
mejor para extraer texto de archivos que se producen por otros programas, en lugar de texto
escrito directamente por los seres humanos. Vamos a echar un vistazo a nuestro archivo
distros.txt para ver si est "limpiar" lo suficiente como para ser un buen ejemplar para
nuestros ejemplos de corte. Si utilizamos gato con la opcin -A, podemos ver si el archivo
[Me @ linuxbox ~] $ cat -A distros.txt
SUSEAI10.2AI12 / 07/2006 $
FedoraAI10AI11 / 25/2008 $
SUSEAI11.0Ai06 / 19/2008 $
UbuntuAI8.04AI04 / 24/2008 $
FedoraAi8Aiii / 08/2007 $
SUSEAI10.3AI10 / 04/2007 $
UbuntuAI6.10AI10 / 26/2006 $
FedoraAi7Ai05 / 31/2007 $
UbuntuAI7.10AI10 / 18/2007 $
UbuntuAI7.04AI04 / 19/2007 $

SUSEAI10.1AI05 / II / 2006 $
FedoraAi6Aii0 / 24/2006 $
FedoraAi9Ai05 / 13/2008 $

277

cumple con nuestros requisitos de campos separados por tabuladores:

[Me @ linuxbox ~] $ cort -f 3 distros.txt


12/07/2006
11/25/2008
06.19.2008
Ubuntu ^ I6.06AI06 / 01/2006 $
24.04.2008
UbuntuAI8.10AI10 / 30/2008 $
11/08/2007
FedoraAI5AI03 / 20/2006 $
10/04/2007
10/26/2006
31.05.2007
10/18/2007
04/19/2007
05/11/2006
10/24/2006
13.05.2008
06/01/2006
10/30/2008
03.20.2006
20 - Procesamiento de Texto
Se ve bien. No hay espacios incrustados, slo caracteres de un solo tabulador entre los campos.
Dado que el archivo utiliza pestaas en lugar de espacios, vamos a utilizar la opcin -f para
extraer un campo:
Debido a que nuestros archivos distros es delimitado por tabuladores, lo mejor es utilizar
corte para extraer los campos en lugar de caracteres. Esto es porque cuando un archivo es
delimitado por tabuladores, es poco probable que cada lnea contendr el mismo nmero de
caracteres, lo que hace el clculo de posiciones de los caracteres dentro de la lnea de difcil o
imposible. En nuestro ejemplo anterior, sin embargo, ahora hemos extrado un campo que
contiene los datos por suerte de idntica longitud, por lo que podemos mostrar cmo funciona
la extraccin de caracteres mediante la extraccin del ao a partir de cada lnea:
[Me @ linuxbox ~] $ cort -f 3 distros.txt
2006
2008
2008
2008
2007
2007
2006
2007
2007
2007
2006
278

cortar -c 7-10

Cortar y rebanar
2006
2008
2006
2008
2006
Mediante la ejecucin de cortar por segunda vez en nuestra lista, somos capaces de extraer
posiciones de caracteres de 7 a 10, que corresponde al ao en nuestro campo de fecha. La
notacin 7-10 es un ejemplo de un rango. La pgina de manual de corte contiene una
descripcin completa de cmo se pueden especificar rangos.

Ampliacin Tabs
Nuestro archivo distros.txt est muy bien formateado para campos de extraccin
utilizando corte. Pero lo que si queramos un archivo que podra ser totalmente
manipulado con el corte por los personajes, en lugar de los campos? Esto nos
requerira para reemplazar los caracteres de tabulacin en el archivo con el
correspondiente nmero de espacios. Afortunadamente, el paquete GNU Coreutils
incluye una herramienta para eso. Nombrado ampliar, este programa acepta uno o
ms argumentos de archivo o entrada estndar, y emite el texto modificado a la salida
estndar.
Si procesamos nuestro archivo distros.txt con ampliar, podemos utilizar el -c corte
para extraer cualquier rango de caracteres del archivo. Por ejemplo, podramos
utilizar el siguiente comando para extraer el ao de la liberacin de nuestra lista,
mediante la ampliacin del archivo y el uso de corte para extraer todos los personajes
de la vigsimo tercera posicin al final de la lnea:
[Me @ linuxbox ~] $ ampliar distros.txt | cortar -c 23Coreutils tambin ofrece el programa unexpand sustituir pestaas para espacios.
Al trabajar con campos, es posible especificar un delimitador de campo diferente en lugar del
carcter de tabulacin. Aqu vamos a extraer el primer campo del archivo / etc / passwd:

[Me @ linuxbox ~] $ cut -d ':


raz
demonio
papelera
sys
sincronizar
juegos
hombre
lp

'-f 1 / etc / passwd | cabeza

279

corre
o
notici
as
20 - Procesamiento de Texto
El uso de la opcin -d, somos capaces de especificar el carcter de dos puntos como
delimitador de campo.

pasta
El comando de pegar hace lo contrario de corte. En lugar de la extraccin de una columna de
texto de un archivo, se aade una o ms columnas de texto en un archivo. Lo hace mediante la
lectura de varios archivos y la combinacin de los campos que se encuentran en cada archivo
en un nico flujo en la salida estndar. Al igual que cortar, pegar acepta mltiples argumentos
de archivo y / o la entrada estndar. Para demostrar cmo funciona la pasta, vamos a realizar
una ciruga en nuestro archivo distros.txt para producir una lista cronolgica de las
liberaciones.
[Me @ linuxbox ~] $ sort -k 3.7nbr -k -k 3.1nbr 3.4nbr distros.txt> dis tros por date.txt
A partir de nuestro trabajo anterior con clase, primero elaborar una lista de distribuciones
ordenadas por fecha y almacenar el resultado en un archivo llamado distros por date.txt:
A continuacin, vamos a utilizar corte para extraer los dos primeros campos del archivo (el
nombre y la versin de la distro), y la tienda que se traducen en un archivo llamado
distro-versions.txt:
[Me @ linuxbox ~] $ cortar -f 1,2 distros - BY-date.txt> distros -versions.t
xt
[Me @ linuxbox ~] $ cabeza distros -versi ons.txt
Fedora
10
Ubuntu
8.10
SUSE
11.0
Fedora
9
Ubuntu
8.04
Fedora
8
Ubuntu
7.10
SUSE
10.3
Fedora
7
Ubuntu
7.04

La pieza final de la preparacin es extraer las fechas de lanzamiento y almacenarlos en un


archivo denominado distro-dates.txt:

280

[Me @ linuxbox ~] $ cort -f 3 distros por date.txt> distros-dates.txt [me @ linuxbox ~]


$ cabeza distros-dates.txt
11/25/2008
10/30/2008
06.19.2008
13.05.2008
24.04.2008
11/08/2007
10/18/2007
10/04/2007
31.05.2007
04/19/2007
Cortar y rebanar
Ahora tenemos las piezas que necesitamos. Para completar el proceso, utilice pasta para poner
la columna de fechas por delante de los nombres y versiones de distribuciones, creando as
una lista cronolgica. Esto se hace simplemente mediante el uso de pasta y ordenando sus
argumentos en la disposicin deseada:

[Me @ linuxbox ~] $ pegar distros-dates.txt distros-versions.txt


11/25/2008 Fedora
10
10/30/2008 Ubuntu
8.10
06.19.2008 SUSE
11.0
13.05.2008 Fedora
9
24.04.2008 Ubuntu
8.04
11/08/2007 Fedora
8
10/18/2007 Ubuntu
7.10
10/04/2007 SUSE
10.3
31.05.2007 Fedora
7
04/19/2007 Ubuntu
7.04
12/07/2006 SUSE
10.2
10/26/2006 Ubuntu
6.10
10/24/2006 Fedora
6
06/01/2006 Ubuntu
6.06
05/11/2006 SUSE
10.1
03.20.2006 Fedora
5

unirse
En cierto modo, es como unirse a pegar ya que agrega columnas a un archivo, sino que utiliza
una forma nica de hacerlo. Una unin es una operacin por lo general asociados con las
bases de datos relacionales, donde los datos de varias tablas con un campo de clave
compartida se combina para formar un resultado deseado. El programa unirse realiza la
misma operacin. Se une a los datos de varios archivos en funcin de un campo de clave
compartida.
Para ver cmo se utiliza una operacin de combinacin en una base de datos relacional,
imaginemos una pequea base de datos que consta de dos mesas, cada una contiene un solo
registro. La primera tabla, llamada
281

20 - Procesamiento de Texto
CLIENTES, tiene tres campos: un nmero de cliente (CUSTNUM), en primer lugar el nombre
del cliente (FNAME), nombre y apellido del cliente (LNAME):
CUSTNUM

FNAME

LNAME

4681934

Juan

Herrero

La segunda tabla se llama PEDIDOS y contiene cuatro campos: un nmero de orden (ordenNUM), el nmero de clientes (CUSTNUM), la cantidad (QUAN), y el artculo pedido (TEMA).
NumOrden

CUSTNUM

QUAN TEMA

3014953305

4681934

Azul Widget

Tenga en cuenta que las dos tablas comparten el CUSTNUM campo. Esto es importante, ya
que permite una relacin entre las tablas.
Realizar aj oin operacin nos permitira combinar los campos en las dos tablas para lograr un
[Me @ linuxbox ~] $ corte -f 1,1 distros-BY-date.txt> distros-nombres.txt [me @ linuxbox ~]
$ pegar distros-dates.txt distros-nombres.txt> nombres clave distros- .txt
[Me @ linuxbox ~] $ cabeza distros-clave-nombres.txt
11/25/2008 Fedora Ubuntu 10/30/2008 06/19/2008 05/13/2008 SUSE Fedora Ubuntu
04/24/2008 11/08/2007 10/18/2007 Fedora Ubuntu 10/04/2007 SUSE 05 / 31/2007
04/19/2007 Fedora Ubuntu
resultado til, tales como la preparacin de una factura. Utilizando los valores coincidentes en
los campos CUSTNUM de ambas tablas, una operacin de combinacin puede producir lo
siguiente:
FNAME

LNAME

QUAN TEMA

Juan

Herrero

1 Blue Widget

Para demostrar el programa de unirse, tendremos que hacer un par de archivos con una clave
compartida. Para ello, vamos a utilizar nuestras distribuciones por date.txt archivo. A partir
de este archivo, vamos a construir dos archivos adicionales, uno que contienen las fechas de
lanzamiento (que ser nuestra clave compartida para esta demostracin) y los nombres de
liberacin:

y el segundo archivo, que contiene las fechas de lanzamiento y los nmeros de versin:
282

[Me @ linuxbox ~] $ corte -f 2,2 distros-BY-date.txt> distros-vernums.txt [me @ linuxbox ~]


$ pegar distros-dates.txt distros-vernums.txt> distro s-teclado vernums.txt
[Me @ linuxbox ~] $ cabeza distros-clave-vernums.txt
11/25/2008 10
10/30/2008
19/06/2008 8,10
11,0 05/13/2008 9
[Me @ linuxbox
04/24/2008
8,04~] uno a $ distros-clave-nombres.txt distros-clave-vernums.txt | cabeza
11/25/2008 8
Fedora 10
11/08/2007
10/30/2008 Ubuntu 8.10
10/18/2007
19.06.2008 7.10
SUSE 11.0
10/04/2007
05/13/2008
Fedora 9
10.3
05 / 31/2007
04/24/2008
Ubuntu
7
04/19/2007
7.04 8.04
11/08/2007 Fedora 8
10/18/2007 Ubuntu 7.10 10 /
04/2007 SUSE 10.3
31/05/2007 Fedora 7
04/19/2007 Ubuntu 7.04
Cortar y rebanar
Ahora tenemos dos archivos con una clave compartida (el campo "fecha de lanzamiento"). Es
importante sealar que los archivos deben ser ordenados en el campo clave para unirse
funcione correctamente.
Tenga en cuenta tambin que, por defecto, unirse utiliza un espacio en blanco como
delimitador de campo de entrada y un nico espacio como delimitador de campo de salida.
Este comportamiento puede ser modificado mediante la especificacin de las opciones.
Consulte la pgina del manual se unen para obtener ms informacin.

La comparacin de texto
A menudo es til para comparar las versiones de los archivos de texto. Para los
administradores de sistemas y desarrolladores de software, esto es particularmente
importante. Un administrador del sistema puede, por ejemplo, la necesidad de comparar un
archivo de configuracin existente a una versin anterior de diagnosticar un problema del
sistema. Del mismo modo, un programador frecuentemente necesita ver qu cambios se han
hecho a los programas a travs del tiempo.

283

20 - Procesamiento de
Texto

comm
El programa comm compara dos archivos de texto y muestra las lneas que son exclusivas de
cada uno y las lneas que tienen en comn. Para demostrarlo, vamos a crear dos archivos de
texto casi idnticos utilizando gato:

[Me @ linuxbox ~] $ cat> file1.txt


un
b
c
d
[Me @ linuxbox ~] $ cat> file2.txt
b
c
d
e
A continuacin, vamos a comparar los dos archivos
usando comm:
[Me @ linuxbox ~] $ comm file1.txt file2.txt
un
b
c
d
e
Como podemos ver, comm produce tres columnas de salida. La primera columna contiene las
lneas exclusivas para el primer argumento de archivo; la segunda columna, las lneas
exclusivas para el segundo argumento de archivo; la tercera columna contiene las lneas
compartidas por ambos archivos. comm soporta opciones en la forma -n donde n es 1, 2 3.
Cuando se usan, estas opciones especifican que co- lumna (s) de suprimir. Por ejemplo, si lo
nico que queramos a la salida de las lneas compartidas por ambos archivos, queremos
suprimir la salida de las columnas uno y dos:
[Me @ linuxbox ~] $ comm -12 file1.txt file2.txt
b
c
d

diff
Al igual que el programa de comm, diff se utiliza para detectar las diferencias entre archivos.
Sin embargo,
284

La comparacin de texto
d i f f es una herramienta mucho ms complejo, el apoyo a muchos formatos de salida y la
capacidad de procesar grandes colecciones de archivos de texto a la vez. diff es a menudo
utilizado por los desarrolladores de software para examinar los cambios entre diferentes
versiones del cdigo fuente del programa, y por lo tanto tiene la capacidad de examinar de
forma recursiva los directorios de cdigo fuente, a menudo se hace referencia como rboles de
cdigo fuente. Un uso comn de diff es la creacin de archivos diff o parches que son
utilizados por programas como el parche (que hablaremos en breve) para convertir una
versin de un archivo (o archivos) a otra versin.
Si usamos diff para mirar nuestros archivos de ejemplo anteriores:
~] $ Diff file1.txt file2.txt
[Me @ linuxbox
1d0 <a 4A4
>E

vemos su estilo por defecto de la produccin: una descripcin concisa de las diferencias entre
los dos archivos. En el formato por defecto, cada grupo de cambios est precedido por un
comando de cambio en la forma de rango de operacin rango para describir las posiciones y
los tipos de cambios necesarios para convertir el primer archivo en el segundo archivo:
Tabla 20-4: Comandos diff Cambio
Cambio
r1ar2
r1cr2
r1dr2

Descripcin
Aada las lneas en el r2 posicin en el segundo archivo de la r1 posicin
en el primer archivo.
Cambiar (reemplazar) las lneas en posicin r1 con las lneas en el r2
posicin en el segundo archivo.
Eliminar las lneas en el primer archivo en la posicin R1, que habra
aparecido en la gama r2 en el segundo archivo

En este formato, una serie es una lista separada por comas de la lnea de salida y la lnea final.
Aunque este formato es la opcin predeterminada (en su mayora para el cumplimiento
POSIX y la compatibilidad hacia atrs con versiones tradicionales de Unix diff), que no es tan
ampliamente utilizado como otros, formatos opcionales. Dos de los formatos ms populares
[Me @ linuxbox ~] $ diff -c file1.txt file2.txt
son el formato de contexto y el formato unificado.
Cuando se ve con el formato de contexto (la opcin -c), vamos a ver esto:
285

*** File1.txt
--- File2.txt

***************

*** I 4
- A
B

2008-12-23 06: 40: 13.000000000 -0500


2008-12-23 06: 40: 34.000000000 -0500

****

C
D
---

1,4 - - b
c

d
+ E
20 - Procesamiento de Texto
La salida comienza con los nombres de los dos archivos y sus marcas de tiempo. El primer
archivo est marcado con asteriscos y el segundo archivo se marca con guiones. A lo largo del
resto del establecimiento, estos marcadores se significan sus respectivos archivos. A
continuacin, vemos grupos de cambios, incluyendo el nmero predeterminado de lneas de
contexto que lo rodea. En el primer grupo, vemos:
*** 1 4 ***
que indica las lneas 1 a 4 en el primer archivo. Ms tarde vemos:
--- 1,4 -que indica las lneas 1 a 4 en el segundo archivo. Dentro de un grupo de cambio, las
lneas comienzan con uno de los cuatro indicadores:
Tabla 20-5: diff Formato Contexto de Cambio Indicadores
Indicador
blanco
+

Significado
Una lnea de muestra para el contexto. No indica una diferencia entre los
dos archivos.
Una lnea eliminado. Esta lnea aparecer en el primer archivo, pero no
en el segundo archivo.
Una lnea aadi. Esta lnea aparecer en el segundo archivo, pero no en
el primer archivo.

! Una lnea cambi. Se mostrarn las dos versiones de la lnea, cada uno en su respectiva
seccin del grupo de cambio.
El
formato
unificado con la es similar al formato de contexto, pero es ms concisa. Se especifica
opcin -u
286

[Me @ linuxbox ~] $ diff -u file1.txt file2.txt


--- File1.txt
2008-12-23 06: 40: 13.000000000 -0500
+++ File2.txt
2008-12-23 06: 40: 34.000000000 -0500
@@-1,4 +1,4@@
-a
b
c
d
+E

La comparacin de texto

La diferencia ms notable entre el contexto y formatos unificados es la eliminacin de las


lneas duplicadas de contexto, por lo que los resultados de la formato unificado ms cortos
que los del formato de contexto. En nuestro ejemplo anterior, vemos las marcas de tiempo de
archivos como los del formato contexto, seguido de la cadena@@-1,4 +1,4@@. Esto indica las
lneas en el primer archivo y las lneas en el segundo archivo descrito en el grupo de cambio.
A raz de esto son las propias lneas, con los predeterminados de tres lneas de contexto. Cada
lnea comienza con uno de los tres personajes posibles:
Tabla 20-6: diff unificado Formato Cambio Indicadores
Personaje
blanco

Significado
Esta lnea es compartida por ambos archivos.

Esta lnea se elimin desde el primer archivo.

Esta lnea se aadi a la primera archivo.

parche
El programa de parche se utiliza para aplicar los cambios a archivos de texto. Se acepta la
salida de diff y se utiliza generalmente para convertir versin anterior de los archivos en las
versiones ms recientes. Vamos a considerar un ejemplo famoso. El kernel de Linux es
desarrollado por un equipo grande, poco organizada de los contribuyentes que presenten un
flujo constante de pequeos cambios en el cdigo fuente. El kernel de Linux se compone de
varios millones de lneas de cdigo, mientras que los cambios que se realizan por un
contribuyente a la vez son bastante pequeas. No tiene sentido para un contribuyente a enviar
cada desarrollador un rbol completo de fuentes del ncleo cada vez que se hace un pequeo
cambio. En su lugar, se presenta un archivo diff. El archivo diff contiene el cambio de la
versin anterior del kernel a la nueva versin con los cambios del contribuyente. El receptor
entonces utiliza el programa de parche para aplicar el cambio a su propio rbol de cdigo
fuente. El uso de diferencias / parche ofrece dos ventajas importantes:
1. El archivo diff es muy pequea, en comparacin con el tamao total del rbol de
cdigo fuente.
2. El archivo diff muestra de forma concisa el cambio est hecho, lo que los
colaboradores de la
287

20 - Procesamiento de Texto
parche para evaluar rpidamente.
Por supuesto, diferencias / parche funcionar en cualquier archivo de texto, no slo el cdigo
fuente. Sera igualmente aplicable a los archivos de configuracin o cualquier otro texto.
Para preparar un archivo diff para su uso con el parche, la documentacin de GNU (vase
Lecturas abajo) sugiere el uso de diff de la siguiente manera:
[Me @ linuxbox ~] $ diff -Naur file1.txt file2.txt> patchfile.txt [me @ linuxbox ~] $
parche <patchfile.txt
parches file1.txt archivo
[Me @ linuxbox ~] $ file1.txt gato
b
c
d
e
diff -Naur archivo_viejo new_file> diff_file
Dnde archivo_viejo y new_file son o archivos individuales o directorios que contengan
archivos. La opcin r soporta recursin de un rbol de directorios.
Una vez que el archivo diff se ha creado, podemos aplicarlo a parchear el archivo antiguo en el
nuevo archivo:
parche <diff_file
Vamos a demostrar con nuestro archivo de prueba:
En este ejemplo, creamos un archivo llamado patchfile.txt diff y luego utiliz el programa de
parche para aplicar el parche. Tenga en cuenta que nosotros no tenemos que especificar un
archivo de destino al parche, como el archivo diff (en formato unificado) ya contiene los
nombres de archivo en el encabezado. Una vez que se aplica el parche, se puede observar que
file1.txt ahora coincide file2.txt.
p a r c h e tiene un gran nmero de opciones, y hay programas de utilidades adicionales que
pueden utilizarse para analizar y parches de edicin.

Edicin On The Fly


Nuestra experiencia con editores de texto ha sido en gran parte interactiva, lo que significa
que nos movemos manualmente un cursor, a continuacin, escriba los cambios. Sin embargo,
hay formas no interactivas para editar texto tambin. Es posible, por ejemplo, para aplicar una
serie de cambios en varios archivos con un solo comando.

tr
El programa tr se usa para transcribir caracteres. Podemos pensar en esto como una especie de
carac288

Edicin On The Fly


carc- basada en bsquedas y reemplazar operacin. Transliteracin es el proceso de cambio
de los personajes de un alfabeto a otro. Por ejemplo, la conversin de caracteres de minsculas
[Me @ linuxbox ~] $ echo "letras minsculas" | tr az AZ
Minsculas
a maysculas es transliteracin. Podemos realizar una conversin de este tipo con tr de la
siguiente manera:

Como podemos ver, tr opera en la entrada estndar, y emite sus resultados en la salida
estndar. tr acepta dos argumentos: un conjunto de caracteres para convertir desde y un
conjunto correspondiente de caracteres para convertir a. Los conjuntos de caracteres pueden
expresarse en una de tres maneras:
1. Una lista enumerada. Por ejemplo, ABCDEFGHIJKLMNOPQRSTUVWXYZ
2. Un intervalo de caracteres. Por ejemplo, A-Z. Tenga en cuenta que este mtodo es a
veces sujetos a los mismos problemas que otros comandos, debido a la orden de
clasificacin local, y por lo tanto se debe utilizar con precaucin.
3. Clases de caracteres de POSIX. Por ejemplo, [: upper:].
En la mayora de los casos, ambos conjuntos de caracteres deben ser de la misma longitud; Sin
[Me @ linuxbox ~] $ echo "letras minsculas" | tr [: lower:] A
AAAAAAAAA AAAAAAA
embargo, es posible para el primer conjunto sea ms grande que la segunda, sobre todo si
queremos convertir varios caracteres a un solo carcter:

Adems de transliteracin, tr permite a los personajes simplemente se eliminarn del flujo de


entrada. Al principio de este captulo, discutimos el problema de la conversin de archivos de
texto de MS-DOS al texto al estilo Unix. Para llevar a cabo esta conversin, los caracteres de
retorno de carro tienen que ser eliminado de la final de cada lnea. Esto se puede realizar con
tr como sigue:
tr -d '\ r' <dos_file> unix_file
donde dos_file es el archivo que desea convertir y unix_file es el resultado. Esta forma del
comando utiliza la secuencia de escape \ r para representar el carcter de retorno de carro.
[Me @ linuxbox ~] $ tr --help
Para ver una lista completa de las secuencias y clases de personajes soportes TR, trate de:

289

20 - Procesamiento de
Texto

ROT13: El Anillo Decodificador No-Tan-Secreto


Un uso divertido de tr es llevar a cabo la codificacin ROT13 de texto. ROT13 es un
tipo trivial de cifrado basado en una cifra de substitucin simple. Llamando ROT13
"cifrado" es ser generoso; "Ofuscacin texto" es ms preciso. A veces se utiliza en el
texto para ocultar contenido potencialmente ofensivo. El mtodo simplemente mueve
cada personaje 13 lugares hasta el alfabeto. Dado que esta es la mitad del camino hasta
los posibles 26 caracteres, que realiza el algoritmo por segunda vez en el texto lo
restaura a su forma original. Para llevar a cabo esta codificacin con tr: echo "texto
secreto" | tr a-zA-Z n-za-MN-ZA-M frperg grkg
Realizar el mismo procedimiento una segunda vez resultados en la
traduccin: echo "frperg grkg" | tr a-zA-Z n-za-MN-ZA-M
texto secreto
Una serie de programas de correo electrnico y los lectores de noticias de Usenet
admite la codificacin ROT13. Wikipedia contiene un buen artculo sobre el tema:
http://en.wikipedia.org/wiki/ROT13

tr puede realizar otro truco, tambin. El uso de la opcin -s, tr puede "exprimir" (borrar) los
casos repetidos de un personaje:

[Me @ linuxbox ~] $ echo "aaabbbccc" | tr -s ab


ABCCC
Aqu tenemos una cadena que contiene caracteres repetidos. Al especificar el conjunto "ab"
para tr, eliminamos los repetidos casos de las letras en el conjunto, dejando el carcter que
falta de la serie ("c") sin cambios. Tenga en cuenta que los caracteres repetidos deben ser
adyacentes. Si no lo son:

[Me @ linuxbox ~] $ echo "abcabcabc" | tr -s ab


abcabcabc
la compresin no tendr ningn efecto.

sed
El nombre es la abreviatura de sed editor de flujo. Se lleva a cabo la edicin de texto en un
flujo de texto, EI290

Edicin On The Fly


ther un conjunto de archivos especificados o entrada estndar. SED es un programa potente y
algo compleja (hay libros enteros al respecto), as que no lo cubrir por completo aqu.
En general, la forma en que sed obras es que se da ya sea un solo comando de edicin (en la
lnea de comandos) o el nombre de un archivo de comandos que contiene varios comandos, y
[Me @ linuxbox ~] $ echo "frente" | sed 's / delante / atrs /'
espalda
luego lleva a cabo estos comandos en cada lnea en el flujo de texto. Aqu est un ejemplo muy
simple de sed en accin:
En este ejemplo, se producen una corriente de una sola palabra de texto usando el eco y el
tubo en sed. sed, a su vez, lleva a cabo la instruccin de s / delante / atrs / en el texto en la
corriente y produce la salida "hacia atrs" como resultado. Tambin podemos reconocer este
comando como parecido a la "sustitucin" (buscar y reemplazar) de comandos en vi.
Los comandos de sed comienzan con una sola letra. En el ejemplo anterior, el comando de
sustitucin est representado por la letra s, y es seguido por la bsqueda y reemplazar
cadenas, separados por el carcter de barra como delimitador. La eleccin del carcter
delimitador es arbitraria. Por convencin, se utiliza a menudo el carcter de barra, pero sed
[Me @ linuxbox ~] $ echo "frente" | sed 's_front_back_'
espalda
aceptar cualquier carcter que sigue inmediatamente al comando como delimitador.
Podramos realizar el mismo comando de esta forma:
Al utilizar el carcter de subrayado inmediatamente despus del comando, se convierte en el
delimitador. La capacidad de establecer el delimitador puede ser utilizado para hacer los
comandos ms legible, como veremos ms adelante.
La mayora de los comandos de sed pueden ir precedidas de una direccin, que especifica que
la lnea (s) de la corriente de entrada ser editado. Si se omite la direccin, entonces el
[Me @ linuxbox ~] $ echo "frente" | '1s / delante / atrs /' sed
espalda
comando de edicin se lleva a cabo en todas las lneas del flujo de entrada. La forma ms
simple de direccin es un nmero de lnea. Podemos aadir una a nuestro ejemplo:
Adicin de la direccin 1 a nuestro comando hace que nuestro sustitucin que se realice en el
primer

291

[Me @ linuxbox ~] $ echo "frente" | '2s / delante / atrs /' sed


frente
20 - Procesamiento de Texto _________________________________
lnea de nuestro flujo de entrada de una lnea. Si especificamos otro nmero:
vemos que la edicin no se lleva a cabo, ya que nuestro flujo de entrada no tiene una lnea 2.
Las direcciones se pueden expresar de muchas maneras. stos son los ms comunes:
Tabla 20-7: sed Direccin de notacin
Direccin

Descripcin

n
$
/ Regexp /

Un nmero de lnea donde n es un entero positivo.


La ltima lnea.

addrl, addr2

Una gama de lneas de ADDR1 a ADDR2, ambos inclusive. Las


direcciones pueden ser cualquiera de las formas de direcciones
individuales anteriores.
Haga coincidir la lnea representada por el nmero primero, y luego
cada lnea subsiguiente a intervalos de paso. Por ejemplo 1 ~ 2 se
refiere a cada lnea impar, 5 ~ 5 se refiere a la quinta lnea y cada
quinta lnea a partir de entonces.

primer paso ~

addrl, + n
dir!

Lneas que coincidan con una expresin regular bsica POSIX.


Tenga en cuenta que la expresin regular est delimitada por
caracteres de barra. Opcionalmente, la expresin regular puede ser
delimitado por un carcter alternativo, mediante la especificacin de
la expresin con \ cregexpc, donde c es un carcter alternativo.

ADDR1 Partido y las siguientes n lneas.


Coincidir con todas las lneas excepto addr, que pueden ser
cualquiera de las formas anteriores.

Vamos a demostrar diferentes tipos de direcciones utilizando el archivo de distros.txt


anteriormente en este captulo. En primer lugar, una serie de nmeros de lnea:
[Me @ linuxbox ~] $ sed -n '1,5p' distros.txt
SUSE
10.2 12/07/2006
Fedora
11/25/2008
10
SUSE
11.0 06.19.2008
Ubuntu
8.04 24.04.2008

292

Edicin On The Fly


En este ejemplo, es la impresin de una serie de lneas, a partir de la lnea 1 y continuando con
Fedora 8
11/08/2007
la lnea 5. Para ello, utilizamos el comando p, que simplemente hace que una lnea coincidente
que desea imprimir. Para que esto sea efectivo, sin embargo, debemos incluir la opcin -n (la
opcin de no auto-impresin) para causar sed no imprimir todas las lneas de forma
predeterminada.
A continuacin, vamos a tratar de una expresin regular:
Con la inclusin de la expresin / SUSE normal / delimitada por barras, que son capaces de
[Me @ linuxbox ~] $ sed -n '/ SUSE / p' distros.txt
SUSE
10.2 12/07/2006
SUSE
11.0 06.19.2008
SUSE
10.3 10/04/2007
SUSE
10.1 05/11/2006
aislar las lneas que lo contienen en forma muy similar a como grep.
Por ltimo, vamos a tratar de negacin mediante la adicin de un signo de exclamacin a la
direccin (!):

[Me @ linuxbox ~] $ sed -n '/ SUSE /! P' distros.txt


Fedora
11/25/2008
10
Ubuntu
8.04 24.04.2008
Fedora
11/08/2007
8
Ubuntu
6.10 10/26/2006
Fedora
7
31.05.2007
Ubuntu
7.10 10/18/2007
Ubuntu
7.04 04/19/2007
Fedora
6
10/24/2006
Fedora
9
13.05.2008
Ubuntu
6.06 06/01/2006
Ubuntu
8.10 10/30/2008
Fedora
5
03.20.2006

Aqu vemos el resultado esperado: todas las lneas en el archivo excepto los emparejados por
la expresin regular.
Hasta ahora, hemos visto dos de los comandos de edicin de sed, s y p. Aqu est una lista ms
completa de los comandos bsicos de edicin:
Tabla 20-8: sed comandos de edicin bsicos
Comando

Descripcin
293

20 - Procesamiento de Texto
=

Nmero de lnea actual de salida.

un
d

Anexar texto despus de la lnea actual.


Borrar la lnea actual.

yo

Insertar texto en frente de la lnea actual.

Imprimir la lnea actual. Por defecto, todos los


grabados de lnea sed y slo edita las lneas que
coincidan con una direccin especificada en el archivo.
El comportamiento por defecto se puede anular
especificando la opcin -n.
Salir sed sin procesar cualquier ms lneas. Si la opcin
-n no se especifica, la salida de la lnea actual.

Q
s / regexp / reemplazo /

Salir sed sin procesar cualquier ms lneas.


Sustituya el contenido de sustitucin donde se
encuentra regexp. reemplazo puede incluir el carcter
especial y, lo que es equivalente al texto acompaado
de expresiones regulares. Adems, la sustitucin
puede incluir las secuencias \ 1 a \ 9, que son los
contenidos de las subexpresiones correspondientes de
expresin regular. Para ms informacin sobre esto,
vea la discusin de las referencias de nuevo por
debajo. Despus de la barra diagonal despus del
reemplazo, una bandera opcional se puede especificar
para modificar el comportamiento del comando s.
a / SETL / conjunto2
Realizar transliteracin mediante la conversin de
caracteres de SETL a los caracteres correspondientes
en conjunto2. Tenga en cuenta que a diferencia de tr,
sed requiere que ambos conjuntos sean de la misma
longitud.
El comando s es, con mucho, el comando de edicin ms utilizado. Vamos a demostrar
algunas de su poder mediante la realizacin de una edicin en nuestro archivo distros.txt.
Discutimos antes de cmo el campo de fecha en distros.txt no estaba en un formato de
"computadora-friendly". Si bien la fecha tiene el formato DD / MM / AAAA, que sera mejor
(para facilitar la clasificacin) si el formato fuera AAAA-MM-DD. Para realizar este cambio en
el archivo con la mano sera a la vez mucho tiempo y propenso a errores, pero con sed, este
[Me @ linuxbox ~] $ sed 's / \ ([0-9] \ {2 \} \) \ / \ ([0-9] \ {2 \} \) \ / \ ([0-9] \ {4 \} \
cambio se puede realizar en un solo paso:

294

SUSE
Fedora
SUSE
Ubuntu
Fedora
SUSE
Ubuntu
Fedora
Ubuntu
Ubuntu
SUSE
Fedora
Fedora
Ubuntu
Ubuntu
Fedora

GO

"V

Edicin On The Fly

\ 2 / 'distros.txt
10.2 2006-12-07
2008-11-25
10
11.0 2008-06-19
8.04 2008-04-24
2007-11-08
8
10.3 2007-10-04
6.10 2006-10-26
7
2007-05-31
7.10 2007-10-18
7.04 2007-04-19
10.1 2006-05-11
2006-10-24
6
9
2008-05-13
6.06 2006-06-01
8.10 2008-10-30
5
2006-03-20

Guau! Ahora que es un comando de feo aspecto. Pero funciona. En tan slo un paso, hemos
cambiado el formato de fecha en nuestro archivo. Tambin es un ejemplo perfecto de por qu
las expresiones regulares se refieren a veces en tono de broma como "de slo escribir" medio.
Podemos escribir, pero a veces no podemos leerlos. Antes de que nos sentimos tentados a huir

sed 's / regexp / reemplazo /' distros.t xt


aterrorizados de este comando, echemos un vistazo a la forma en que fue construido. En
primer lugar, sabemos que el comando tendr esta estructura bsica:
Nuestro siguiente paso es encontrar una expresin regular que aislar la fecha. Dado que es en

[0-9] {2} / [0-9] {2} / [ 0-9] {4}


$
formato MM / DD / AAAA y aparece al final de la lnea, podemos utilizar una expresin
como esta:
que coincide con dos dgitos, una barra, dos dgitos, una barra, cuatro dgitos, y el final de la
lnea. As que se encarga de expresin regular, pero qu pasa con el reemplazo? Para hacer
frente a esto, debemos introducir una nueva caracterstica expresin regular que aparece en
algunas aplicaciones que utilizan BRE. Esta caracterstica se llama de nuevo las referencias y
funciona as: Si la secuencia \ n aparece en reemplazo donde n es un nmero del 1 al 9, la
secuencia se referir a la subexpresin correspondiente en la expresin regular anterior. Para
crear las subexpresiones, simplemente encerrarlos en parntesis, as:

295

20 - Procesamiento de
Texto

([0-9] {2}) / ([0-9] {2}) / ([0 -9] {4}) $


Ahora tenemos tres subexpresiones. La primera contiene el mes, la segunda contiene el da del
mes, y el tercero contiene el ao. Ahora podemos construir el reemplazo de la siguiente
manera:

\ 3 \ 1\ 2
lo que nos da el ao, un guin, el mes, un guin, y el da. Ahora,
nuestro comando se parece a esto:

sed 's / ([0-9] {2}) / ([0 -9] {2}) / ([0-9] {4}) $ / \ 3 \ 1- \ 2 /' distros.
TXT
Tenemos dos problemas restantes. La primera es que las barras supletorias en nuestra
expresin regular confundirn sed cuando se trata de interpretar el comando s. La segunda es
que, dado sed, por defecto, acepta expresiones regulares slo bsicos, varios de los personajes
de nuestra expresin regular se tomar como literales, y no como metacaracteres. Podemos
resolver estos dos problemas con una aplicacin liberal de barras invertidas para escapar los
caracteres ofensivos:

sed 's / \ ([0-9] \ {2 \} \) \ / \ ([0-9] \ {2 \} \) \ / \ ([0-9] \ {4 \} \) $ / \


3 \ 1- \ 2 / ' dis tros.txt
Y ah lo tienen!
Otra caracterstica del comando s es el uso de banderas opcionales que pueden seguir la
cadena de reemplazo. La ms importante de ellas es la bandera g, que indica a sed que aplica
la bsqueda y reemplazo global a una lnea, no slo a la primera instancia, que es el valor
predeterminado. He aqu un ejemplo:

[Me @ linuxbox ~] $ echo "aaabbbccc" | sed 's / b / B /'


aaabbbccc
Vemos que se llev a cabo la sustitucin, pero slo en la primera instancia de la letra "b",
mientras que los casos restantes se quedaron sin cambios. Al aadir el indicador g, somos
capaces de cambiar todos los casos:
296

[Me @ linuxbox ~] $ echo "aaabbbccc" | sed 's / b / B / g'


aaabbbccc

Edicin On The Fly

# Secuencia de comandos sed para producir distribuciones Linux informe


1i\
\
Distribuciones Linux Informe \
s / \ ([0-9] \ {2 \} \) \ / \ ([0-9] \ {2 \} \) \ / \ ([0-9] \ {4 \} \) $ / \ 3- \ 1- \
2/
a / abcdefghijklmnopqrstuvwxyz / ABCDEFGHIJKLMNOPQRSTUVWXYZ
/
Hasta ahora, slo hemos dado los comandos individuales de sed a travs de la lnea de
comandos. Tambin es posible construir comandos ms complejos en un archivo de secuencia
de comandos con la opcin -f. Para demostrarlo, vamos a usar sed con nuestro archivo
distros.txt para construir un informe. Nuestro informe contar con un ttulo en la parte
superior, nuestras fechas modificadas, y todos los nombres de distribucin convierte a
maysculas. Para ello, tendremos que escribir un guin, as que vamos a despedir a nuestro
editor de texto e introduzca el siguiente:
Vamos a salvar a nuestra secuencia de comandos sed como distros.sed y ejecutarlo as:
[Me @ linuxbox ~] $ sed -f distros.sed distros.txt
Distribuciones Linux Reportar
SUSE
1 0 . 2 2006-12-07
FEDOR
10
2008-11-25
A
SUSE
1 1 . 0 2008-06-19
UBUN
8.04 2008-04-24
TU
FEDOR
8
2007-11-08
A
SUSE
10.3 2007-10-04
UBUN
6 . 1 0 2006-10-26
TU
FEDOR
7
2007-05-31
A
UBUN
7.10 2007-10-18
TU
UBUN
7.04 2007-04-19
TU
SUSE
1 0 . 1 2006-05-11
FEDOR
6
2006-10-24
A
FEDOR
9
2008-05-13
A
UBUN
6.06 2006-06-01
TU
UBUN
8 . 1 0 2008-10-30
TU
FEDOR
5
2006-03-20
A
Como podemos ver, nuestro script produce los resultados deseados, pero cmo hacerlo?
Echemos
297

[Me @ linuxbox ~] $ cat -n distros.sed


1
# Secuencia de comandos sed para producir distribuciones Linux
informe
2
2
1i\
3
\
4
Distribuciones Linux Informe \
6
5
s / \ ([0-9] \ {2 \} \) \ / \ ([0-9] \ {2 \} \) \ / \ ([0-9] \ {4 \} \) $ / \ 3- \
1- \ 2 /
6
a
/
abcdefghijklmnopqrstuvwxyz
/
ABCDEFGHIJKLMNOPQRSTUVWXYZ /
20 - Procesamiento de Texto_______________________________
Otra mirada a nuestro script. Usaremos gato a numerar las lneas:
Lnea uno de nuestro script es un comentario. Al igual que muchos archivos de configuracin
y los lenguajes de programacin en los sistemas Linux, los comentarios comienzan con el
carcter # y van seguidos de texto legible por humanos. Los comentarios se pueden colocar en
cualquier lugar en la secuencia de comandos (aunque no dentro de los comandos de ellos
mismos) y son tiles para cualquier ser humano que podran necesitar para identificar y / o
mantener la secuencia de comandos.
La lnea 2 es una lnea en blanco. Al igual que los comentarios se pueden aadir lneas en
blanco para mejorar la legibilidad.
Muchos comandos sed admiten direcciones de lnea. Estos se utilizan para especificar que las
lneas de la entrada son a efectos de su tramitacin. Direcciones de lnea se pueden expresar
como nmeros de una sola lnea, la lnea nmero oscila, y el nmero de lnea especial "$", que
indica la ltima lnea de entrada.
Las lneas 3 a 6 contienen texto que se inserta en la direccin 1, la primera lnea de la entrada.
El comando i es seguido por la secuencia de retorno de carro-barra invertida para producir un
retorno de carro escapado, o lo que se llama un carcter de continuacin de lnea. Esta
secuencia, que se puede utilizar en muchas circunstancias, incluyendo secuencias de
comandos shell, permite un retorno de carro para ser embebido en una corriente de texto sin el
intrprete de sealizacin (en este caso sed) que se ha alcanzado el final de la lnea. La i, y del
mismo modo, la una (que aade el texto, en lugar de insertarlo) y C (que sustituye el texto)
Comandos, permito que varias lneas de texto, siempre y cuando cada lnea, excepto el ltimo,
termina con un carcter de continuacin de lnea. La sexta lnea de nuestro script es en
realidad el final de nuestro texto insertado y termina con un retorno de carro normal en lugar
de un carcter de continuacin de lnea, lo que indica el final de la orden i.

Nota: Un carcter de continuacin de lnea est formada por una barra invertida seguida
de inmediato por un retorno de carro. No se permiten los espacios intermedios.
La lnea 7 es nuestro comando de bsqueda y reemplazo. Dado que no est precedido por una
direccin, cada lnea en el flujo de entrada est sujeta a su accin.
Lnea 8 realiza la transliteracin de las letras minsculas en maysculas. Tenga en cuenta que
298

Gente que como sed tambin les gusta ...


SED es un programa muy capaz, capaz de realizar tareas de edicin bastante
complejos a los arroyos de texto. Se utiliza con mayor frecuencia para tareas sencillas
de una sola lnea en lugar de guiones largos. Muchos usuarios prefieren otras
herramientas para las tareas ms grandes. El ms popular de estos son awk y perl.
Estos van ms all de meras herramientas como los programas incluidos aqu, y se
extienden en el reino de los lenguajes de programacin completos. perl, en particular,
se utiliza a menudo en lugar de scripts de shell para muchas tareas de gestin del
sistema y de administracin, adems de ser un medio muy popular para el desarrollo
web. awk es un poco ms especializado. Su resistencia especfica es su capacidad para
manipular los datos tabulares. Se asemeja a sed en que los programas awk
normalmente procesar archivos de texto lnea por lnea, utilizando un esquema
similar al concepto sed de una direccin seguida por una accin. Mientras tanto awk y
perl estn fuera del alcance de este libro, que son muy buenas habilidades para el
usuario de la lnea de comandos de Linux.
Edicin On The Fly
a diferencia de tr, el comando y en sed no es compatible con el carcter vara (por ejemplo,
[az]), ni tampoco apoya las clases de caracteres de POSIX. Una vez ms, ya que el comando y
no est precedido por una direccin, se aplica a todas las lneas del flujo de entrada.

aspell
La ltima herramienta vamos a ver es aspell, un corrector ortogrfico interactivo. El programa
aspell es el sucesor de un programa anterior llamado ispell, y se puede utilizar, en su mayor
parte, como una gota en el reemplazo. Si bien el programa aspell se utiliza sobre todo por
otros programas que requieren correccin ortogrfica capacidad, tambin se puede utilizar de
manera muy eficaz como una herramienta independiente de la lnea de comandos. Tiene la
capacidad para comprobar de forma inteligente varios tipos de archivos de texto, incluidos los
documentos HTML, C / C ++ programas, mensajes de correo electrnico y otros tipos de
aspell cheque archivo de
texto
textos especializados.
Para revisar la ortografa de un archivo de texto que contiene prosa sencilla, que podra ser
utilizado de esta manera:
donde fichero de texto es el nombre del archivo para comprobar. Como ejemplo prctico,
vamos a crear un archivo de texto simple llamado foo.txt que contiene algunos errores de
[Me @ linuxbox ~] $ cat> foo.txt
ortografa deliberadas:

299

20 - Procesamiento de Texto
A continuacin vamos a comprobar el archivo usando aspell:
Como aspell es interactivo en el modo de comprobacin, veremos una pantalla como esta:
El zorro marrn rpido jimped sobre el perro Laxy.
[Me @ linuxbox ~] $ aspell cheque foo.txt
El zorro marrn rpido jimped sobre el perro Laxy.
1 ) saltado
2 ) entorcha
dos
3 ) compens
aron
4 ) cojeando
5) i
pimped)
Ignorar r)
Reemplaza
?r
a) Aadir
b) Abortar

6 ) wimped
7 ) acampado
8 ) joroba
9 ) impedir
0) umped
1) No haga caso
de todo
R) Reemplazar
todo l) Aadir
Baja x) Salir _____

En la parte superior de la pantalla, vemos nuestro texto con una palabra escrita
sospechosamente destac. En el medio, vemos diez sugerencias de ortografa numeradas del
cero al nueve, seguido de una lista de otras acciones posibles. Por ltimo, en la parte inferior,
vemos un indicador de listo para aceptar nuestra eleccin.
Si pulsamos la tecla 1, aspell sustituye a la palabra ofensiva con la palabra "salt" y pasa a la
siguiente palabra mal escrita, que es "Laxy." Si seleccionamos el reemplazo de "perezoso"
aspell lo reemplaza y termina. Una vez aspell ha terminado, podemos examinar nuestro
archivo y ver que los errores ortogrficos se han corregido:
A menos que le indiquen lo contrario a travs de la opcin de lnea de comandos de copia de
[Me @ linuxbox ~] $ foo.txt gato
El rpido zorro marrn salt sobre el perro perezoso.
seguridad --dont, aspell crea un archivo de copia de seguridad que contiene el texto original
aadiendo la extensin .bak al nombre del archivo.

300

_______________________________________________________________ Edicin On The Fly


Mostrando nuestra destreza edicin sed, vamos a poner nuestras faltas de ortografa de vuelta
en lo que podemos reutilizar nuestro archivo:
La opcin sed -i le indica a sed que editar el archivo "in situ", lo que significa que en lugar de
[Me @ linuxbox ~] $ sed -i 's / perezoso / Laxy /; s / saltado / jimped / 'foo.txt
enviar la salida editada en la salida estndar, se reescribir el archivo con los cambios
aplicados. Tambin vemos la posibilidad de colocar ms de un comando de edicin en la lnea
separndolos con un punto y coma.
A continuacin, vamos a ver cmo aspell puede manejar diferentes tipos de archivos de texto.
Utilizando un editor de texto como vim (el aventurero puede probar SED), vamos a aadir un
poco de formato HTML para nuestro archivo:
Ahora, si tratamos de revisar la ortografa de nuestro archivo modificado, nos encontramos
<Html>
<Head>
<Title> archivo mispelled HTML </ title>
[Me @</
linuxbox
Head>~] $ aspell cheque foo.txt
<Body>
<P> El zorro marrn rpido jimped sobre el perro Laxy. </ P> </
body>
</ Html>
con un problema. Si lo hacemos de esta manera:
nos pondremos esto:
html

<Head>
</
Head>
<Body>

</
Html>

<Title> archivo mispelled HTML </ title>


<P> El zorro marrn rpido jimped sobre el perro Laxy. </ P>

</
Body>

301

20 - Procesamiento de
Texto
1) HTML
2) ht ml
3) -ht ml
[Me
yo @ linuxbox ~] $ aspell -H cheque foo.txt
) Pasar por alto
r) Reemplazar
a) Aadir
b) Abortar

4) Hamel
5) Hamil
6) hotel
Yo) No haga caso de todo
R) Vuelva a colocar todos
l) Aadir Baja
x) Salida

aspell ver el contenido de las etiquetas HTML como mal escrito. Este problema puede ser
superado mediante la inclusin de la opcin -H (HTML) de cheques-modo, de esta manera:
que se traducir en esto:
1) Mi espelta
6) Mal aplicada
2) Escanda-Mi
7) Mal llamado
3)<Html>
Mal escrito
8) Respelled
4) Disip <Head>
9) Deletrear mal
5) Espelta
Engaado
<Title> Mispelled Archivo 0)
HTML
</
</alto
Head>
Pasar por
title> Yo) No haga caso de
<Body>
Vuelva a colocar
r) Reemplazar
R) todo
todos
a) Aadir
l) Aadir
<P>
El
zorro
marrn
rpido
jimped
sobreBaja
el perro Laxy. </ P>
b) Abortar </ Body>
x) Salida
</ Html>
?
El HTML es ignorado y slo las partes no marcado del archivo se comprueban. En este modo,
el contenido de las etiquetas HTML se ignoran y no se comprueba la ortografa. Sin embargo,
el contenido de las etiquetas ALT, que se benefician de la comprobacin, se comprueban en
este modo.
302

Edicin On The Fly

Nota: De forma predeterminada, aspell ignorar las direcciones URL y direcciones de


correo electrnico en texto. Este comportamiento puede ser anulado con las opciones
de lnea de comandos. Tambin es posible especificar que se comprueban y se omiten
etiquetas de marcado. Vea la pgina man aspell para ms detalles.

Resumiendo
En este captulo, hemos visto algunas de las muchas herramientas de lnea de comandos que
operan sobre el texto. En el prximo captulo, vamos a ver varios ms. Es cierto que puede no
parecer inmediatamente obvio cmo o por qu es posible utilizar algunas de estas
herramientas sobre una base del da a da, aunque hemos tratado de mostrar algunos ejemplos
semi-prcticos de su uso. Nos encontraremos en captulos posteriores que estas herramientas
forman la base de un conjunto de herramientas que se utiliza para resolver una serie de
problemas prcticos. Esto ser especialmente cierto cuando nos metemos en shell scripting,
donde estas herramientas realmente demostrar su vala.

Lectura adicional
El sitio web del Proyecto GNU contiene muchas guas en lnea a las herramientas discutidas
en este captulo.

Desde el paquete Coreutils:


http://www.gnu.org/software/coreutils/manual/coreutils.html#Output-of-entirearchivos
http://www.gnu.org/software/coreutils/manual/coreutils.html#Operating-onarchivos ordenados
http://www.gnu.org/software/coreutils/manual/coreutils.html#Operating-on-fiel
ds
http://www.gnu.org/software/coreutils/manual/coreutils.html#Operating-on-cha
rpersonajes

Desde el paquete Diffutils:


http://www.gnu.org/software/diffutils/manual/html mono / diff.html

SED:
http://www.gnu.org/software/sed/manual/sed.html

aspell:
http://aspell.net/man-html/index.html

Hay muchos otros recursos en lnea para la sed, en particular:


http://www.grymoire.com/Unix/Sed.html
http://sed.sourceforge.net/sed1line.txt

Proveedores googlear "sed trazadores de lneas uno", "hojas de trucos sed"

303

20 - Procesamiento de Texto

Crdito extra
Hay algunos comandos de manipulacin de texto ms interesantes que vale la pena
investigar. Entre ellas se encuentran: split (dividir archivos en trozos), csplit (archivos
divididos en piezas basadas en contexto), y sdiff (fusin de lado a lado de las diferencias de
archivo.)

304

21 - Formato de salida

21 - Formato de salida
En este captulo, continuamos nuestra mirada a las herramientas relacionadas con el texto, se
centra en los programas que se utilizan para dar formato a la salida de texto, en lugar de
cambiar el texto en s. Estas herramientas a menudo se utilizan para preparar el texto para la
impresin final, un subj ect que vamos a cubrir en el prximo captulo. Los programas que
vamos a cubrir en este captulo incluyen:

nl - Las rectas numricas

doblar - Envuelva cada lnea para una longitud especificada

fmt - Un simple formateador de texto

PR - Prepare el texto para la impresin

printf - Formato e impresin de datos

Groff - Un sistema de formato de documentos

Herramientas de formato simple


Vamos a ver algunas de las herramientas de formato simples primero. En su mayora son
programas de una sola funcin, y un poco sofisticado en lo que hacen, pero que pueden ser
utilizados para tareas pequeas y como partes de las tuberas y scripts.

nl - Lneas Nmero
El programa de nl es una herramienta bastante arcano utilizado para llevar a cabo una tarea
sencilla. Nmeros que se alinee. En su uso ms simple, se asemeja a -n cat:
[Me @ linuxbox ~] $ nl distros
SUSE
1
10.2
Fedora
2
10
3
SUSE
11.0
4
Ubuntu
8.04
5
Fedora
8
6
SUSE
10.3
7
Ubuntu
6.10
305

txt | cabeza
12/07/2006
11/25/2008
06.19.2008
24.04.2008
11/08/2007
10/04/2007
10/26/2006

21 - Formato de salida
8
9
10

Fedora
Ubuntu
Ubuntu

31.05.2007
7.10 10/18/2007
7.04 04/19/2007

Al igual que el gato, nl puede aceptar cualquiera de varios archivos como argumentos de la
lnea de comandos, o la entrada estndar. Sin embargo, nl tiene una serie de opciones y es
compatible con una forma primitiva de marcado para permitir tipos ms complejos de
numeracin.
nl apoya un concepto llamado "pginas lgicas" cuando la numeracin. Esto permite nl para
restablecer (empezar de nuevo) la secuencia numrica cuando la numeracin. Uso de las
opciones, es posible establecer el nmero inicial a un valor especfico y, en una medida
limitada, su formato. Una pgina lgica se divide a su vez en un encabezado, cuerpo y pie de
pgina. Dentro de cada una de estas secciones, la numeracin de lneas se puede restablecer y
/ o se le asigna un estilo diferente. Si se da nl varios archivos, se los trata como un nico flujo
de texto. Secciones en la secuencia de texto se indican por la presencia de algunos marcadores
en vez extrao aspecto aadido al texto:
Tabla 21-1: marcado nl
Marcado
\: \: \:

Significado
Comience de encabezado de pgina lgica

\: \:

Iniciar cuerpo de pgina lgica

\:

Inicio de pgina lgica de pie de pgina

Cada uno de los elementos de marcado anteriores debe aparecer solo en su propia lnea.
Despus de procesar un elemento de marcado, nl lo elimina de la secuencia de texto.
Estas son las opciones comunes para nl:
Tabla 21-2: Opciones nl comunes
Opcin
estilo -b

estilo -f
estilo -h

306

Significado
Organismo creado numeracin al estilo, donde el estilo es uno de los
siguientes: a = nmero total de lneas
t = nmero de lneas slo no estn en blanco. Este es el valor
predeterminado.
n = ninguno
p = nmero de expresiones regulares slo las lneas que coincidan con
regexp bsica expresin regular.
Ajuste de numeracin a pie de pgina del estilo. El valor
predeterminado es N (ninguno).
Encabezado Numeracin de estilo. El valor predeterminado es N
(ninguno).

Herramientas de formato simple


-i nmero
Conjunto de la subasta la numeracin de pginas a nmero. El valor
predeterminado es uno.
-n formato
Conjuntos de numeracin de formato a formato, donde formato es: ln =
Izquierda justificada, sin ceros a la izquierda. rn = justificado a la
derecha, sin ceros a la izquierda. Este es el valor predeterminado. rz =
derecho justificado, con ceros a la izquierda.
-p
No reinicie la numeracin de pginas al principio de cada pgina lgica.
-s
cadena
# Secuencia de comandos
para al
producir
de lnea para crear un separador.
Aadirsed
cadena
final dedistribuciones
cada nmero de
Linux reportan 1 i \Por defecto es un solo carcter de tabulacin.
Establezca primer nmero de lnea de cada pgina lgica a nmero. El
\\:
\\: \
-v \\:
nmero
valor predeterminado es uno.
\
Establecer el ancho del campo de nmero de la lnea a la anchura. El
-w ancho
Distribuciones
Linux
Informe
\
valor
predeterminado
es 6.
\
Nombre
Ver. Lanzamiento \
\\: \\:
s / \ ([0-9] \ {2 \} \) \ / \ ([0-9] \ {2 \} \) \ / \ ([0-9] \ {4 \} \) $ / \ 3 \ 1- \
2/$a\
\\: \
\
Fin del Informe
Es cierto, probablemente no estaremos de numeracin de lneas que a menudo, pero podemos
utilizar nl mirar cmo podemos combinar mltiples herramientas para llevar a cabo tareas
ms complejas. Vamos a construir sobre nuestro trabajo en el captulo anterior para producir
un informe distribuciones Linux. Desde usaremos nl, ser til incluir su marcado cabecera /
cuerpo / pie de pgina. Para ello, lo aadiremos a la secuencia de comandos sed desde el
ltimo captulo. Usando nuestro editor de texto, vamos a cambiar el guin de la siguiente y
gurdelo como nl.sed-distros:
La secuencia de comandos ahora inserta la pgina nl marcado lgico y aade un pie de pgina
al final del informe. Tenga en cuenta que tenamos que doblar las barras invertidas en nuestro
margen de beneficio, ya que normalmente se interpretan como un carcter de escape por sed.
A continuacin, vamos a producir nuestro informe mejorado mediante la combinacin de
clase, sed, y nl:

307

21 - Formato de salida
[Me @ linuxbox ~ ] $ Sort
ed | nl

-k 1,1 -k 2n distros.txt

distros-nl.s -f sed

Distribuciones Linux Reportar


Nombre
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

Fedora
Fedora
Fedora
Fedora
Fedora
Fedora
SUSE
SUSE
SUSE
SUSE
Ubunt
u
Ubunt
u
Ubunt
u
Ubunt
u
Ubunt
u
Ubunt
u

Ver.

Liberado

5
6
7
8
9
1
0 0.1
1
0 0.2
1
0 0.3
1
0 0.0
1
1 06
6.
6. 10
7. 04
7. 10
8. 04
8. 10

2006-03-20
2006-10-24
2007-05-31
2007-11-08
2008-05-13
2008-11-25
2006-05-11
2006-12-07
2007-10-04
2008-06-19
2006-06-01
2006-10-26
2007-04-19
2007-10-18
2008-04-24
2008-10-30

End Of Informe
Nuestro informe es el resultado de nuestra cartera de comandos. En primer lugar, ordenar la
lista por nombre de la distribucin y la versin (campos 1 y 2), a continuacin, en que
procesamos los resultados con sed, aadiendo el encabezado del informe (incluido el marcado
de la pgina lgica para nl) y pie de pgina. Por ltimo, procesamos el resultado con nl, que,
de forma predeterminada, slo los nmeros de las lneas de la secuencia de texto que
pertenecen a la seccin del cuerpo de la pgina lgica.
Podemos repetir el comando y experimentar con diferentes opciones para la Liga Nacional.
nl -n rz

nl -w 3 -s ''
Algunas de las ms interesantes son:
y
308

[Me @ linuxbox ~] $ echo "El rpido zorro marrn salt sobre el perro perezoso." | -w 12
veces
El ancho
propio salto
zorro rpida ed
sobre el perro
perezoso.
Herramientas de formato simple

doblar - Envuelva cada lnea a una longitud especificada


Plegable es el proceso de romper las lneas de texto en un ancho especificado. Al igual que
nuestros otros comandos, pliegue acepta uno o ms archivos de texto o la entrada estndar. Si
enviamos doblar una corriente sencilla de texto, podemos ver cmo funciona:
[Me @ linuxbox ~] $ echo "El rpido zorro marrn salt sobre el perro perezoso." | Fold
-w 12 -s
El rpido
zorro marrn
salt sobre el
perro
perezoso.
Aqu vemos a veces en la accin. El texto enviado por el comando echo se divide en segmentos
especificados por la opcin -w. En este ejemplo, se especifica un ancho de lnea de 12
caracteres. Si no se especifica el ancho, el valor predeterminado es de 80 caracteres. Observe
cmo las lneas se rompen sin importar lmites de las palabras. La adicin de la opcin -s
provocar veces para romper la lnea en el ltimo espacio disponible antes de que se alcance el
ancho de lnea:

fmt - Un formateador de texto sencillo


El programa tambin se pliega fmt texto, adems de un montn ms. Se acepta cualquiera de
los archivos o la entrada estndar y realiza formato de prrafo en la secuencia de texto.
'Fmt' lee los argumentos de archivo (o en la entrada estndar si no se dan), y escribe
en la salida estndar.
Por defecto, las lneas en blanco, espacios entre palabras, y la sangra son
Bsicamente, se llena y se une a las lneas de texto, mientras que la preservacin de las lneas
en blanco y sangra.
Para demostrarlo, vamos a necesitar un poco de texto. Vamos a levantar un poco de la pgina
de informacin fmt:

309

conservado en la salida; lneas de entrada sucesivas con diferentes sangra no se unen;


pestaas se expanden en la entrada y se introducen en la salida.
'Fmt' prefiere romper lneas al final de una frase, y trata de evitar los saltos de lnea
despus de la primera palabra de una frase o antes de la ltima palabra de una frase. Un
"break frase" se define como el final de un prrafo o una palabra que termina en
cualquiera de '.?!', Seguido de dos espacios o final de la lnea, haciendo caso omiso de
cualquier parntesis o comillas que intervienen. Al igual que TeX, 'fmt' lee "prrafos"
[Me
enteros
@ linuxbox
antes de~]
la $eleccin
fmt -w de
50 fmt-info.txt
los saltos de|lnea;
cabeza
el algoritmo es una variante de la dada
por Donald
E. Knuth
y Michael F.
en "Breaking
'Fmt' lee
los argumentos
dePlass
archivo
(o en laprrafos
entradaen Lneas", "Software Prctica
y Experiencia
'11, 11 (noviembre de 1981), 1119-1184.
estndar
si
ninguno se dan), y escribe en la salida estndar.
Por defecto, las lneas en blanco, espacios entre palabras, y
la sangra son
conservado en la salida; lneas de entrada sucesivas con
diferentes sangra no se unen; pestaas se expanden en la
entrada y se introducen en la salida.
21 - Formato de salida
Vamos a copiar este texto en nuestro editor de texto y guarde el archivo como fmt-info.txt.
Ahora, digamos que queramos volver a formatear el texto para adaptarse a una amplia
columna de cincuenta carcter. Podramos hacer esto mediante la tramitacin del expediente
con FMT y la opcin -w:
Bueno, eso es un resultado incmodo. Tal vez deberamos leer realmente este texto, ya que
explica lo que est pasando:
Por defecto, las lneas en blanco, espacios entre palabras, y la sangra se conservan en la salida; lneas
[Me @ linuxbox ~] $ fmt -cw 50 fmt-info.txt
'Fmt' lee los argumentos de archivo (o en la entrada
estndar si no se dan), y escribe en la salida estndar.
de entrada sucesivas con diferentes sangra no se unen; pestaas se expanden en la entrada y se
introducen en la salida.
As, fmt es preservar la sangra de la primera lnea. Afortunadamente, fmt proporciona una
opcin para corregir esto:

310

Herramientas de formato
simple
Por defecto, las lneas en blanco, espacios entre palabras, y
la sangra se conservan en la salida; lneas de entrada sucesivas
con diferentes sangra no se unen; pestaas se expanden en la
entrada y se introducen en la salida.
'Fmt' prefiere romper lneas al final de una frase, y trata de
evitar los saltos de lnea despus de la primera palabra de una
frase o antes de la ltima palabra de una frase. Un "break frase"
se define como el final de un prrafo o una palabra que termina
en cualquiera de '.?!', Seguido de dos espacios o final de la lnea,
haciendo caso omiso de cualquier parntesis o comillas que
intervienen. Al igual que TeX,
'Fmt' lee "prrafos" enteros antes de la eleccin de los saltos de
lnea; el algoritmo es una variante de la dada por Donald E.
Knuth y Michael F.
Plass en "Breaking prrafos en Lneas", "Software - Prctica y
Experiencia '11, 11 (noviembre de 1981), 1119-1184.

Mucho mejor. Mediante la adicin de la opcin -c, ahora tenemos el resultado deseado. fmt
tiene algunas opciones interesantes:
Tabla 21-3: fmt Opciones
Opcin
-c

Descripcin

cadena -p

Slo formatear esas lneas que comienzan con la cadena de prefijo.


Despus de formatear, el contenido de la cadena tienen el prefijo a cada
lnea reformateado. Esta opcin se puede utilizar para dar formato a
texto en los comentarios de cdigo fuente. Por ejemplo, cualquier
lenguaje de programacin o un archivo de configuracin que utiliza un
carcter "#" para delinear un comentario pudieran presentarse
especificando -p '#' para que se dar formato, slo los comentarios. Vea
el siguiente ejemplo.
-Split nico modo. En este modo, las lneas slo se dividirn para
ajustarse al ancho de la columna especificada. Lneas cortas no se unirn
para llenar lneas. Este modo es til cuando el formateo de texto como
cdigo donde no se desea unir.
Realice una separacin uniforme. Esto se aplicar mquina de escribir
tradicional "

-s

-u

311

Operar en el modo de margen de la corona. Esto preserva la sangra de


las dos primeras lneas de un prrafo. Las lneas siguientes estn
alineados con la muesca de la segunda lnea.

21 - Formato de salida
estilo "de formato al texto. Esto significa que un solo espacio entre las
palabras y dos espacios entre frases. Este modo es til para eliminar la
"justificacin", es decir, texto que ha sido rellenado con espacios para
forzar la alineacin tanto en los mrgenes derecho e izquierdo.
anchura w
Formato de texto para encajar dentro de unos personajes ancho de
[Me @ linuxbox ~] $ cat> fmt-code.txt
columna
de con
ancho.
El valor por defecto es de 75 caracteres. Nota: fmt
# Este archivo contiene
cdigo
comentarios.
realidad formatos lneas ligeramente ms cortas que el ancho
# Esta lnea es un comentario.
especificado
para permitir el balanceo de la lnea.
# Seguido de otra lnea
de comentario.
# Y otro.
Esto, por otra parte, es una lnea de cdigo. Y otra lnea
de cdigo.
Y otro.
La opcin -p es particularmente interesante. Con l, podemos formato porciones de un archivo
seleccionado, siempre que las lneas que desea formatear todos comienzan con la misma
[Me @ linuxbox ~] '#' $ fmt -w -p 50 fmt-code.txt
# Este archivo contiene cdigo con comentarios.
# Esta lnea es un comentario. Seguido por otro
# lnea de comentario. Y otro.
Esto, por otra parte, es una lnea de cdigo.
Y otra lnea de cdigo.
Y otro.
secuencia de caracteres. Muchos lenguajes de programacin utilizan el signo de nmero (#)
para indicar el comienzo de un comentario y por lo tanto se pueden formatear utilizando esta
opcin. Vamos a crear un archivo que simula un programa que utiliza comentarios:
Nuestro archivo de ejemplo contiene los comentarios que comienzan con la cadena "#" (un #
seguido de un espacio) y las lneas de "cdigo" que no lo hacen. Ahora, usando fmt, podemos
dar formato a los comentarios y dejar sin tocar el cdigo:
Observe que las lneas de comentario adyacentes estn unidos, mientras que las lneas en
blanco y las lneas que no comienzan con el prefijo especificado se conservan.
312

Herramientas de formato simple

PR - formato de texto para impresin


El programa de pr se utiliza para paginar texto. Al imprimir texto, a menudo es deseable
separar las pginas de salida con varias lneas de espacios en blanco, para proporcionar un
margen superior e inferior de cada pgina. Adems, este espacio en blanco se puede utilizar
para insertar un encabezado y pie de pgina en cada pgina.
Vamos a demostrar pr formateando nuestro archivo distros.txt en una serie de pginas muy
corto (slo las dos primeras pginas se muestran):
SUSE
10.3 10/04/2007
Ubuntu
[Me
@ linuxbox 6.10
~] $ 10/26/2006
pr -l 15 -w 65 distros.txt
Fedora
7
31.05.2007
Ubuntu
7.10 10/18/2007
Ubuntu
7.04 04/19/2007
2008-12-11 18:27
distros.txt

SUSE
Fedora
SUSE
Ubuntu
Fedora

10.2
10
11.0
8.04
8

2008-12-11

18:27

Page 1

12/07/2006
11/25/2008
06.19.2008
24.04.2008
11/08/2007

distros.txt

Pgina 2

En este ejemplo, utilizamos la opcin -l (para la longitud de la pgina) y la opcin -w (ancho


de pgina) para definir una "pgina" que es de 65 columnas de ancho y 15 lneas de largo. pr
pagina el contenido del archivo distros.txt, separa cada pgina con varias lneas de espacios en
blanco y crea un encabezado predeterminado que contiene la fecha de modificacin del
archivo, nombre de archivo, y el nmero de pgina. El programa de pr ofrece muchas
opciones para controlar el diseo de pgina. Vamos a echar un vistazo a varios de ellos en el
captulo siguiente.

313

21

- Formato de salida

printf - Formato Y Imprimir datos


A diferencia de los otros comandos en este captulo, el comando printf no se utiliza para las
tuberas (que no acepta la entrada estndar) ni la aplicacin frecuente encontrar directamente
en la lnea de comandos (se utiliza sobre todo en las secuencias de comandos). As que por
qu es importante? Debido a que es tan ampliamente utilizado.
printf (de la frase "de impresin con formato") fue desarrollado originalmente para el lenguaje
de programacin C y ha sido implementado en muchos lenguajes de programacin,
incluyendo la cscara. De hecho, en bash, printf es una orden interna.
printf funciona as:
printf "formato "argumentos
[Me @ linuxbox ~] $ printf "he formateado la cadena:% s \ n" foo
He formateado la cadena: foo
El comando se da una cadena que contiene una descripcin de formato que se aplica luego a
una lista de argumentos. El resultado con formato se enva a la salida estndar. Aqu est un
ejemplo trivial:
La cadena de formato puede contener texto literal (como "he formateado la cadena:"),
secuencias de escape (como \ n, un carcter de nueva lnea), y secuencias que comienzan con
el carcter%, que se llaman especificaciones de conversin. En el ejemplo anterior, la
[Me @ linuxbox ~] $ printf "he formateado '% s' como stringAn" foo
He formateado 'foo' como una cadena.
especificacin de conversin% s se utiliza para dar formato a la cadena "foo" y lo coloca en la
salida del comando. Aqu est otra vez:
Como podemos ver, la especificacin de conversin% s se sustituye por la cadena "foo" en la
salida del comando. La conversin s se utiliza para dar formato a los datos de cadena. Hay
otros especificadores para otros tipos de datos. Esta tabla muestra los tipos de datos de uso
comn:
Tabla 21-4: tipo comn de datos printf especificadores
Prescripcin
d

Descripcin
Dar formato a un nmero como un entero decimal con signo.

Formato de salida y un nmero de punto flotante.

Formatear un entero como un nmero octal.

314

Herramientas de formato simple


s
x

Formatear una cadena.

Igual que la x pero utilizan letras maysculas.

Imprimir un smbolo literal% (es decir, especificar "%%")

Formatear un entero como un nmero hexadecimal utilizando af


minsculas cuando sea necesario.

Vamos a demostrar el efecto de cada uno de los especificadores de conversin en la cadena


"380":
[Me @ linuxbox ~] $ printf "% d,% f,% s,% s,% x,% X \ n" 380 380 380 380
380 380
380, 380.000000, 574, 380, 17 quater, 17 C
Dado que especificamos seis especificadores de conversin, tambin debemos suministrar seis
argumentos para printf para procesar. Los seis resultados muestran el efecto de cada
especificador.
Varios componentes opcionales pueden aadirse a la especificador de conversin para ajustar
su salida. Una especificacin de conversin completa puede consistir en lo siguiente:%
[banderas] [ancho] [. Precisin] conversion_specification
Mltiples componentes opcionales, cuando se utilizan, deben aparecer en el orden
especificado anteriormente debe interpretarse correctamente. He aqu una descripcin de
cada uno:
Tabla 21-5: especificacin de conversin printf Componentes
Componente

Descripcin

banderas

Hay cinco banderas diferentes:


# - Utilice la opcin "formato alternativo" para la salida. Esto vara
segn el tipo de datos. Para O (nmero octal) de conversin, la salida
tiene el prefijo 0. Para x y conversiones X (nmero hexadecimal), la
salida tiene el prefijo 0x o 0X respectivamente.
0- (cero) Pad la salida con ceros. Esto significa que el campo se
rellenar con ceros a la izquierda, como en "000380".
- (Guin) Izquierda-alinear la salida. De forma predeterminada, printf
derecha alinea de salida.
'' - (Espacio) Producir un espacio inicial para los nmeros positivos.
+ - (Signo ms) Ingresar los nmeros positivos. Por defecto, slo printf

315
21 - Formato de salida

signos nmeros negativos.


ancho

Un nmero que especifica el mnimo ancho de campo.

.precision Para nmeros de coma flotante, especificar el nmero de dgitos de


precisin que se emitir despus del punto decimal. Para la
conversin de cuerdas, precisin especifica el nmero de
caracteres en la salida.
He aqu algunos ejemplos de diferentes formatos en la accin:
Tabla 21-6: Conversin de impresin Especificaciones Ejemplos
Argumento
380

Formato
"% D"

Resultado
380

380

"% # x"

0x17c

380

"% 05d"

00380

380

"% 05.5f"

380.00000

380

"% 010.5f"

0380,00000

380

"% + D"

380

380

"% -d"

380

316

Notas
Formato simple de un
nmero entero.
Entero con formato como un
nmero hexadecimal con el
"formato alternativo" de la
bandera.
Entero formateado con ceros
a la izquierda (de relleno) y
un ancho de campo mnimo
de cinco caracteres.
Nmero formateado como un
nmero de punto flotante con
el acolchado y cinco cifras
decimales de precisin. Dado
que el ancho de campo
mnimo especificado (5) es
menor que la anchura real del
nmero formateado, el
relleno no tiene ningn
efecto.
Al aumentar la anchura
mnima campo para el relleno
10 es ahora visible.
La bandera + firma un
nmero positivo.
El - bandera izquierda se
alinea el formato.

Herramientas de formato simple


abcdefghijk
"% 5s"
abcdefghijk

"%" .5s

abcedfghijk
abcde

Una cadena con formato con


una anchura mnima de
campo.
Mediante la aplicacin de
precisin a una cadena, se
trunca.

Una vez ms, printf se utiliza principalmente en scripts en los que se emplea para dar formato
a los datos tabulares, en lugar de en la lnea de comandos directamente. Pero todava
podemos mostrar cmo se puede utilizar para resolver diversos problemas de formato. En
primer lugar, vamos de salida algunos campos separados por caracteres de tabulacin:

[Me @ linuxbox ~] $ printf "% s \ t% s \ t% s \ n" str3 cad2 stri


stri cad2 str3
Mediante la insercin de \ t (la secuencia de escape para una ficha), logramos el efecto
deseado. Siguiente, algunos nmeros con formato ordenado:
[Me @ linuxbox ~] $ printf "Lnea:% 05d% 15.3f Resultado:% 15d + \ n" 1071
3.14156295 32589
Lnea: 01071
3.142 Resultado:
32589
Esto muestra el efecto de la anchura mnima de campo en la separacin de los campos. O qu
tal el formateo de una pgina web pequea:
[Me @ linuxbox ~] $ printf "<html> \ n \ t <head> \ n \ t \ t <title>% s </ title> \ n \ t
</ head> \ n \ t <body> \ n \ t \ t <p>% s </ p> \ n \ t </ body> \ n </ html> \ n ""
Pgina de tetas le "" Contenido de la pgina "
<Html>
<Head>
<Title> Ttulo de la pgina </ title>
</ Head>
<Body>
<P> Contenido de la pgina </ p>
</ Body>
</ Html>

Documento Sistemas de formato


Hasta ahora, hemos examinado las simples herramientas de formato de texto. Estos son
buenos para los pequeos, sim317

21 - Formato de salida ples tareas, pero qu pasa con los trabajos ms grandes? Una de las
razones de que Unix se convirti en un sistema operativo popular entre los usuarios tcnicos y
cientficos (aparte de proporcionar una potente multitarea, entorno multiusuario para todo
tipo de desarrollo de software) es que ofrece herramientas que podran ser utilizadas para
producir muchos tipos de documentos, en particular publicaciones cientficas y acadmicas.
De hecho, como la documentacin de GNU describe, preparacin de documentos fue
fundamental para el desarrollo de Unix:
La primera versin de UNIX fue desarrollado en un PDP-7, que estaba sentada alrededor de los
Laboratorios Bell. En 1971 los desarrolladores queran conseguir un PDP-11 para seguir
trabajando en el sistema operativo. Con el fin de justificar el costo de este sistema, propusieron
que iban a poner en prctica un sistema de formato de documentos para la divisin de las
patentes de AT & T. Este primer programa de formato era una reimplementacin de 'roff de
McIllroy, escrito por J.
F. Ossanna.
Dos familias principales del documento formateadores dominan el campo: los descendientes
de la roff programa original, incluyendo nroff y troff, y los basados en TeX de Donald Knuth
(pronunciado "tek") sistema de archivos de texto. Y s, el cado "E" en el centro es parte de su
nombre.
El nombre "roff" se deriva del trmino "corro fuera", como en, "Voy a correr de una copia para
usted." El programa de nroff se utiliza para documentos de formato para la salida a los
dispositivos que utilizan fuentes de monoespaciado, tales como terminales de caracteres y las
impresoras de estilo mquina de escribir. En el momento de su introduccin, esto inclua casi
todos los dispositivos de impresin conectados a las computadoras. El programa troff despus
formatea documentos para la salida de los tipgrafos, los dispositivos utilizados para
producir el tipo "camera-ready" para la impresin comercial. La mayora de las impresoras de
ordenador hoy en da son capaces de simular la salida de tipgrafos. La familia roff tambin
incluye algunos otros programas que se usan para preparar porciones de documentos. Estos
incluyen la ecuacin (para ecuaciones matemticas) y TBL (para las tablas).
El sistema TeX (en forma estable) apareci por primera vez en 1989 y tiene, en cierta medida,
desplazados troff como la herramienta de eleccin para la salida de la mquina de componer.
No vamos a estar cubriendo TeX aqu, debido tanto a su complejidad (hay libros enteros sobre
ella) y al hecho de que no se instala por defecto en la mayora de los sistemas Linux modernos.

Consejo: Para aquellos interesados en la instalacin de TeX, echa un vistazo a el


paquete texlive que se puede encontrar en la mayora de los repositorios de la
distribucin, y el editor de contenido grfico LyX.

Groff
groff es un conjunto de programas que contienen la implementacin GNU de troff. Tambin
incluye una secuencia de comandos que se utiliza para emular nroff y el resto de la familia roff
tambin.
318

Documento Sistemas de formato


Mientras roff y sus descendientes se utilizan para hacer documentos formateados, lo hacen de
una manera que es ms bien extrao a los usuarios modernos. La mayora de los documentos
de hoy en da se produce utilizando procesadores de texto que son capaces de realizar tanto la
composicin y el diseo de un documento en un solo paso. Antes de la llegada de la palabra
procesador grfico, los documentos se producen a menudo en un proceso de dos etapas que
implica el uso de un editor de texto para realizar la composicin, y un procesador, tal como
troff, para aplicar el formato. Instrucciones para el programa de formato fueron incorporados
en el texto integrado a travs del uso de un lenguaje de marcas. El anlogo moderno para un
proceso de este tipo es la pgina web, que se compone con un editor de texto de algn tipo y
luego vuelve por un navegador web utilizando HTML como el lenguaje de marcas para
describir el diseo de la pgina final.
[Me @ linuxbox ~] $ zcat /usr/share/man/man1/ls.1.gz | cabeza
. \ "NO MODIFIQUE ESTE ARCHIVO! Se genera por help2man 1.35. .TH LS" 1 ""
Abril 2008 "" GNU coreutils 6.10 "" Comandos de usuario "
NOMBRE .SH
ls \ - Lista el contenido del directorio .SH SINOPSIS .B ls
[\ FIOPTION \ fR] ... [\ fIfichero \ fR] ...
.SH DESCRIPCIN
. \ "Aadir cualquier descripcin adicional aqu .PP
No vamos a cubrir Groff en su totalidad, ya que muchos elementos de su lenguaje de marcado
de acuerdo con los detalles ms arcanos de la tipografa. En su lugar nos concentraremos en
uno de sus paquetes de macros que sigue siendo de uso generalizado. Estos paquetes de
macros se condensan muchos de sus comandos de bajo nivel en un conjunto ms reducido de
comandos de alto nivel que facilitan el uso de Groff mucho ms fcil.
Por un momento, vamos a considerar la pgina hombre humilde. Vive en el directorio / usr /
hombre / accin como un archivo de texto comprimido con gzip. Si tuviramos que examinar
su contenido sin comprimir, veramos el (la pgina de manual para ls en la seccin 1 se
muestra) siguiente:
En comparacin con la pgina del manual en su presentacin normal, podemos empezar a ver
una correlacin entre el lenguaje de marcas y sus resultados:
[Me @ linuxbox ~] $ man ls | cabeza
LS (1)
Comandos de usuario
NOMBRE

LS (1)

ls - Lista contenido del directorio

319

21 - Formato de salida
LU _J
I-1 LL

ls [OPCIN] ..

yo
_y
o

SINOPSIS

La razn de que esto es de inters es que las pginas de manual son prestados por Groff,
utilizando el hombre - paquete de macros doc. De hecho, podemos simular el comando man
con la siguiente tubera:
[Me @ linuxbox ~] $ zcat /usr/share/man/man1/ls.1.gz
ascii | Cabeza
LS (1)
Comandos de usuario

Groff -mandoc -T
LS (1)

[Me @ linuxbox ~] /usr/share/man/man1/ls.1.gz $ zcat | -mandoc Groff | cabeza


NOMB
%!
PS-Adobe-3.0
RE Creador: versin 1.18.1 Groff %% CreationDate: Jue 05 de febrero 2009 13:44:37
%%
ls - lista el contenido %%:
del directorio
DocumentNeededResources
%% %% fuente Times-Roman + fuente Times-Bold +
fuente
Times-Italic
SINOPSIS
%% DocumentSuppliedResources:
grops 1,18 %% 1 Pginas: 4 %% PageOrder:
ls [OPCIN] ... [ARCHIVO]ProcSet
...
Ascend %% Orientacin: vertical
Aqu se utiliza el programa groff con las opciones establecidas para especificar el paquete de
macros mandoc y el controlador de salida de ASCII. groff puede producir una salida en varios
formatos. Si no se especifica ningn formato, PostScript se emite de forma predeterminada:
Hemos mencionado brevemente PostScript en el captulo anterior, y lo haremos de nuevo en
el prximo captulo. PostScript es un lenguaje de descripcin de pgina que se utiliza para
describir el contenido de una pgina impresa a un dispositivo como tipgrafo. Si tomamos la
salida de nuestro comando y la almacenamos en un archivo (suponiendo que estamos
utilizando un escritorio grfico con un directorio de escritorio):

320

[me @ linuxbox ~] /usr/share/man/man1/ls.1.gz $ zcat | -mandoc Groff> ~ /


Escritorio / foo.ps
Documento Sistemas de formato
Un icono para el archivo de salida debera aparecer en el escritorio. Haciendo doble clic en el
icono, un visor de pgina debe comenzar y revelar el archivo en su forma rendido:

Figura 4: Visualizacin de PostScript de salida con un Visor de pginas En GNOME

[Me @ linuxbox ~] $ ps2pdf ~ / Desktop / foo.ps ~ / Desktop / ls.pdf


Lo que vemos es una pgina de manual bien tipografa para ls! De hecho, es posible convertir
el archivo PostScript a PDF (Portable Document Format) de archivo con este comando:
El programa ps2pdf es parte del paquete ghostscript, que se instala en la mayora de los
sistemas Linux que admiten la impresin.

Punta: Los sistemas Linux a menudo incluyen muchos programas de lnea de comandos
para el formato de archivo

321

21 - Formato de salida
la conversin. A menudo se nombran usando la convencin de format2format. Trate de
usar el comando ls / usr / bin / * [[: alpha:]] 2 [[: alpha:]] * identificarlos. Prueba
tambin la bsqueda de programas nombrados formatto formato.
Para nuestro ltimo ejercicio con Groff, vamos a volver a nuestro viejo amigo distros.txt una
vez ms. Esta vez, vamos a utilizar el programa TBL que se utiliza para dar formato a tablas
para componer la lista de las distribuciones de Linux. Para ello, vamos a usar nuestro script
sed antes de aadir marcas a una secuencia de texto que vamos a alimentar a Groff.
En primer lugar, tenemos que modificar nuestra secuencia de comandos sed para agregar las
solicitudes necesarias que TBL requiere. Con un editor de texto, cambiaremos distros.sed a lo
siguiente:
# Secuencia de comandos sed para producir distribuciones Linux informe
1i\
.TS \
caja central; \ cb s s \ cb cb cb \ l n c \.
Distribuciones Linux Informe \
=\
Nombre Versin Lanzamiento \
s / \ ([0-9] \ {2 \} \) \ / \ ([0-9] \ {2 \} \) \ / \ ([0-9] \ {4 \} \) $ / \ 3 \ 1- \
2/$a\
Distros-TBL -f SED | [me @ linuxbox ~] $ sort -k 1,1 -k distros.txt 2n
.TE
.sed | Groff -t -T ascii 2> / dev / null
+--------------------------------------------------- +
| Distribuciones Linux Reportar
|
+--------------------------------------------------- +
| Nombre Versin Lanzamiento |

322
Tenga en cuenta que para la secuencia de comandos para que funcione correctamente, se debe
ha llevado a ver que las palabras "Nombre Versin Lanzamiento" estn separadas por
pestaas, no espacios. Guardaremos el archivo resultante como tbl.sed-distros. TBL utiliza los
.TS y solicitudes .te para iniciar y terminar la tabla. Las filas siguientes los .TS solicitan definir
las propiedades globales de la tabla que, para nuestro ejemplo, se centra horizontalmente en la
pgina y rodeado por una caja. Las lneas restantes de la definicin describen el diseo de
cada fila de la tabla. Ahora, si corremos nuestra cartera reportgenerating de nuevo con la
nueva secuencia de comandos sed, nos pondremos lo siguiente:

Documento Sistemas de formato


+ -----------+
| Fedora
5
2006-03-20 |
| Fedora
6
2006-10-24 |
| Fedora
7
2007-05-31 |
| Fedora
8
2007-11-08 |
| Fedora
9
2008-05-13 |
| Fedora
10
2008-11-25 |
@ linuxbox ~] $ sort -k 1,1 -k distros.txt
2n |2006-05-11
distros-TBL -f| SED .sed | Groff -t> ~ /
| [me
SUSE
10.1
Escritorio
/
foo.ps
| SUSE
10.2
2006-12-07 |
| SUSE
10.3
2007-10-04 |
| SUSE
11.0
2008-06-19 |
| Ubuntu
2006-06-01 |
6.06
| Ubuntu
2006-10-26 |
6.10
| Ubuntu
7.04
2007-04-19 |
| Ubuntu
7.10
2007-10-18 |
| Ubuntu
8.04
2008-04-24 |
| Ubuntu
8.10
2008-10-30 |
+ -----------+
Adicin de la opcin -t para groff instruye a pre-proceso de la secuencia de texto con TBL. Del
mismo modo, la opcin -T se utiliza para la salida a ASCII en lugar de el medio de salida por
defecto, PostScript.
El formato de la salida es lo mejor que podemos esperar si estamos limitados a las capacidades
de un terminal de pantalla o impresora de estilo mquina de escribir. Si especificamos salida
PostScript y grficamente ver la salida resultante, obtenemos un resultado mucho ms
satisfactorio:
323

21 - Formato de salida

Figura 5: Visualizacin de la tabla final

Resumiendo
Teniendo en cuenta que el texto es tan central en el carcter de los sistemas operativos tipo
Unix, que tiene sentido que habra muchas herramientas que se utilizan para manipular y dar
formato al texto. Como hemos visto, hay! Las sencillas herramientas de formato como FMT y
pr encontrarn muchos usos en las secuencias de comandos que producen documentos cortos,
mientras que Groff (y amigos) se pueden utilizar para escribir libros. Nunca podemos escribir
un documento tcnico utilizando herramientas de lnea de comandos (aunque hay muchas
personas que lo hacen!), Pero es bueno saber que hemos podido.

Lectura adicional

324

Gua del usuario Groff


http://www.gnu.org/software/groff/man
ual/

Escribir papeles con nroff Usando -Yo:


http://docs.freebsd.org/44doc/usd/19.memacros/paper.pdf

-me Manual de referencia:

http://docs.freebsd.org/44doc/usd/20.meref/paper.pdf

Lectura
adicional

325

Tbl - Un programa para los cuadros de formato:


http://plan9.bell-labs.com/10thEdMan/tbl.pdf

Y, por supuesto, probar los siguientes artculos en Wikipedia:


http://en.wikipedia.org/wiki/TeX http://en.wikipedia.org/wiki/Donald
Knuth http://en.wikipedia.org/wiki/Typesetting

22 - Impresin

22 -Impresin
Despus de pasar los ltimos dos captulos de manipulacin de texto, es el momento de poner
ese texto en el papel. En este captulo, vamos a ver las herramientas de lnea de comandos que
se utilizan para imprimir archivos y controlar el funcionamiento de la impresora. No vamos a
estar viendo cmo configurar la impresin, como que vara desde la distribucin hasta la
distribucin y por lo general se configura automticamente durante la instalacin. Tenga en
cuenta que vamos a necesitar una configuracin de la impresora de trabajo para llevar a cabo
los ejercicios de este captulo.
Vamos a discutir los siguientes comandos:

PR - Convertir archivos de texto para la impresin

LPR - Imprimir archivos

a2ps - archivos con formato para imprimir en una impresora PostScript

lpstat - Mostrar informacin de estado de la impresora

lpq - Mostrar el estado de la cola de impresin

lprm - Cancelar trabajos de impresin

Una breve historia de la imprenta


Para entender completamente las funciones de impresin que se encuentran en los sistemas
operativos de tipo Unix, primero tenemos que aprender un poco de historia. Impresin en
sistemas tipo Unix se remonta al inicio del sistema operativo en s. En aquellos das, las
impresoras y la forma en que se utilizaron fue muy diferente de hoy.

Impresin En El Dim Tiempos


Al igual que los ordenadores, las impresoras en la era pre-PC tienden a ser grandes, caros, y
centralizado. El usuario de la computadora tpica de 1980 trabaj en un terminal conectado a
un ordenador a cierta distancia. La impresora se encuentra cerca de la computadora y estaba
bajo la atenta mirada de los operadores de la computadora.
Cuando las impresoras eran caras y centralizada, ya que a menudo se encontraban en los
primeros das de Unix, era una prctica comn para muchos usuarios compartir una
impresora. Para identificar los trabajos de impresin BE326

Una breve historia de la imprenta


anhelo de un usuario en particular, un titular de pgina que muestra el nombre del usuario a
menudo se imprime al principio de cada trabajo de impresin. El personal de soporte
informtico sera entonces cargar un carro que contiene los trabajos de impresin del da y
entregarlos a los usuarios individuales.

Impresoras basada en caracteres


La tecnologa de impresin de los aos 80 era muy diferente en dos aspectos. En primer lugar,
las impresoras de la poca eran casi siempre las impresoras de impacto. Las impresoras de
impacto utilizan un mecanismo mecnico que golpea una cinta contra el papel para formar
impresiones de caracteres de la pgina. Dos de las tecnologas populares de la poca eran la
impresin de margarita y la impresin de matriz de puntos.
El segundo, y ms importante caracterstica de las impresoras tempranas era que las
impresoras utilizan un conjunto fijo de personajes que eran intrnsecos al propio dispositivo.
Por ejemplo, una impresora de margarita slo poda imprimir los caracteres realmente
moldeados en los ptalos de la margarita. Esto hizo que las impresoras tanto como mquinas
de escribir de alta velocidad. Al igual que con la mayora de las mquinas de escribir, que
imprimen utilizando (ancho fijo) fuentes de monoespaciado. Esto significa que cada carcter
tiene la misma anchura. La impresin se realiza en posiciones fijas en la pgina, y el rea de
impresin de una pgina contiene un nmero fijo de caracteres. La mayora de las impresoras
imprimen diez caracteres por pulgada (CPI) en horizontal y seis lneas por pulgada (LPI) en
sentido vertical. El uso de este esquema, una hoja de EE.UU.-carta de papel es de 85 caracteres
de ancho y 66 lneas de alta. Teniendo en cuenta un pequeo margen a cada lado, 80 caracteres
se consider la anchura mxima de una lnea de impresin. Esto explica por qu las pantallas
terminales (y nuestros emuladores de terminal) son normalmente de 80 caracteres de ancho.
Proporciona un WYSIWYG (lo que ves es lo que obtienes) vista de la salida impresa,
utilizando una fuente monoespaciada.
Los datos se envan a una impresora de la mquina de escribir como en una corriente simple
de los bytes que contienen los caracteres a imprimir. Por ejemplo, para imprimir una "a", se
enva el cdigo de caracteres ASCII 97. Adems, los cdigos de control de baja numerada
ASCII proporcionan un medio de movimiento del carro y el papel de la impresora, utilizando
cdigos de retorno de carro, avance de lnea, forma de alimentacin, etc. El uso de los cdigos
de control, es posible lograr algunos efectos de fuente limitados, tales como negrita, por tener
la impresora imprime un carcter, de retroceso, y se imprime el carcter de nuevo para
obtener una impresin ms oscura de impresin en la pgina. De hecho, podemos presenciar
esto si usamos nroff para hacer una pgina de manual y examine la salida utilizando -Un gato:

[Me @ linuxbox ~] $ zcat /usr/share/man/man1/ls.1.gz | nroff -man | -Un gato |


cabeza
LS (1)
Comandos de usuario
LS (1)
$
$
$
NAHNAAHAMAHMEAHE $
ls - Lista el contenido del directorio $
327

$
SAHSYAHYNAHNOAHOPAHPSAHSIAHISAHS $
lAHlsAHs [_AHO_AHP_AHT_AHI_AHO_AHN] ... [_AHF_AHI_AHL_AHE] ... $
22 - Impresin
El AH caracteres (Control-h) son los retrocesos que se utilizan para crear el efecto negrita. Del
mismo modo, tambin podemos ver una secuencia de retroceso / guin bajo se usa para
producir el subrayado.

Impresoras grficas
El desarrollo de interfaces grficas de usuario llev a grandes cambios en la tecnologa de la
impresora. Medida que las computadoras se movieron a ms pantallas basadas en imgenes,
la impresin se mud de carcter-basado a las tcnicas grficas. Esto fue facilitado por el
advenimiento de la impresora lser de bajo costo que, en lugar de imprimir caracteres fijos,
podra imprimir pequeos puntos en cualquier lugar del rea imprimible de la pgina. Esto
hizo que la impresin de las fuentes proporcionales (como los utilizados por los tipgrafos), e
incluso fotografas y diagramas de alta calidad, es posible.
Sin embargo, al pasar de un esquema basado en el personaje de un esquema grfico presenta
un desafo tcnico formidable. He aqu por qu: El nmero de bytes necesarios para llenar una
pgina con una impresora basada en caracteres se puede calcular de esta manera (suponiendo
60 lneas por pgina conteniendo cada una 80 caracteres):
60 x 80 = 4800 bytes
En comparacin, un 300 puntos por pulgada (DPI) impresora lser (suponiendo una superficie
de 8 por 10 pulgadas de impresin por pgina) requiere:
( 8 X 300) X (10 X 300) / 8 = 900.000 bytes
Muchas de las redes de PC lentas simplemente no poda manejar los casi un megabyte de
datos necesarios para imprimir una pgina completa en una impresora lser, por lo que era
evidente que se necesitaba una invencin ingeniosa.
Esa invencin result ser el lenguaje de descripcin de pgina (PDL). Un lenguaje de
descripcin de pgina es un lenguaje de programacin que se describe el contenido de una
pgina. Bsicamente, dice, "ir a esta posicin, dibuja el carcter 'a' en 10 puntos Helvetica, vaya
a esta posicin ..." hasta que se describe todo lo que en la pgina. La primera gran PDL fue
PostScript de Adobe Systems, que todava est en uso amplio hoy. El lenguaje PostScript es un
com - lenguaje de programacin completa adaptada a la tipografa y otros tipos de grficos e
imgenes. Se incluye una funcin de apoyo a los 35 estndar, fuentes de alta calidad, adems
de la posibilidad de aceptar las definiciones de fuentes adicionales en tiempo de ejecucin. En
un primer momento, el apoyo a PostScript fue construido en los propios impresoras. Esto
resuelve el problema de la transmisin de datos. Si bien el programa PostScript tpica era muy
prolijo en comparacin con el flujo de bytes sencillo de impresoras basadas en caracteres, que
era mucho ms pequeo que el nmero de bytes necesarios para representar a toda la pgina
impresa.
Una impresora PostScript acept un programa PostScript como entrada. La impresora
contena su
328

Una breve historia de la imprenta


propio procesador y la memoria (lo que a menudo la impresora un ordenador ms potente
que el ordenador al que se adjunta) y ejecutado un programa especial llamado un intrprete
de PostScript, que ley el programa PostScript entrante y rindi los resultados en la memoria
interna de la impresora, formando de esta manera el patrn de bits (puntos) que se transfiere
al papel. El nombre genrico de este proceso de hacer algo en un patrn de bits grande
(llamado un mapa de bits) es el procesador de imgenes raster o RIP.
A medida que los aos pasaron, ambos equipos y redes se convirti en mucho ms rpido.
Esto permiti que el RIP para pasar de la impresora al ordenador central, que, a su vez,
permite impresoras de alta calidad para ser mucho menos costoso.
Muchas impresoras de hoy todava aceptan flujos basados en caracteres, pero muchas
impresoras de bajo costo no lo hacen. Se basan en RIP de la computadora host para
proporcionar una corriente de bits a imprimir como puntos. Todava hay algunas impresoras
PostScript, tambin.

Impresin con Linux


Sistemas Linux modernos emplean dos suites de software para llevar a cabo y gestionar la
impresin. Los primeros, CUPS (Common UNIX Printing System) proporciona controladores
de impresin y gestin de trabajos de impresin, y la segunda, Ghostscript, un intrprete de
PostScript, acta como un PIR.
CUPS gestiona impresoras mediante la creacin y el mantenimiento de las colas de impresin.
Como ya comentamos en nuestra leccin de historia anterior, la impresin de Unix fue
originalmente diseado para administrar una impresora centralizada compartida por varios
usuarios. Ya que las impresoras son lentos por naturaleza, en comparacin con los equipos
que estn alimentando ellos, sistemas de impresin necesitan una manera de programar
varios trabajos de impresin y mantener las cosas organizadas. CUPS tambin tiene la
capacidad de reconocer diferentes tipos de datos (dentro de lo razonable) y puede convertir
archivos a un formato imprimible.

Preparacin de los ficheros para la impresin


Como usuarios de la lnea de comandos, que son en su mayora interesados en la impresin de
texto, aunque sin duda es posible imprimir otros formatos de datos tambin.

PR - Convertir archivos de texto para impresin


Nos fijamos en pr un poco en el captulo anterior. Ahora vamos a examinar algunas de sus
muchas opciones que se utilizan junto con la impresin. En nuestra historia de la imprenta,
vimos cmo las impresoras basadas en caracteres utilizan fuentes de monoespaciado, lo que
resulta en un nmero fijo de caracteres por lnea y lneas por pgina. PR se utiliza para ajustar
el texto para que quepa en un tamao de pgina especfico, con encabezados de pgina y
mrgenes opcionales. He aqu un resumen de sus opciones ms comnmente utilizadas:
Tabla 22-1: Opciones pr Comn
Opcin

Descripcin

22 - Impresin
+ Primera [: pasado]
-Columnas
-a

-d
"Formato" -D

-f
-h "cabecera"
longitud -l

329
Salida de una serie de pginas que empiezan por primera y,
opcionalmente, terminando con el ltimo.
Organizar el contenido de la pgina en el nmero de columnas
especificadas por columnas.
Por defecto, la salida de varias columnas aparece verticalmente.
Mediante la adicin de la opcin -a (al otro lado), el contenido
aparece horizontalmente.
Salida doble espacio.
Dar formato a la fecha que aparece en los encabezados de pgina
utilizando el formato. Vea la pgina del manual para el comando
fecha para una descripcin de la cadena de formato.
Usar formulario alimenta en lugar de retornos de carro para separar
las pginas.
En la parte central de la cabecera de la pgina, utilice encabezado
en lugar del nombre del archivo que se est procesando.
Conjunto longitud de la pgina a la longitud. El valor
predeterminado es 66 (letras a 6 lneas por pulgada)

-n

Las rectas numricas.

-o compensar
anchura w

Crear un personajes compensar margen izquierdo de ancho.


Conjunto ancho de pgina a la anchura. El valor predeterminado es
72.

pr se utiliza a menudo en las tuberas como un filtro. En este ejemplo, vamos a producir una
lista de directorios de / usr / bin y formatearlo en paginado, la salida de tres columnas
utilizando pr:

[Me @ linuxbox ~] $

ls / usr / bin | PR -3 -w 65 | cabeza

02.18.2009 14:00

411toppm
a2p
a2ps
a2ps-lpr-wrapper

330

Page 1
apturl
Arkansas
arecord
arecordmidi
arca

BSD-escritura
BSH
btcflash
bug-buddy
buildhash

El envo de un trabajo de
impresin en una impresora

El envo de un trabajo de impresin en una impresora


La suite de impresin CUPS admite dos mtodos de impresin utilizados histricamente en
sistemas tipo Unix. Un mtodo, llamado Berkeley o LPD (utilizado en la versin Berkeley
Software Distribution de Unix), utiliza el programa lpr, mientras que el otro mtodo, llamado
SysV (de la versin del sistema V de Unix), utiliza el programa lp. Ambos programas hacen
ms o menos lo mismo. La eleccin de uno sobre el otro es una cuestin de gusto personal.

LPR - Archivos de impresin (Berkeley Estilo)


El programa lpr se puede utilizar para enviar archivos a la impresora. Puede tambin
utilizado en las tuberas, ya que acepta la entrada estndar. Por ejemplo, para imprimir los
resultados de nuestro directorio de varias columnas lista anterior, podramos hacer esto:

[Me @ linuxbox ~] $ ls / usr / bin | PR -3 | lpr


y el informe se enviar a la impresora predeterminada del sistema. Para enviar el archivo a
una impresora diferente, la opcin -P se puede utilizar de esta manera:

lpr -P
nombre_impresora
donde nombre_impresora es el nombre de la impresora deseada. Para ver una lista de las
impresoras que se sabe que el sistema:
[Me @ linuxbox ~] $ lpstat -a

Sugerencia: Muchas distribuciones de Linux le permiten definir una "impresora"


que da salida a los archivos en formato PDF (Portable Document Format), en
lugar de imprimir en la impresora fsica. Esto es muy til para experimentar con
los comandos de impresin. Revise su programa de configuracin de la
impresora para ver si es compatible con esta configuracin. En algunas
distribuciones, es posible que necesite instalar paquetes adicionales (como
cups-pdf) para habilitar esta funcin.
Estas son algunas de las opciones comunes para
lpr:

331

22 - Impresin ________________
Tabla 22-2: Opciones lpr comunes
Opcin

Descripcin

- # Nmero
-P

Establecer el nmero de copias a nmero.

-P Impresora
-r

Imprima cada pgina con un encabezado sombreado con la fecha, hora,


nombre del trabajo, y el nmero de pgina. Esta opcin llamada
"impresin bonita" se puede utilizar al imprimir archivos de texto.
Especifique el nombre de la impresora utilizada para la salida. Si no
se especifica una impresora, se utiliza la impresora predeterminada
del sistema.
Eliminar archivos despus de la impresin. Esto sera til para los
programas que producen archivos de impresora de salida
temporal.

lp - Imprimir archivos (System V Estilo)


Como LPR, lp acepta cualquiera de los archivos o la entrada estndar para la impresin. Se
diferencia de LPR en que es compatible con un conjunto de opciones diferentes (y un poco
ms sofisticado). Estas son las opciones comunes:
Tabla 22-3: Opciones IP comunes
Opcin
-d impresora

Descripcin
Establezca el destino (impresora) a la impresora. Si no
se especifica ninguna opcin d, se utiliza la impresora
por defecto del sistema.

-n nmero

Ajuste el nmero de copias a nmero.

-o paisaje
-o fitplot

Ajuste de salida a la orientacin horizontal.


Escalar el archivo para ajustarse a la pgina. Esto es
til cuando se imprimen imgenes, como archivos
JPEG.
Escala de archivos a nmero. El valor de 100 llena la
pgina. Los valores inferiores a 100 se reducen,
mientras que los valores superiores a 100 causa el
archivo que desea imprimir a travs de mltiples
pginas.
Establezca los caracteres de salida por pulgada a
nmero. El valor predeterminado es 10.

-o escala = nmero

-o cpi = nmero
-o LPI = nmero

332

Establecer las lneas de salida por pulgada al nmero.


El valor predeterminado es 6.

0 ooo
1 111

El envo de un trabajo de impresin en una impresora


pgina de fondo = puntos
pgina izquierda = puntos
pgina derecha = puntos
pgina-top = puntos
-P pginas

Establezca los mrgenes de la pgina. Los valores se


expresan en puntos, una unidad de medida
tipogrfica. Hay 72 puntos en una pulgada.
Especifique la lista de pginas. pginas pueden
expresarse como una lista separada por comas y / o
un rango. Por ejemplo, "1,3,5,7-10"

Vamos a producir nuestro listado de directorio nuevo, esta vez de imprimir 12 IPC y 8 LPI con
[Me @ linuxbox ~] $ ls / usr / bin | pr -4 -w 90 -l 88 | lp -o pgina-izquierda = 36 -o cpi =
12 -o lpi = 8
un margen izquierdo de media pulgada. Tenga en cuenta que tenemos que ajustar las
opciones de pr para dar cuenta del nuevo tamao de pgina:
Este gasoducto produce una lista de cuatro columnas utilizando el tipo ms pequeo que el
valor por defecto. El aumento del nmero de caracteres por pulgada nos permite encajar ms
columnas en la pgina.

Otra opcin: a2ps


El programa a2ps es interesante. Como se puede suponer a partir de su nombre, es un
programa de conversin de formato, pero tambin mucho ms. Su nombre originalmente
significaba "ASCII a PostScript" y se utiliza para preparar los archivos de texto para imprimir
en impresoras PostScript. Con los aos, sin embargo, las capacidades del programa han
crecido, y ahora su nombre significa "Cualquier cosa a PostScript." Si bien su nombre indica
[Me @ linuxbox ~] $ ls / usr / bin | PR -3 -t | a2ps -o ~ / Escritorio / ls.ps -L 66
[Stdin (normal): 11 pginas de 6 hojas]
[Total: 11 pginas de 6 hojas] guardado en el archivo '/ home / me / Escritorio / ls.ps'
un programa de conversin de formato, es en realidad un programa de impresin. Se enva su
salida por defecto a la impresora predeterminada del sistema en lugar de la salida estndar.
Comportamiento predeterminado del programa es la de una "impresora bastante", lo que
significa que mejora el aspecto de la produccin. Si utilizamos el programa para crear un
archivo PostScript en nuestro escritorio:
Aqu vamos a filtrar la corriente con la banda, utilizando la opcin -t (omitir los encabezados y
pies de pgina) y luego con a2ps, especificando un archivo de salida (opcin -0) y 66 lneas por
pgina (opcin -L)

333

22 - Impresin para que coincida con la salida de la paginacin de pr. Si consideramos que el
archivo resultante con un visor de archivos adecuado, vamos a ver esto:

Figura 6: Visualizacin de a2ps salida


Como podemos ver, el diseo de salida predeterminada es el formato "dos arriba". Esto hace
que el contenido de 2 pginas que se imprimen en cada hoja de papel. a2ps aplica encabezados
y pies de pgina agradable, tambin.
a2ps tiene un montn de opciones. un resumen:
Aqu es
Tabla 22-4: a2ps Opciones
Opcin

Descripcin

texto --center-ttulo
--columns nmero

Establecer pgina del centro de ttulo al texto.


Organizar las pginas en columnas numricas. El
valor predeterminado es 2.

334

El envo de un trabajo de impresin en una impresora


texto --footer
Pgina Establecer pie de pgina al texto.
--guess

Informar sobre los tipos de archivos dados como


argumentos. Desde a2ps intenta convertir y
formatear todo tipo de datos, esta opcin puede
ser til para predecir lo que van a hacer a2ps
cuando se les da un archivo en particular.

texto --left-pie de pgina

Set-pgina izquierda de pie de pgina al texto.

texto --left-ttulo

Set-pgina izquierda ttulo al texto.


Nmero de lneas de salida de cada lneas de
intervalo.

--line-nmeros = intervalo
--list = por defecto
--list = tema

--pages gama

Configuracin de pantalla predeterminada.


Configuracin de pantalla para el tema, donde el
tema es uno de los siguientes: las delegaciones
(programas externos que se utilizarn para
convertir los datos), codificaciones, caractersticas,
variables, medios de comunicacin (los tamaos
de papel y similares), PPD (descripciones de
impresora PostScript), impresoras, prlogos
(porciones de cdigo que llevan el prefijo de salida
normal), hojas de estilo, y opciones de usuario.
Imprimir pginas en rango.

texto --right-pie de pgina

Ajuste el botn derecho del pie de pgina al texto.

texto --right-ttulo
--rows nmero

Establecer ttulo haga pgina de texto.

-B

No hay encabezados de pgina.

texto -b

Cabecera Set pgina al texto.

tamao -f
-l nmero

Utilice la fuente punto tamao.

-L Nmero

Establecer lneas por pgina nmero.


Use el nombre los medios de comunicacin. Por
ejemplo, "A4".
Nmero de salida copias de cada pgina.

Nombre -M
-n nmero

Organizar las pginas en las filas de nmeros. El


valor predeterminado es uno.

Set caracteres por lnea a nmero. Esto y la opcin


-L (abajo) se puede utilizar para hacer que los
archivos paginados con otros programas, como pr,
encaja correctamente en la pgina.

335

22 - Impresin
-o archivo
-P Impresora
-R
-r
-T Nmero
texto -u

Enva la salida a un archivo. Si no se especifica


archivo como "-", utilice la salida estndar.
Utilice la impresora. Si no se especifica una
impresora, se utiliza la impresora por defecto del
sistema.
Orientacin vertical.
Orientacin horizontal.
Pestaa Configure detiene a cada caracteres
numricos.
(Marcas de agua) pginas arpillera con el texto.

Esto es slo un resumen. a2ps tiene varias opciones ms.

Nota: a2ps todava est en desarrollo activo. Durante mis pruebas, me di cuenta de un
comportamiento diferente en varias distribuciones. En CentOS 4, la produccin
siempre fue a la salida estndar de forma predeterminada. En CentOS 4 y Fedora 10, la
salida por defecto en los medios A4, a pesar del programa que se est configurado para
utilizar los medios de comunicacin de tamao carta por defecto. Pude superar estos
problemas mediante la especificacin explcita la opcin deseada. En Ubuntu 8.04, a2ps
realizado tal como se documenta.
Tambin tenga en cuenta que hay otra formateador de salida que es til para la
conversin de texto a PostScript. Enscript Llamado, puede realizar muchas de las
mismas clases de formato e impresin trucos, pero a diferencia de a2ps, slo acepta la
introduccin de texto.

Seguimiento y control de los trabajos de impresin


Como los sistemas de impresin de Unix estn diseados para manejar varios trabajos de
impresin de varios usuarios, CUPS est diseado para hacer lo mismo. Cada impresora se da
una cola de impresin, donde estn estacionados los trabajos hasta que puedan ser almacenan
en la impresora. CUPS suministros varios programas de lnea de comandos que se utilizan
para gestionar el estado de la impresora y las colas de impresin. Al igual que los programas
lpr y lp, estos programas de gestin son el modelo de los programas correspondientes de los
sistemas de impresin de Berkeley y System V.

lpstat - pantalla de estado del sistema de impresin


El programa lpstat es til para determinar los nombres y la disponibilidad de las impresoras
en el sistema. Por ejemplo, si tuviramos un sistema tanto con una impresora fsica (llamado
"impresora") y una impresora virtual de PDF (llamado "PDF"), podramos comprobar su
estado as:

336

[Me @ linuxbox ~] $ lpstat -a


Aceptando solicitudes PDF desde lun 08 de diciembre 2008 03:05:59 PM EST
impresora aceptando peticiones desde mar 24 de febrero 2009 08:43:22 AM EST
[Me @ linuxbox ~] $ lpstat destino por defecto del sistema -s: dispositivo de
impresora para PDF: cups-pdf: /
dispositivo para la impresora: ipp: // servidor de impresin: 631 / printers
/ impresora
Seguimiento y control de los trabajos de impresin
Adems, pudimos determinar una descripcin ms detallada de la configuracin del sistema
de impresin de esta manera:
En este ejemplo, vemos que "la impresora" es la impresora predeterminada del sistema y que
es una impresora de red utilizando el protocolo de impresin de Internet (IPP: //) conectada a
un sistema llamado "servidor de impresin".
Las opciones comnmente tiles incluyen:
Tabla 22-5: Opciones lpstat Comn
Opcin
-a [impresora ...]

-d
-p [impresora ...]

Descripcin
Visualizar el estado de la cola de impresin para la impresora.
Tenga en cuenta que este es el estado de la capacidad de la cola
de impresin a aceptar puestos de trabajo, no el estado de las
impresoras fsicas. Si no se especifican impresoras, se muestran
todas
laselcolas
de impresin.
Mostrar
nombre
de la impresora predeterminada del
sistema.
Muestra el estado de la impresora especificada. Si no se
especifican impresoras, se muestran todas las impresoras.

-r

Muestra el estado del servidor de impresin.

-s
-t

Mostrar un resumen de estado.


Visualizar un informe de estado completo.

lpq - Pantalla de estado de la cola de la impresora


Para ver el estado de una cola de impresin, se utiliza el programa lpq. Esto nos permite ver el
estado de la cola y los trabajos de impresin que contiene. He aqu un ejemplo de una cola
vaca para una impresora por defecto del sistema llamado "impresora":

337

22 Impresin
[Me @ linuxbox ~]
impresora $ lpq hay
entradas listo
Si no se especifica una impresora (usando la opcin -P), se muestra la impresora
predeterminada del sistema. Si enviamos un trabajo a la impresora y luego miramos a la cola,
lo veremos en la lista:
[Me @ linuxbox ~] $ ls * .txt | PR -3 | lp
solicitud id es la impresora 603-(1 archivo (s))
[Me @ linuxbox ~] $ lpq impresora est lista y la
impresin
Rango
Propietario
Trabajo
Tamao total
me activo
603
(Stdin)

Archivo

(s)

1024 bytes

lprm / cancelar - Cancelar trabajos de impresin


CUPS suministra dos programas que se utilizan para terminar los trabajos de impresin y
eliminarlos de la cola de impresin. Uno de ellos es el estilo de Berkeley (lprm) y el otro es de
System V (cancelar). Ellos difieren ligeramente en las opciones que soportan, pero lo hacen
bsicamente lo mismo. Usando nuestro trabajo de impresin anterior como ejemplo,
podramos detener el trabajo y eliminar de esta manera:
[Me @ linuxbox ~] $ cancelo 603
[me @ linuxbox ~] impresora $ lpq
hay entradas listo

Cada comando tiene opciones para eliminar todos los puestos de trabajo que pertenecen a un
usuario en particular, en particular de la impresora, y mltiples nmeros de trabajo. Sus
respectivas pginas man tienen todos los detalles.

Resumiendo
En este captulo, hemos visto cmo las impresoras del pasado influyeron en el diseo de los
sistemas de impresin en mquinas Unix, y cunto control est disponible en la lnea de
comandos para controlar no slo la programacin y ejecucin de los trabajos de impresin,
sino tambin las distintas opciones de salida.

Lectura adicional
Un buen artculo sobre el lenguaje de descripcin de pgina
PostScript: http://en.wikipedia.org/wiki/PostScript
338

Lectura
adicional

El sistema comn de impresin de UNIX (CUPS): Sistema


http://en.wikipedia.org/wiki/Common Unix Printing
http://www.cups.org/

Los sistemas de impresin V de Berkeley y del sistema:


http://en.wikipedia.org/wiki/Berkeley sistema de
impresin http://en.wikipedia.org/wiki/System sistema
de impresin V

339

23 - Programas de Compilacin

23

- Programas de Compilacin

En este captulo, vamos a ver cmo construir programas por compilar el cdigo fuente. La
disponibilidad del cdigo fuente es la libertad fundamental que hace que Linux sea posible.
Todo el ecosistema de desarrollo de Linux se basa en el libre intercambio entre los
desarrolladores. Para muchos usuarios de escritorio, la compilacin es un arte perdido. Lo que
sola ser bastante comn, pero hoy en da, los proveedores de distribucin de mantener
enormes repositorios de binarios precompilados, listos para descargar y utilizar. En el
momento de escribir estas lneas, el repositorio de Debian (una de la ms grande de cualquiera
de las distribuciones) contiene casi 23.000 paquetes.
Entonces, por compilar el software? Hay dos razones:
1. Disponibilidad. A pesar de la cantidad de programas precompilados en los
repositorios de distribucin, algunas distribuciones pueden no incluir todas las
aplicaciones deseadas. En este caso, la nica manera de conseguir el programa
deseado es compilarlo desde el cdigo fuente.
2. Oportunidad. Mientras algunas distribuciones se especializan en el corte de las
versiones de los bordes de los programas, muchos no lo hacen. Esto significa que con
el fin de tener la ltima versin de un programa, es necesario compilacin.
La compilacin de software de cdigo fuente puede llegar a ser muy complejo y tcnico;
mucho ms all del alcance de muchos usuarios. Sin embargo, muchas de las tareas de
compilacin son muy fciles e involucran slo unos pocos pasos. Todo depende del paquete.
Vamos a ver un caso muy simple con el fin de proporcionar una visin general del proceso y
como un punto de partida para aquellos que deseen emprender estudios posteriores.
Vamos a introducir un nuevo comando:
make - utilidad para mantener los programas

Qu est recopilando?
En pocas palabras, la compilacin es el proceso de traducir el cdigo fuente (la descripcin
legible por humanos de un programa escrito por un programador) en el idioma nativo del
procesador del ordenador.
El procesador del ordenador (o CPU) funciona a un nivel muy elemental, la ejecucin de
programas en lo que se llama en lenguaje de mquina. Este es un cdigo numrico que
describe muy pequeas operaciones, como "aadir este byte", "punto de esta ubicacin en la
memoria," o "copiar este byte."
340

Qu est recopilando?
Cada una de estas instrucciones se expresa en binario (unos y ceros). Los programas
informticos ms antiguos fueron escritos utilizando el cdigo numrico, lo que puede
explicar por qu los programadores que escribieron se dijo a fumar mucho, beber litros de
caf, y llevar gafas gruesas.
Este problema fue superado por el advenimiento del lenguaje ensamblador, que sustituy a
los cdigos numricos con (un poco) ms fcil de usar caracteres mnemotcnicos como CPY
(por copia) y MOV (para mover). Los programas escritos en lenguaje ensamblador se procesan
en lenguaje de mquina por un programa llamado un ensamblador. El lenguaje ensamblador
se sigue utilizando hoy en da para ciertas tareas de programacin especializados, tales como
controladores de dispositivos y sistemas embebidos.
A continuacin llegamos a lo que se denominan lenguajes de programacin de alto nivel. Se
llaman as porque permiten que el programador sea menos preocupados con los detalles de lo
que el procesador est haciendo y ms con la solucin del problema en cuestin. Los primeros
(desarrollados durante la dcada de 1950) incluyeron FORTRAN (diseado para tareas
cientficas y tcnicas) y COBOL (diseado para aplicaciones de negocios). Ambos estn
todava en uso limitado en la actualidad.
Si bien hay muchos lenguajes de programacin populares, dos predominan. La mayora de los
programas escritos para sistemas modernos estn escritos en C o C + +. En los ejemplos a
seguir, vamos a compilar un programa C.
Los programas escritos en lenguajes de programacin de alto nivel se convierten en lenguaje
de mquina por procesarlos con otro programa, llamado compilador. Algunos compiladores
traducen las instrucciones de alto nivel en lenguaje ensamblador y luego usar un ensamblador
para realizar la etapa final de la traduccin a lenguaje de mquina.
Un proceso a menudo se utiliza junto con la compilacin se llama enlace. Hay muchas tareas
comunes realizadas por los programas. Tomemos, por ejemplo, la apertura de un archivo.
Muchos programas de realizar esta tarea, pero sera un desperdicio tener cada programa a
implementar su propia rutina para abrir los archivos. Tiene ms sentido tener una sola pieza
de programacin que sabe cmo abrir los archivos y permitir que todos los programas que se
necesitan para la comparten. Proporcionar apoyo a las tareas comunes se logra mediante lo
que se denominan bibliotecas. Contienen mltiples rutinas, cada uno realizando alguna tarea
comn que varios programas pueden compartir. Si nos fijamos en el directorio / lib y / usr /
lib, podemos ver que muchos de ellos viven. Un programa llamado un enlazador se utiliza
para formar las conexiones entre la salida del compilador y las bibliotecas que el programa
compilado requiere. El resultado final de este proceso es el archivo de programa ejecutable,
listo para su uso.

Se compilan todos los programas?


No. Como hemos visto, hay programas como shell scripts que no requieren la compilacin. Se
ejecutan directamente. Estos estn escritos en lo que se conoce como scripts o lenguajes
interpretados. Estas lenguas han crecido en popularidad en los ltimos aos e incluyen Perl,
Python, PHP, Ruby, y muchos otros.
Lenguajes de secuencias de comandos se ejecutan por un programa especial llamado un
intrprete. Un intrprete introduce el archivo de programa y lee y ejecuta cada instruccin en

ella contenidas. En
341

23 - Programas de Compilacin en general, interpretado programas se ejecutan mucho ms


lentamente que los programas compilados. Esto se debe a que cada instruccin de cdigo
fuente en un programa interpretado se traduce cada vez que se lleva a cabo, mientras que con
un programa compilado, una instruccin de cdigo fuente se traduce slo una vez, y esta
traduccin se registra permanentemente en el archivo ejecutable final.
Entonces por qu se interpretan lenguas tan popular? Para muchas tareas de programacin,
los resultados son "lo suficientemente rpido", pero la verdadera ventaja es que por lo general
es ms rpido y ms fcil de desarrollar programas interpretados que los programas
compilados. Los programas se desarrollan por lo general en un ciclo de repeticin de cdigo,
compilar, probar. Como un programa crece en tamao, la fase de compilacin del ciclo puede
llegar a ser bastante largo. Los lenguajes interpretados eliminar el paso de compilacin y de
este modo acelerar el desarrollo del programa.

Compilar un programa en C
Vamos a compilar algo. Antes de hacerlo, sin embargo, vamos a necesitar algunas
herramientas como el compilador, el enlazador, y hacer. El compilador de C utilizado casi
universalmente en el entorno Linux se llama gcc (GNU C Compiler), originalmente escrito por
[Me @ linuxbox ~] $ que gcc / usr
/ bin / gcc
Richard Stallman. La mayora de las distribuciones no instalan gcc por defecto. Podemos
comprobar para ver si el compilador est presente como esto:
Los resultados en este ejemplo indican que el compilador est instalado.

Punta: Su distribucin puede tener una meta paquete (una coleccin de paquetes) para
el desarrollo de software. Si es as, considere la instalacin de que si va a compilar
programas en su sistema. Si su sistema no proporciona un meta-paquete, intente
instalar el gcc y hacer paquetes. En muchas distribuciones, esto es suficiente para llevar
a cabo el siguiente ejercicio.

Obtencin de El Cdigo Fuente


Para nuestro ejercicio compilacin, vamos a elaborar un programa de la llamada diccin
Proyecto GNU. Este es un pequeo programa prctico que comprueba los archivos de texto de
calidad de la escritura y el estilo. Dado que los programas van, es bastante pequea y fcil de
construir.
Despus de la convencin, que estamos en primer lugar vamos a crear un directorio para
nuestro cdigo fuente denominada src y luego descargar el cdigo fuente en que el uso de ftp:

342

Compilar un programa en C
Nota: Puesto que somos el "mantenedor" de este cdigo fuente, mientras que
[Me @ linuxbox ~] $ mkdir src [me @
linuxbox ~] $ cd src [me @ src linuxbox] $
ftp ftp.gnu.org Conectado a ftp.gnu.org.
220 servidor de FTP de GNU listo.
Nombre (ftp.gnu.org:me): annimo 230 Login
xito.
Tipo de sistema remoto es UNIX.
Utilizando el modo binario para transferir
archivos. ftp> cd gnu / diccin 250 Directorio
cambiado correctamente. ftp> ls
200 PORT command successful. Considere el uso de PASV. 150
Aqu viene la lista de directorios.
recopilamos, nos mantendremos en ~ / src. El cdigo fuente instalada por su
68,940
-rw-r -r-1 1003 65534
28 1998 diccin-0.7.tar.gz
agostoMar 04 2002 diccin-1.02.tar.gz
-rw-r -r-1 1003 65534
90957
-rw-r -r-17 2007 diccin-1.11.tar.gz
1 1003 65534 141062
226 Directorio de enviar en Aceptar. septiembre
ftp> get-diccin 1.11.tar.gz
locales: diccin-1.11.tar.gz remoto: diccin-1.11.tar.gz 200 PORT
command successful. Considere el uso de PASV.
150 Apertura conexin en modo BINARIO datos de diccin-1.11.tar.gz (141062
bytes).
226 Archivo enviar Aceptar.
141,062 bytes recibidos en 0,16 segundos (847,4 kB / s) ftp> bye 221 Adis.
[Me @ linuxbox src] $ ls diccin-1.11.tar.gz
distribucin se instalar en / usr / src, mientras que el cdigo fuente destinado a ser
utilizado por mltiples usuarios por lo general se instala en / / local / src usr.
Como podemos ver, el cdigo fuente se suministra generalmente en forma de un archivo tar
comprimido. A veces llamado un archivo tar, este archivo contiene el rbol de cdigo fuente, o
la jerarqua de directorios y archivos que componen el cdigo fuente. Despus de llegar al sitio
ftp, examinamos la lista de alquitrn de los archivos disponibles y seleccione la versin ms
reciente para su descarga. Utilizando el comando get dentro de ftp, copiamos el archivo desde
el servidor FTP para el equipo local.
Una vez que el archivo tar se descarga, se debe desembalar. Esto se realiza con el programa
tar:
[Me @ linuxbox src] $ tar xzf diccin-1.11.tar.gz
343

[me @ linuxbox src] $ ls


diccin-1.11
diccin-1.11.tar.gz
- Programas de Compilacin

23

Consejo: El programa de diccin, al igual que todo el software Proyecto GNU, sigue
ciertas normas para el envasado de cdigo fuente. La mayora otro cdigo fuente
disponible en el ecosistema Linux tambin sigue este estndar. Uno de los elementos
de la norma es que cuando se desempaqueta el archivo de cdigo fuente de alquitrn,
se crear un directorio que contiene el rbol de cdigo fuente, y que este directorio ser
nombrado proyecto-x, xx, que contiene por lo tanto, tanto el nombre del proyecto y su
nmero de versin . Este esquema permite una fcil instalacin de varias versiones del
mismo programa. Sin embargo, a menudo es una buena idea examinar el diseo del
rbol antes de desempaquetarlo. Algunos proyectos no van a crear el directorio, pero
en vez entregar los archivos directamente en el directorio actual. Esto har un lo en su
directorio src de otra manera bien organizada. Para evitar esto, utilice el comando
siguiente para examinar el contenido del archivo tar:
alquitrn tzvf tarfile | cabeza

Examinar el rbol de fuentes


Desembalaje de los resultados de archivos tar en la creacin de un nuevo directorio, llamado
diccin-1.11. Este directorio contiene el rbol de cdigo fuente. Echemos un vistazo en el
interior:
src] $ cd de
[Me @ linuxbox diccionarios
[Me @ linuxbox diccin-1.11] $ ls
config.guess
diction.c
config.h.in
diction.pot
config.sub
diction.spec
configurar
diction.spec.in
configure.in
diction.texi.in
COPIA
es
de
es_ES
de.po
en_GB.po
diction.1.in
getopt1.c

1.11
getopt.c
getopt.h
getopt_int.h
INSTALAR
install-sh
Makefile.in
misc.c
misc.h
NOTICIAS

nl
nl.po
README
sentence.c
sentence.h
style.1.in
style.c
prueba

En ella, vemos una serie de archivos. Programas pertenecientes al Proyecto GNU, as como
muchos otros, se suministrar el README archivos de documentacin, INSTALAR,
NOTICIAS, y la copia. Estos archivos contienen la descripcin del programa, informacin
sobre cmo construir e instalar, y sus trminos de licencia. Siempre es una buena idea leer
detenidamente el README e INSTALL archivos antes de intentar construir el programa.

344

Compilar un programa
en C
Los otros archivos interesantes en este directorio son los que terminan en .c y .h:

[Me @ linuxbox diccin-1.11] $ ls * .c


diction.c getoptl.c getopt.c misc.c sentence.c style.c [me @ linuxbox
diccin-1.11] $ ls * .h getopt.h getopt_int.h misc.h sentence.h

Los archivos .c contienen los dos programas en C suministrados por el paquete (estilo y
diccin), divididos en mdulos. Es una prctica comn para los programas grandes para ser
roto en ms pequeo, ms fcil de manejar piezas. Los archivos de cdigo fuente son texto
normal y pueden ser examinadas con menos:

[Me @ linuxbox diccin-1.11] $ Menos diction.c


Los archivos .h son conocidos como archivos de cabecera. Estos tambin son texto normal.
Archivos de cabecera contienen descripciones de las rutinas incluidas en un archivo de cdigo
fuente o de la biblioteca. Para que el com - piler para conectar los mdulos, debe recibir una
descripcin de todos los mdulos necesarios para completar todo el programa. Cerca del
principio del archivo diction.c, vemos esta lnea:

#include "getopt.h"
Esto indica al compilador que lea las getopt.h de archivos, ya que lee el cdigo fuente en
diction.c con el fin de "saber" lo que est en getopt.c. El archivo getopt.c suministra rutinas
que son compartidos tanto por los programas de estilo y diccin.
Por encima de la declaracin para incluir getopt.h, vemos algn otro incluyen declaraciones
como stas:

#include <regex.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
stos tambin se refieren a archivos de cabecera, sino que se refieren a archivos de cabecera
que viven fuera del rbol fuente de corriente. Ellos son suministrados por el sistema de apoyo
a la recopilacin de todos los programas. Si nos fijamos en / usr / include, podemos verlos:
345

23 - Programas de
Compilacin
[Me @ diccin-1.11 linuxbox] $ ls / usr / include
Se instalarn los archivos de cabecera en este directorio cuando instalamos el
compilador.

La construccin de El Programa
La mayora de los programas construyen con una secuencia de
dos comandos simples,:
./configure
hacer
El programa de configuracin es un script de shell que se suministra con el rbol de cdigo
fuente. Su trabajo consiste en analizar el entorno de construccin. La mayor parte del cdigo
fuente est diseado para ser porttil. Es decir, que est diseado para construir en ms de un
tipo de sistema de tipo Unix. Pero para hacer eso, el cdigo fuente puede tener que someterse
a pequeos ajustes durante la construccin para dar cabida a las diferencias entre los sistemas.
configurar tambin comprueba que las herramientas externas necesarias y se instalan los
componentes. Vamos a ejecutar configure. Desde configure no se encuentra donde la cscara
espera normalmente los programas que se encuentran, debemos decirle explcitamente a la
concha de su ubicacin anteponiendo el comando con ./ para indicar que el programa se
encuentra en el directorio de trabajo actual:
[Me @ linuxbox diccin-1.11] $ ./configure
configurar la salida de la voluntad de una gran cantidad de mensajes, ya que pone a prueba y
configura la construccin. Cuando termine, se ver algo como esto:

comprobacin de presencia libintl.h ... s comprobacin de libintl.h ... s


la comprobacin de la biblioteca que contiene gettext ... ninguno requiere
configurar: ./config.status creando
config.status: la creacin de Makefile
config.status: la creacin de diction.1
config.status: la creacin de diction.texi
config.status: la creacin de diction.spec
config.status: la creacin de style.1
config.status: la creacin de la prueba / rundiction
config.status: la creacin de config.h
[Me @ linuxbox diccin-1.11] $

346

Compilar un programa en C
Lo que es importante aqu es que no hay mensajes de error. Si lo hubiera, la configuracin
fall, y el programa no va a construir hasta que se corrijan los errores.
Vemos configure creado varios archivos nuevos en nuestro directorio de origen. La ms
importante es Makefile. Makefile es un archivo de configuracin que instruye al programa
[Me @ linuxbox diccin-1.11] $ Menos Makefile
make exactamente cmo construir el programa. Sin ella, hacer que se negar a ejecutar.
Makefile es un archivo de texto normal, por lo que podemos ver que:
El programa make toma como entrada un archivo MAKE (que normalmente se denomina
Makefile), que describe las relaciones y dependencias entre los componentes que conforman el
programa terminado.
CC =
gcc
La primera parte del archivo MAKE define variables que son sustituidos en las secciones

diccin:

diction.o sentence.o misc.o getopt.o getopt1.o


$ (CC) -o $ @ $ (LDFLAGS) diction.o sentence.o misc.o \ getopt.o
getopt1.o $ (LIBS)
posteriores del makefile. Por ejemplo, vemos la lnea:
que define el compilador de C para ser gcc. Ms tarde, en el makefile, vemos un caso en el que
se acostumbra:
Una sustitucin se lleva a cabo aqu, y el valor $ (CC) se sustituye por gcc en tiempo de
ejecucin.
La mayor parte del archivo MAKE se compone de lneas, que definen un objetivo, en este caso
la diccin archivo ejecutable, y los archivos de los que depende. Las lneas restantes describen
el comando (s) necesario para crear la diana a partir de sus componentes. Vemos en este
ejemplo que la diccin archivo ejecutable (uno de los productos finales) depende de la
existencia de diction.o, sentence.o, misc.o, getopt.o, y getopt1.o. Ms tarde, en el makefile,
vemos las definiciones de cada uno de stos como objetivos:
diction.o:
getopt.o:
getopt1.o:
misc.o:

diction.c config.h getopt.h misc.h sentence.h


getopt.c getopt.h getopt_int.h
getopt1.c getopt.h getopt_int.h
misc.c config.h misc.h

347

23 - Programas de
Compilacin
sentence.o:
style.o:

sentence.c config.h misc.h sentence.h


style.c config.h getopt.h misc.h sentence.h

Sin embargo, no vemos ningn comando especificado para ellos. Esto es manejado por un
objetivo general, anteriormente en el archivo, que describe el comando utilizado para
compilar cualquier archivo .c en un .o
arch
ivo:
.c.o:

$ (CC) -c $ (CPPFLAGS) $ (CFLAGS) $ <

Todo esto parece muy complicado. Por qu no simplemente una lista de todos los pasos para
compilar las partes y que hacer con ella? La respuesta a esto se aclarar en un momento.
Mientras tanto, vamos a correr a hacer y construir nuestros programas:

[Me @ linuxbox diccin-1.11] $ hago


El programa se ejecutar maquillaje, usando los contenidos de Makefile para guiar sus
acciones. Se va a producir una gran cantidad de mensajes.
Cuando termine, veremos que todos los objetivos estn ahora presentes en nuestro directorio:

[Me @ linuxbox diccin-1.11] $ ls


config.guess
de.po
config.h
diccin
config.h.in
diction.1
config.log
diction.1.in
config.status
diction.c
config.sub
diction.o
configurar
diction.pot
configure.in
diction.spec
COPIA
diction.spec.in
de
diction.texi
de.mo
diction.texi.in

es
es_ES
en_GB.mo
en_GB.po
getopt1.c
getopt1.o
getopt.c
getopt.h
getopt_int.h
getopt.o
INSTALAR

install-sh
Makefile
Makefile.in
misc.c
misc.h
misc.o
NOTICIAS
nl
nl.mo
nl.po
README

sentence.c
sentence.h
sentence.o
estilo
style.1
style.1.in
style.c
style.o
prueba

Entre los archivos, vemos diccin y estilo, los programas que nos propusimos construir.
Felicitaciones estn en orden! Nos acaba de compilar nuestros primeros programas de cdigo
fuente!
Pero slo por curiosidad, vamos a correr de nuevo hacer:

348

Compilar un programa
en C
[Me @ linuxbox diccin-1.11] $ make make:
Nada que hacer para el 'todo'.
Slo se produce este extrao mensaje. Qu est pasando? Por qu no construir el programa
de nuevo? Ah, esta es la magia de la marca. En lugar de simplemente construir todo de nuevo,
hacer slo lo que necesita construye edificio. Con todos los objetivos presentes, hacen que
determin que no haba nada que hacer. Podemos demostrar esto mediante la eliminacin de
uno de los objetivos y ejecutar make nuevamente para ver lo que hace. Vamos a deshacernos
de uno de los objetivos intermedios:
[Me @ linuxbox diccin-1.11] $ rm getopt.o [me @
linuxbox diccin-1.1l] $ make
Vemos que marca la reconstruye y re-enlaces a los programas de diccin y estilo, ya que
dependen del mdulo que falta. Este comportamiento tambin seala otra caracterstica
importante de hacer: que mantiene los objetivos hasta la fecha. hacer que insiste en que los
objetivos sean ms reciente que sus dependencias. Esto tiene mucho sentido, como
programador a menudo se actualizar un poco de cdigo fuente y luego hacer uso de
construir una nueva versin del producto terminado. hacer que se asegura de que todo lo que
las necesidades de creacin basado en el cdigo actualizado se construye. Si utilizamos el
programa de toque para "actualizar" uno de los archivos de cdigo fuente, podemos ver que
esto suceda:
[Me @ linuxbox diccin-1.11] $ ls -l diccin getopt.c -rwxr-xr-x 1
m
m 371642009-03-05 6:14
diccin
-rw-r - r-1 m
m
33125 2007-03-30
17:45 getopt.c
[Me @ linuxbox diccin-1.11] $ touch getopt.c [me @ linuxbox diccin-1.11] $
ls -l diccin getopt.c -rwxr-xr-x
1
m
m
37164
2009-03-05 6:14 diccin
-rw-r - r-1 m
m
33125 2009-03-05
6:23 getopt.c
[Me @ linuxbox diccin-1.11] $ hago
Despus de realizar trabajos, vemos que se ha restaurado el objetivo de ser ms reciente que la
dependencia:
[Me @ diccin-1.11 linuxbox] $ ls -l getopt.c diccin -rwxr-xr-x 1 m m
37164 2009-03-05 06:24 diccin
-rw-r - r-- me 1
m
33125 2009-03-05 06:23 getopt.c
La capacidad de cosmticos a construir de forma inteligente slo lo que necesita es un edificio
de gran beneficio para los programadores. Mientras que el tiempo de los ahorros pueden no
ser muy evidente con nuestro pequeo proyecto,
349

23 - Programas de Compilacin es muy significativo con proyectos de mayor envergadura.


Recuerde, el kernel de Linux (un programa que se somete a la modificacin y mejora continua)
contiene varios millones de lneas de cdigo.

Instalacin del programa


Cdigo fuente bien embalados a menudo incluyen un objetivo especial llamado make install.
Este objetivo se instalar el producto final en un directorio del sistema para su uso. Por lo
general, este directorio es / / local / bin usr, la ubicacin tradicional de software construido
localmente. Sin embargo, este directorio no es normalmente permisos de escritura para los
[Me @ linuxbox diccin-1.11] $ sudo make install
[Me @ linuxbox diccin-1.11] $ que la diccin
/ Usr / / bin / diccin locales
[Me @ linuxbox diccin-1.11] $ man diccin
usuarios normales, por lo que debe ser el usuario root para realizar la instalacin:
Despus de realizar la instalacin, podemos comprobar que el programa est listo para ir:
Y ah lo tenemos!

Resumiendo
En este captulo, hemos visto cmo tres rdenes sencillas:
./configure
hacer
make install
puede ser utilizado para construir muchos paquetes de cdigo fuente. Tambin hemos visto el
importante papel que hacen obras de teatro en el mantenimiento de los programas. El
programa make se puede utilizar para cualquier tarea que necesita para mantener una
relacin de destino / dependencia, no slo para compilar el cdigo fuente.

Lectura adicional
La Wikipedia tiene buenos artculos sobre los compiladores y el programa
make:http://en.wikipedia.org/wiki/Compiler
http://en.wikipedia.org/wiki/Make (software)

350

Lectura
adicional
El GNU Make Manual:
http://www.gnu.org/software/make/manual/html nodo /
index.html

351

Parte 4 - Escribiendo Shell


Scripts

Parte 4 - Escribiendo Shell


Scripts

353

24 - Escribir su primer script

24 - Escribir su primer script


En los captulos anteriores, hemos reunido un arsenal de herramientas de lnea de comandos.
Mientras que estas herramientas pueden resolver muchos tipos de problemas de
computacin, todava estamos limitados a ellos utilizando manualmente uno por uno en la
lnea de comandos. No sera fantstico si pudiramos conseguir la cscara para hacer ms de
la obra? Podemos. Al unir nuestras herramientas juntos en programas de diseo propio, la
cscara se puede llevar a cabo complejas secuencias de tareas por s mismo. Podemos
permitirle hacer esto escribiendo scripts de shell.

Qu son los scripts del Shell?


En los trminos ms simples, un script de shell es un archivo que contiene una serie de
comandos. El shell lee este archivo y ejecuta los comandos como si hubieran sido introducidos
directamente en la lnea de comandos.
La cscara es algo nico, ya que es a la vez una poderosa interfaz de lnea de comandos para el
sistema y un intrprete de lenguaje de scripting. Como veremos, la mayora de las cosas que se
pueden hacer en la lnea de comandos se puede hacer en las secuencias de comandos, y la
mayora de las cosas que se pueden hacer en las secuencias de comandos se puede hacer en la
lnea de comandos.
Hemos cubierto muchas caractersticas de concha, pero nos hemos centrado en las
caractersticas ms utilizadas directamente en la lnea de comandos. El shell tambin ofrece un
conjunto de caractersticas por lo general (pero no siempre) que se utiliza al escribir
programas.

Cmo escribir un Shell Script


Para crear con xito y ejecutar un script de shell, que tenemos que hacer tres cosas:
1. Escribir un guin. Los shell scripts son archivos de texto normales. As que
necesitamos un editor de texto para escribirlos. Los mejores editores de texto
proporcionarn resaltado de sintaxis, que nos permite ver una vista con cdigo de
color de los elementos de la secuencia de comandos. El resaltado de sintaxis nos
ayudar detectamos ciertos tipos de errores comunes. vim, gedit, kate, y muchos otros
editores son buenos candidatos para la escritura de guiones.
2. Haga el script ejecutable. El sistema es bastante quisquilloso con no dejar que
cualquier archivo de texto viejo ser tratado como un programa, y por una buena
razn! Tenemos que establecer los permisos del archivo de comandos para permitir la

ejecucin.
354

Cmo escribir un Shell Script


3. Ponga el guin en algn lugar de la cscara puede encontrarlo. El shell busca
automticamente ciertos directorios para archivos ejecutables cuando no se especifica
ningn nombre de ruta explcita. Para una mayor comodidad, vamos a colocar

#! / Bin / bash
# Este es nuestro primer script.
echo 'Hello World!'
nuestros scripts en estos directorios.

Formato de archivo de secuencias de comandos


Siguiendo la tradicin de programacin, vamos a crear un programa "hola mundo" para
demostrar un script muy simple. As que vamos a disparar hasta nuestros editores de texto y
escriba el siguiente script:
La ltima lnea de nuestro script es bastante familiar, slo un comando echo con un
argumento de cadena. La segunda lnea tambin es familiar. Se parece a un comentario que
hemos visto utilizado en muchos de los archivos de configuracin que hemos examinado y
editado. Una cosa acerca de los comentarios de los scripts de shell es que tambin pueden
aparecer en los extremos de las lneas, as:
echo 'Hello World!' # Esto es un comentario demasiado
Todo, desde el smbolo # en adelante en la lnea se ignora.
Como muchas cosas, esto funciona en la lnea de comandos,
[Me @ linuxbox ~] $ echo 'Hello World!' # Esto es un comentario demasiado
Hola Mundo!
tambin:

A pesar de los comentarios son de poca utilidad en la lnea de comandos, que van a trabajar.
La primera lnea de nuestro script es un poco misterioso. Parece que debera ser un
comentario, ya que comienza con #, pero se ve muy a propsito para ser slo eso. El #!
secuencia de caracteres es, de hecho, una construccin especial llamado shebang. El tinglado
se utiliza para indicar al sistema el nombre del intrprete que se debe utilizar para ejecutar la
secuencia de comandos que sigue. Cada shell script debe incluir esto como su primera lnea.
Salvemos nuestro archivo de script como hola_mundo.

355

24 - Escribir su primer script

Permisos de ejecutables
Lo siguiente que tenemos que hacer es hacer nuestro script ejecutable. Esto se hace fcilmente
usando chmod:

[Me @ linuxbox ~] $ ls -l hola_mundo


-rw-r - r-- me 1
m
63 2009-03-07 10:10 hola_mundo
[Me @ linuxbox ~] $ chmod 755 hola_mundo [me
@ linuxbox ~] $ ls -l hola_mundo
-rwxr-xr-x me 1
m
63 2009-03-07 10:10 hola_mundo
Hay dos configuraciones de permisos comunes para las secuencias de comandos; 755 para los
scripts que todo el mundo puede ejecutar, y de 700 para los scripts que slo el propietario
puede ejecutar. Tenga en cuenta que los guiones deben ser legibles con el fin de ser ejecutado.

Ubicacin del archivo de secuencias de


comandos
Con el conjunto de permisos, ahora podemos ejecutar
nuestro script:
[Me @ linuxbox ~] $ ./hello_world
Hola Mundo!
Para que el script para ejecutar, debemos preceder el nombre del script con una ruta explcita.
Si no lo hacemos, obtenemos lo siguiente:
[Me @ linuxbox ~] $ hola_mundo bash:
hola_mundo: comando no encontrado
Por qu es esto? Lo que hace que nuestro script diferente de otros programas? Pues resulta
que, nada. Nuestra escritura est muy bien. Su ubicacin es el problema. De vuelta en el
Captulo 11, discutimos la variable de entorno PATH y su efecto sobre cmo busca en el
sistema para los programas ejecutables. En resumen, el sistema busca en una lista de
directorios cada vez que necesita para encontrar un programa ejecutable, si no se especifica
ninguna ruta explcita. As es como el sistema sabe ejecutar / bin / ls cuando tecleamos ls en la
lnea de comandos. El directorio / bin es uno de los directorios que el sistema busca
automticamente. La lista de directorios se mantiene dentro de un llamado CAMINO variable
de entorno. La variable PATH contiene una lista de directorios separados que se debe buscar.
Podemos ver el contenido de RUTA:

356

SOJIOM Sinqj
-J3A3 'UTPSP UT 8oj cachorro Jno 8oj uaqj pire iojoaiip uxq / ~ AQJ ajpa.ro aM
jt 'siuajss njunqpj uo' s pajnoaxa si ajjj ojqseq 1 spasn AQJ uaqM sjsjxa
rojoarjp uxq / ~ AQJ jt ajqpjreA HlVd 3LP 1 liojoarip uxq / ~ AQJ SPPP
jjpojjpuiojnp njunqpj Jajojq
preoqaq AQJ uiorj jnduj aqjj q sjparj pire spireuiuioo jjaqs jo ajjj pajjjoads p sppar
qojqM upjjnq jjaqs p 'pupuiuioo aojnos AQJ roj uiuous pupuiuioo p si () jop AQx
orqspq- $ [~ xoqxnuxx @ AUI]

: Guiamos q ",, aq aq auop upo


sjqx ajij ojqseq 1 AQJ PPAR-ar jjaqs AQJ 3Apq jsnui un * 'uojssas jpUTiuraj Panno AQJ
DO aSupqo AQJ jddp buey' uoissas ut jpUTiuraj Mau qopa pajja aqpj jjtm jt 'appiu si
aSupqo sjqj rajjy
iiHIVdSii: uxq / - = HlVd j jodxa

rejTJ Ojqseq 1 mo ut auij


sjqj Sinpnpin AQ jt ppp jispa upo a * 'rojoarip AQJ utpjuoo jou saop ajqpjreA
HlVd 3LH JI
saop os jt puy
PTJOM oiiaH PIJom oiiaq $ [~ xoqxnuxx
@ AUI] uxq piJom_onaq AUI $ [~ xoqxnuxx
@ AUI] uxq JXP> | iu $ [~ xoqxnuxx @ AUI]

: Sureiord jaqjo aqjj


q.ioM DO jrejs pjnoqs jt 'jt utijjtm jdjios cachorro mo aopjd rojoarip uxq AQJ ajuaro
un * jt os suip.iSo.id timo jjaqj ajnoaxa oj oj siasn mojjp' .iojoa.np Arnoq s (.iasn
AQJ ut . iojoa.np uxq p utpjuoo DO ajqpjreA HlVd 3LP 3-mSjjuoo suoTjnqjjjsjp
xnujq jsopq uxq / AUI / auioq / 'jstj AQJ ut jojoajjp jsitj AQJ aoqojq -paAjos aq
pjnoM uiajqord mo' mo jstj AQJ ut sajjojoajjp AQJ jo AUP ut pajpooj ai3M jdjios mo
jj 'saTTOjoajip jo jstj aas un * 3i3jj
sauipB / Jsn /: uxq /
: Uxqs /: uxq / OSN /: uxqs / OSN /: uxq / xpoox / JSN /: uxqs / xpoox / JSN /: uxq
/ AUI / auioq /

HlVdS oqoa $ [~ xoqxnuxx @ generis]

uoijpooq APQ
jdiros

24 - Escribir su primer script

Buenas ubicaciones para Scripts


El directorio ~ / bin es un buen lugar para poner los guiones destinados a uso personal. Si
escribimos un guin que se permite a todos en un sistema a utilizar, la ubicacin tradicional es
/ usr / local / bin. Scripts destinados a ser utilizados por el administrador del sistema a
menudo se encuentran en / usr / local / sbin. En la mayora de los casos, suministrado
localmente el software, si los scripts o programas compilados, se deben colocar en la jerarqua
/ usr / local y no en / bin o / usr / bin. Estos directorios son especificados por el sistema de
archivos estndar de jerarqua de Linux para contener slo los archivos suministrados y
mantenidos por el distribuidor de Linux.

Ms trucos de formato
Uno de los objetivos clave de la escritura de guiones grave es la facilidad de mantenimiento;
es decir, la facilidad con la que un script puede ser modificada por su autor u otros para
adaptarlo a las necesidades cambiantes. Hacer un guin fcil de leer y entender es una forma
de facilitar el mantenimiento fcil.

Nombres opcin larga


Muchos de los comandos que hemos estudiado cuentan ambos nombres de opciones cortas y
[me @ linuxbox ~] $ ls -ad
largas. Por ejemplo, el comando ls tiene muchas opciones que se pueden expresar en forma ya
[Me @ linuxbox ~] $ ls --all --directory
sea corto o largo. Por ejemplo:
y:
son comandos equivalentes. En aras de la reduccin de la tipificacin, se prefieren las
opciones cortas al especificar opciones en la lnea de comandos, pero al escribir secuencias de
comandos, las opciones largas pueden proporcionar una mejor legibilidad.

Sangra Y de continuacin de lnea


Cuando se emplea comandos largos, la legibilidad puede ser mejorada mediante la difusin
de la orden en varias lneas. En el captulo 17, nos fijamos en un ejemplo particularmente largo
del comando find: 358

Ms trucos de formato
[Me @ linuxbox ~] $ encuentro parque \ (-type f -no -perm 0600 chmod -exec 0600 '{}'
';' \) -o \ (-type d -no -perm 0700 chmod -exec 0700 '{ } ''; '\)

Obviamente, este comando es un poco difcil de entender a primera vista. En una secuencia de
comandos, esta com - demanda podra ser ms fcil de entender si escrito de esta manera:
encontrar parque \
\ (\
-type f \
-no -perm 0600 \
chmod -exec 0600 '{}' ';' \
\) \
-o \
\ (\
-type d \
-no -perm 0700 \
chmod -exec 0700 '{}' ';' \
\)
Mediante el uso de la lnea-continuaciones (secuencias de salto de lnea-barra invertida) y la
sangra, la lgica de este comando complejo est ms claramente describe al lector. Esta
tcnica trabaja en la lnea de comandos, tambin, a pesar de que rara vez se utiliza, ya que es
muy difcil de escribir y editar. Una diferencia entre un guin y una lnea de comandos es que
el guin puede emplear caracteres de tabulacin para lograr la sangra, mientras que la lnea
de comandos no se puede, ya que las pestaas se usan para activar la terminacin.

Configuracin de vim para la escritura de guiones


El editor de texto vim tiene muchas, muchas opciones de configuracin. Hay varias
opciones comunes que pueden facilitar la escritura de guiones:
: Sintaxis en
se convierte en el resaltado de sintaxis. Con esta configuracin, los diferentes
elementos de la sintaxis del shell se mostrarn en diferentes colores cuando se ve una
secuencia de comandos. Esto es til para identificar ciertos tipos de errores de
programacin. Se ve bien, tambin. Tenga en cuenta que para que esta caracterstica
funcione, debe tener una versin completa de vim instalado, y el archivo que se est
editando debe tener un tinglado que indica que el archivo es un script de shell. Si tiene
dificultades con el comando anterior, trate de: = sintaxis conjunto sh lugar.
: Conjunto hlsearch

359

se convierte en la opcin para resaltar los resultados de bsqueda. Digamos que la


bsqueda de la palabra "eco". Con esta opcin, se resaltar cada instancia de la
palabra.
: Set tabstop = 4
establece el nmero de columnas ocupadas por un carcter de tabulacin. El valor
predeterminado es de 8 columnas. Establecer el valor de 4 (que es una prctica
comn) permite que las lneas largas para adaptarse ms fcilmente en la pantalla.
: Conjunto autoindent
se convierte en la caracterstica de "guin auto". Esto hace que vim para sangrar una
nueva lnea de la misma cantidad que la lnea slo escribe. Esto acelera a escribir en
muchos tipos de construcciones de programacin. Para detener la sangra, escriba
Ctrl-D.
Estos cambios pueden ser permanentes mediante la adicin de estos comandos (sin
los personajes principales del colon) para su archivo ~ / .vimrc.
24 - Escribir su primer script

Resumiendo
En este primer captulo de secuencias de comandos, hemos visto cmo los guiones se escriben
y hacen ejecutar fcilmente en nuestro sistema. Tambin vimos cmo podemos utilizar
diversas tcnicas de formato para mejorar la legibilidad (y, por tanto, la capacidad de
mantenimiento) de nuestros scripts. En los prximos captulos, la facilidad de mantenimiento
se van a plantear una y otra vez como un principio central en la buena escritura de guiones.

Lectura adicional

360

Para los programas de "Hello World" y ejemplos en varios lenguajes de


programacin, consulte:
http://en.wikipedia.org/wiki/Hello mundo

Este artculo de Wikipedia habla ms sobre el mecanismo tinglado:


http://en.wikipedia.org/wiki/Shebang (Unix)

25

- Creacin de un
proyecto

25

- Creacin de un proyecto

A partir de este captulo, vamos a empezar a construir un programa. El propsito de este


proyecto es ver cmo varios se utilizan las funciones de shell para crear programas y, lo ms
importante, crear buenos programas.
El programa que vamos a escribir es un generador de informes. Se presentarn diversas
estadsticas acerca de nuestro sistema y su estado, y va a producir este informe en formato
HTML, por lo que podemos ver con un navegador web como Firefox o Chrome.
<HTML>
<HEAD>
<TITLE> Ttulo de la pgina </
TITLE> </ HEAD>
<BODY>
Cuerpo de la pgina.
</ BODY>
</ HTML>
Los programas se construyen generalmente en una serie de etapas, con cada etapa de la
adicin de caractersticas y capacidades. La primera etapa de nuestro programa producir una
pgina muy mnima HTML que no contiene la informacin del sistema. Eso vendr despus.

Primera Etapa: Documento Mnimo


Lo primero que necesitamos saber es el formato de un documento HTML bien formado. Se
parece a esto:
Si entramos en esto en nuestro editor de texto y guarde el archivo como foo.html, podemos
utilizar la siguiente URL en Firefox para ver el archivo:
archivo: ///home/username/foo.html
La primera etapa de nuestro programa ser capaz de salida de este archivo HTML a la salida
estndar. Podemos escribir un programa para hacer esto con bastante facilidad. Vamos a
empezar nuestro editor de texto y crear un nuevo archivo llamado ~ / bin / sys_info_page:

361

[Me @ linuxbox ~] $ vim ~ / bin / sys_info_page

e introduzca el siguiente programa:


#! / Bin / bash
# Programa para salida de una pgina de informacin del sistema
eco
eco
eco
eco
eco
eco
eco
eco

"<HTML>"
"<HEAD>"
"<TITLE> Ttulo de la pgina </ TITLE>"
"</ HEAD>"
"<Body>"
"Cuerpo de la pgina."
"</ BODY>"
"</ HTML>"

25 - Creacin de un proyecto

Nuestro primer intento de este problema contiene un tinglado, un comentario (siempre es una
[Me @ linuxbox ~] $ chmod 755 ~ / bin / sys_info_page
[Me @ linuxbox ~] $ sys_info_page
buena idea) y una secuencia de comandos de eco, una para cada lnea de salida. Despus de
guardar el archivo, lo haremos ejecutable y tratamos de ejecutarlo:
Cuando se ejecuta el programa, debemos ver el texto del documento HTML que se muestra en
la pantalla, ya que los comandos de eco en la secuencia de comandos envan su salida a la
[Me @ linuxbox ~] $ sys_info_page> sys_info_page.html [me @
linuxbox ~] $ firefox sys_info_page.html
salida estndar. Vamos a ejecutar el programa y redirigir la salida del programa para la
sys_info_page.html archivo, de modo que podamos ver el resultado con un navegador web:
Hasta ahora, todo bien.
Al escribir programas, siempre es una buena idea para luchar por la simplicidad y la claridad.
El mantenimiento es ms fcil cuando un programa es fcil de leer y comprender, por no
hablar de que puede hacer que el programa sea ms fcil de escribir mediante la reduccin de
la cantidad de mecanografa. Nuestra versin actual del programa funciona bien, pero podra
ser ms simple. De hecho, podramos combinar todos los comandos de eco en una sola, lo que
sin duda har que sea ms fcil para agregar ms lneas a la salida del programa. As que,
vamos a cambiar nuestro programa a esta:
362

Primera Etapa: Documento Mnimo


#! / Bin / bash
# Programa para salida de una pgina de informacin del
sistema
echo "<HTML>
<HEAD>
<TITLE> Ttulo de la pgina </ TITLE>
</ HEAD>
<BODY>
Cuerpo de la pgina.
</ BODY>
</ HTML> "
Una cadena entre comillas puede incluir saltos de lnea, y por lo tanto contener varias lneas
de texto. La cscara se mantendr la lectura del texto hasta que se encuentra con las comillas
de cierre. Funciona de esta manera en la lnea de comandos, tambin:
[Me @ linuxbox ~] $ echo "<HTML>
>
<HEAD>
<TITLE> Ttulo de la pgina </
>
>
</ HEAD> TITLE>
>
<BODY>
>
Cuerpo de la pgina.
>
</ BODY>
> </ HTML> "
El lder ">" El carcter es el intrprete de comandos contenidas en la variable de shell PS2. Al
parecer, cada vez que escribimos una declaracin de varias lneas en la cscara. Esta
caracterstica es un poco oscuro en este momento, pero ms tarde, cuando nos cubrimos las
declaraciones de programacin multi-lnea, que va a llegar a ser muy til.

Segunda Etapa: Aadir un poco de datos


Ahora que nuestro programa puede generar un documento de mnimos, vamos a poner
algunos datos en el informe. Para ello, vamos a realizar los siguientes cambios:
#! / Bin / bash
# Programa para salida de una pgina de informacin del sistema
echo "<HTML>
<HEAD>
<TITLE> Sistema de Reporte de Informacin </ TITLE>

363

25 - Creacin de un proyecto
</ HEAD>
<BODY>

<H1> Sistema de Reporte de Informacin


</ BODY> </ H1>
</ HTML> "
Hemos aadido un ttulo de la pgina y un encabezado para el cuerpo del informe.

Variables y constantes
Hay un problema con nuestro guin, sin embargo. Observe cmo se repite la cadena "Informe
de informacin del sistema"? Con nuestro pequeo guin que no es un problema, pero
imaginemos que nuestro guin era muy largo y tuvimos varias instancias de esta cadena. Si
quisiramos cambiar el ttulo a otra cosa, tendramos que cambiarlo en varios lugares, lo que
podra ser un montn de trabajo. Y si pudiramos organizar la secuencia de comandos para
que la cadena slo apareci una vez y no varias veces? Eso hara que el mantenimiento futuro
de la escritura mucho ms fcil. As es como podramos hacer eso:
#! / Bin / bash
# Programa para salida de una pgina de informacin del sistema
title = "Informacin del sistema"
echo "<HTML>
<HEAD>
</ HEAD>
<BODY>
</ BODY>
</ HTML> "

<TITLE> $ ttulo </ TITLE>


<H1> $ ttulo </ H1>

Al crear una variable llamada ttulo y asignndole el valor "Informe Informacin del sistema",
podemos tomar ventaja de la expansin de parmetro y colocar la cadena en mltiples
ubicaciones.
As que, cmo creamos una variable? Simple, slo lo utilizan. Si el depsito se encuentra con
una variable, se crea automticamente. Esto difiere de muchos lenguajes de programacin en
el que las variables deben ser declaradas antes de su uso o definidos de forma explcita. La
cscara es muy laxa acerca de esto, lo que puede dar lugar a algunos problemas. Por ejemplo,
considere este escenario juega en la lnea de comandos: 364

Variables y constantes

H
o
l
a
O
O
h
>

[Me @ linuxbox ~] $ foo = "S"


[Me @ linuxbox ~] $ eco $ Foo
s
[Me @ linuxbox ~] $ eco
[Me @ linuxbox ~] $

En primer lugar, asignamos el valor "s" a la variable foo, y luego mostrar su valor con eco. A
continuacin mostramos el valor del nombre de la variable mal escrito como "tonto" y
obtenemos un resultado en blanco. Esto se debe a que la cscara felizmente creado la variable
de tonto cuando se encontr con l, y le dio el valor por defecto de la nada, o vaco. A partir de
esto, nos enteramos de que hay que prestar mucha atencin a nuestra ortografa! Tambin es
importante entender lo que realmente sucedi en este ejemplo. Desde nuestra mirada anterior
cmo el shell realiza expansiones, sabemos que el comando:

[Me @ linuxbox ~] $ echo $ foo


se somete a la expansin de parmetros y
resultados en:
[Me @ linuxbox ~] $ echo s
Considerando que el
comando:
[Me @ linuxbox ~] $ echo $ tonto
se expande
en:
[Me @ linuxbox ~] $ echo
La variable vaca se expande en la nada! Esto puede causar estragos en los comandos que
requieren argumentos. He aqu un ejemplo:
[Me @ linuxbox ~] $ foo = foo.txt [me @ linuxbox ~] $ foo1 =
foo1.txt [me @ linuxbox ~] $ cp $ foo $ tonto
cp: falta el operando archivo de destino despus de 'foo.txt'

365

Trate '--help cp' para obtener ms informacin.


25 - Creacin de un proyecto
Asignamos valores de dos variables, foo y tonto. A continuacin, realizamos un cp, pero
escribir mal el nombre del segundo argumento. Despus de la expansin, el comando cp slo
se enva un argumento, aunque requiere dos.
Hay algunas reglas acerca de los nombres de variables:
1. Los nombres de variables pueden consistir de caracteres alfanumricos (letras y
nmeros) y caracteres de subrayado.
2. El primer carcter de un nombre de variable debe ser una letra o un guin bajo.
3. Los espacios y signos de puntuacin no estn permitidos.
La palabra "variable" implica un valor que cambia, y en muchas aplicaciones, las variables se
utilizan de esta manera. Sin embargo, la variable en nuestra aplicacin, el ttulo, se utiliza
como una constante. Una constante es igual que una variable en que tiene un nombre y
contiene un valor. La diferencia es que el valor de una constante no cambia. En una aplicacin
que realiza clculos geomtricos, que podramos definir PI como una constante, y asignarle el
valor de 3.1415, en lugar de utilizar el nmero, literalmente, a travs de nuestro programa. La
cscara no hace distincin entre variables y constantes; en su mayora son para la conveniencia
del programador. Una convencin comn es utilizar letras maysculas para designar
constantes y letras minsculas para las variables reales. Vamos a modificar nuestro script para
cumplir la presente Convencin:
#! / Bin / bash
# Programa para salida de una pgina de informacin del sistema
TITLE = "Informacin del Sistema Para Reportar $ HOSTNAME"
echo "<HTML>
<HEAD>
</ HEAD>
<BODY>
</ BODY>
</ HTML> "

<TITLE> $ TTULO </ TITLE>


<H1> $ TTULO </ H1>

Tambin aprovechamos la oportunidad para j azz nuestro ttulo sumando el valor del nombre
de host variable de shell. Este es el nombre de red de la mquina.

366

Variables y constantes

Nota: La concha en realidad proporciona una manera de hacer cumplir la


inmutabilidad de las constantes, a travs del uso de la orden interna de declarar con la
opcin -r (de slo lectura). Si hubiramos asignado TTULO de esta manera:
declarar TTULO -r = "Ttulo de la pgina"
la cscara impedira cualquier cesin subsiguiente a TITLE. Esta caracterstica se utiliza
muy poco, pero existe para los scripts muy formales.

Asignacin de valores a las variables y constantes


Aqu es donde nuestro conocimiento de la expansin realmente comienza a dar sus frutos.
Como hemos visto, las variables se asignan valores de esta manera:
variable = valor
donde variable es el nombre de la variable y el valor es una cadena. A diferencia de otros
lenguajes de programacin, la cscara no se preocupa por el tipo de datos asignados a una
variable; se les trata a todos como cadenas. Puede forzar la cscara para restringir la
asignacin de nmeros enteros usando el comando de declarar con la opcin -i, pero, al igual
que el establecimiento de las variables como de solo lectura, esto rara vez se hace.
Tenga en cuenta que en una misin, no debe haber espacios entre el nombre de la variable, el
signo igual y el valor. Entonces, qu puede consistir en el valor? Cualquier cosa que podemos
ampliar en una cadena:
a=z
b = "una cadena"
c = "una cadena y $ b"

# Asignar la cadena "z" a la variable a.


# Espacios incrustados deben estar dentro de las comillas.
# Otras expansiones como las variables pueden ser
# ampliado en la asignacin.
# Los resultados de un comando.
# Expansin aritmtica.
# Secuencias de escape como los tabuladores y saltos de lnea.

d = $ (ls -l foo.txt)
e = $ ((5 * 7))
af =
= "\
5 bt=\"una
ta cadena \ n"
cadena"
Mltiples asignaciones de variables se pueden realizar en una sola lnea:

Durante la expansin, los nombres de variables pueden estar rodeadas por llaves opcionales
"{}". Esto es til en los casos en que un nombre de variable se convierte en ambigua debido a su
con- alrededores

367

[Me @ linuxbox ~] $ archivo = "miarchivo"


[Me @ linuxbox ~] $ touch $ archivo [me @ linuxbox
~] $ mv $ archivo $ nombrearchivo1
mv: falta archivo de destino operando despus de 'miarchivo' Try
'--help mv' para obtener ms informacin.
25 - Creacin de un proyecto texto. Aqu, tratamos de cambiar el nombre de un archivo de
miarchivo a myfile1, utilizando una variable:

[Me @ linuxbox ~] $ $ mv nombre de archivo $


{nombre de archivo} 1
Este intento falla porque el shell interpreta el segundo argumento del comando mv como un
nuevo (y vaco) variable. El problema se puede superar de esta manera:
Mediante la adicin de los apoyos de los alrededores, la cscara ya no interpreta la posterior 1
como parte del nombre de la variable.
Vamos a tomar esta oportunidad para aadir algunos datos de nuestro informe, a saber, la
fecha y hora del informe se ha creado y el nombre de usuario del creador:
#! / Bin / bash
# Programa para salida de una pgina de informacin del sistema
TITLE = "Informacin del Sistema Para Reportar $ HOSTNAME" CURRENT_TIME = $
(date + "% x% r% Z") TIMESTAMP = "gener $ CURRENT_TIME, por $ USER"
echo "<HTML>
<HEAD>
</ HEAD>
<BODY>
</ BODY>
</ HTML> "

<TITLE> $ TTULO </ TITLE>


<H1> $ TTULO </ H1>
<P> $ TIMESTAMP </ P>

Aqu Documentos
Hemos visto dos mtodos diferentes de la salida de nuestro texto, tanto en el uso de la eco
com-

368

Aqu Documentos
demanda. Hay una tercera va llamada una secuencia de comandos aqu documento o aqu.
Un documento que aqu es una forma adicional de redireccin de E / S en el que nos
integramos un cuerpo de texto en nuestro script y alimentamos en la entrada estndar de un
comando. Funciona as:
comando << ficha
texto
ficha
donde comando es el nombre del comando que acepte la entrada estndar y token es una
cadena que se utiliza para indicar el final del texto incrustado. Vamos a modificar nuestro
script para usar un documento aqu:
#! / Bin / bash
# Programa para salida de una pgina de informacin del sistema
TITLE = "Sistema de Informacin Informe Por $ HOSTNAME" CURRENT_TIME = $ (date
+ "% x% r% Z") TIMESTAMP = "gener $ HORA ACTUAL, por $ USER"
cat << EOF
<HTML>
<HEAD>
</ HEAD>
<BODY>
</ BODY>
</ HTML>
_EOF_

<TITLE> $ TTULO </ TITLE>


<H1> $ TTULO </ H1>
<P> $ TIMESTAMP </ P>

En lugar de utilizar eco, nuestro script ahora usa gato y un documento aqu. El _EOF_ cadena
(que significa "final del archivo," una convencin comn) fue seleccionado como el token, y
marca el final del texto incrustado. Tenga en cuenta que la seal debe aparecer solo y que no
debe haber espacios finales en la lnea.
[Me @ linuxbox ~] $ foo = "texto" [me @
linuxbox ~] $ cat << _EOF_
> $ Foo
As que cul es la ventaja de utilizar un documento aqu? Es en su mayora los mismos que
eco, salvo que, por defecto, individual y dobles comillas dentro de aqu documentos pierden
su significado especial para el shell. Aqu est un ejemplo de lnea de comandos:

369

25 - Creacin de un
proyecto
> "$ Foo"
> '$ Foo'
> \ $ Foo
> _EOF_
un poco de
texto "texto"
'un poco de
texto "$ foo
Como podemos ver, el shell no presta atencin a las comillas. Se los trata como caracteres
ordinarios. Esto nos permite incrustar comillas libremente dentro de un documento aqu. Esto
podra llegar a ser muy til para nuestro programa de informe.
Aqu documentos pueden ser utilizados con cualquier comando que acepte la entrada
estndar. En este ejemplo, se utiliza un documento de aqu a pasar una serie de comandos al
programa de ftp con el fin de recuperar un archivo desde un servidor FTP remoto:

#! / Bin / bash
# Script para recuperar un archivo a travs de FTP servidor_ftp =ftp.nl.debian.org
FTP_PATH = / debian / dists / lenny / main / installer-i386 / current / images / cdrom
Remote_file = debian-cd_info.tar.gz
ftp -n << _EOF_
abierto $ servidor_ftp
usuario me annimo @ linuxbox
cd $ FTP_PATH
hachs
get $ remote_file
adis
_EOF_
ls -l $ remote_file

Si cambiamos el operador de redireccin de "<<" para "<< -", la cscara ignorar lder
caracteres de tabulacin en el documento aqu. Esto permite que un documento que se va aqu
sangra, que puede mejorar la legibilidad:
#! / Bin / bash
# Script para recuperar un archivo a travs de
FTP servidor_ftp =ftp.nl.debian.org

370

FTP_PATH = / debian / dists / lenny / main / installer-i386 / current / images / cdrom


Remote_file = debian-cd_info.tar.gz
ftp -n << - _EOF_
abierto $ servidor_ftp
usuario me annimo @ linuxbox
cd $ FTP_PATH
hachs
get $ remote_file
adis
_EOF_
ls -l $ remote_file

Aqu Documentos

Resumiendo
En este captulo, empezamos un proyecto que nos llevar a travs del proceso de construccin
de un guin exitoso. Hemos introducido el concepto de variables y constantes y la forma en
que se pueden emplear. Ellos son los primeros de muchas aplicaciones encontraremos para la
expansin de parmetros. Tambin nos fijamos en la manera de producir una salida de
nuestro script, y diversos mtodos para la incorporacin de bloques de texto.

Lectura adicional

Para obtener ms informacin acerca de HTML, consulte los siguientes artculos y


tutoriales: http://en.wikipedia.org/wiki/Html
http://en.wikibooks.org/wiki/HTML Programacin
http://html.net/tutorials/html/

La pgina de manual de bash incluye una seccin titulada "AQU DOCUMENTOS",


que cuenta con una descripcin completa de esta funcin.

371

26

26

- Diseo Top-Down

- Diseo Top-Down

Como los programas se hacen ms grandes y ms complejos, se vuelven ms difciles de


disear, cdigo y mantener. Al igual que con cualquier proyecto grande, a menudo es una
buena idea para romper grandes tareas complejas en una serie de tareas pequeas y sencillas.
Imaginemos que estamos tratando de describir una tarea cotidiana comn, ir al mercado a
comprar comida, a una persona de Marte. Podramos describir el proceso general como la
siguiente serie de pasos:
1. Pngase en coche.
2. Conduzca al mercado.
3. Coche Park.
4. Introduzca mercado.
5. Compra de alimentos.
6. Regreso a coche.
7. Lleve a su casa.
8. Coche Park.
9. Introduzca casa.
Sin embargo, una persona de Marte es probable que necesite ms detalle. Podramos romper
ms abajo en la subtarea "cajn de estacionamiento" en esta serie de pasos:
1. Encuentra plaza de aparcamiento.
2. Conducir un coche en el espacio.
3. Apague el motor.
4. Conjunto del freno de estacionamiento.
5. Coche Salir.
6. Coche de bloqueo.
La subtarea "Apagar el motor" ms podra ser dividido en etapas que incluyen "Apague la
ignicin", "Retire la llave de encendido," y as sucesivamente, hasta que cada paso de todo el
proceso de ir al mercado ha sido totalmente definida.
Este proceso de identificacin de los pasos a nivel de la parte superior y el desarrollo de
puntos de vista cada vez ms detallados de esos pasos se llama diseo de arriba hacia abajo.
Esta tcnica nos permite romper grandes tareas complejas en muchas tareas pequeas y
sencillas. Diseo de arriba hacia abajo es un mtodo comn de diseo
372

26

- Diseo Top-Down

programas y una que se adapta bien a bombardear la programacin en particular.


En este captulo, vamos a utilizar el diseo de arriba hacia abajo para seguir desarrollando
nuestro script informe-generador.

Funciones de Shell
Nuestro script actualmente lleva a cabo los siguientes pasos para generar el documento
HTML:
1. Abrir pgina.
2. Encabezado de pgina en Abrir.
3. Conjunto ttulo de la pgina.
4. Cerrar encabezado de la pgina.
5. Cuerpo de la pgina abierta.
6. Ttulo de la pgina de salida.
7. Fecha y hora de salida.
8. Cerrar cuerpo de la pgina.
9. Cerrar la pgina.
Para nuestra prxima etapa de desarrollo, vamos a aadir algunas tareas entre los pasos 7 y 8.
Estos incluirn:
#! / Bin / bash
# Programa para salida de una pgina de informacin del
sistema
TITLE = "Informacin del Sistema Para Reportar $
HOSTNAME" CURRENT_TIME = $ (date + "% x% r% Z")
TIMESTAMP = "gener $ CURRENT_TIME, por $ USER"
cat << _EOF_
<HTML>
<HEAD>
El tiempo de actividad del sistema y carga. Esta es la cantidad de tiempo transcurrido
desde el ltimo apagado o reinicio y el nmero medio de las tareas que se estn
ejecutando en el procesador durante varios intervalos de tiempo.

El espacio en disco. El uso general del espacio en los dispositivos de almacenamiento


del sistema.

Inicio espacio. La cantidad de espacio de almacenamiento utilizado por cada usuario.

Si tuviramos un comando para cada una de estas tareas, podramos aadirlas a nuestro script
simplemente a travs de la sustitucin de comandos:

373

26 - Diseo Top-Down
</ HEAD>
<BODY>

</ BODY>
</ HTML>
EOF

<TITLE> $ TTULO </ TITLE>


<H1> $ TTULO </ H1>
<P> $ TIMESTAMP </ P>
$ (Report_uptime)
$ (Report_disk_space)
$ (Report_home_space)

Podramos crear estos comandos adicionales de dos maneras. Podramos escribir tres guiones
separados y colocarlos en un directorio que aparece en nuestro camino, o podramos integrar
los scripts dentro de nuestro programa como funciones de shell. Como hemos mencionado
antes, funciones de shell son "mini-scripts" que se encuentran dentro de otros scripts y
programas pueden actuar como autnomas. Funciones Shell tienen dos formas sintcticas:
Nombre de la funcin
{comandos
retorno
1
#! / Bin / bash
2
2
# Shell funcin de demostracin
4
3
funcin func {
4
echo "Paso 2"
5
retorno
6
}
9
10
# Programa principal comienza
aqu
11
12 echo "Paso 1"
}
y
nombre () {
comandos
retorno
}

donde nombre es el nombre de la funcin y de los comandos es una serie de comandos que
figuran dentro de la funcin. Ambas formas son equivalentes y se pueden usar
indistintamente. A continuacin vemos una secuencia de comandos que muestra el uso de
una funcin de shell:

374

#! / Bin / bash
# Programa para salida de una pgina de informacin del
13
func
sistema
14
echo "Paso 3"
TITLE = "Informacin del Sistema Para Reportar $
HOSTNAME"
CURRENT_TIME = $ (date + "% x% r% Z")
TIMESTAMP = "gener $ CURRENT_TIME, por $ USER"
report_uptime () {return
}
report_disk_space () {return
}
report_home_space () {return
}

cat << _EOF_


<HTML>
<HEAD>
<TITLE> $ TTULO </ TITLE>
</ HEAD>
<BODY>
<H1> $ TTULO </ H1>
<P> $ TIMESTAMP </ P>
$ (Report_uptime)
$ (Report_disk_space)
$ (Report_home_space)

Funciones de Shell

A medida que el shell lee el guin, que pasa por encima de las lneas de la 1 a la 11, ya que esas
lneas se componen de los comentarios y la definicin de la funcin. La ejecucin comienza en
la lnea 12, con un comando echo. La lnea 13 llama a la funcin func cscara y el shell ejecuta
la funcin tal como lo hara con cualquier otro comando. El control de programa se desplaza a
la lnea 6, y se ejecuta el segundo comando de eco. Lnea 7 se ejecuta siguiente. Su comando de
retorno termina la funcin y devuelve el control al programa en la lnea despus de la llamada
a la funcin (lnea 14), y se ejecuta el comando final de eco. Tenga en cuenta que para que la
funcin llama a ser reconocido como funciones de shell y no interpretadas como los nombres
de los programas externos, la definicin de funciones de shell deben aparecer en la secuencia
de comandos antes de que sean llamados.
Vamos a aadir definiciones mnimas funcin Shell en nuestro script:
375

#! / </
BinBODY>
/ bash
</ HTML>
_EOF_
#
local-vars: script para demostrar las variables locales foo = 0 #
mundial funct_1 variable foo () {

variable local foo foo # local para funct_1 foo = 1


echo "funct_1: foo = $ foo"

funct_2 () {
variable local foo foo # local para funct_2 foo = 2
echo "funct_2: foo = $ foo"
}

echo "mundial:
foo = $ foo "
funct_1
- Diseo Top-Down

26

Nombres de las funciones de Shell siguen las mismas reglas que las variables. Una funcin
debe contener al menos un comando. El comando de retorno (que es opcional) satisface el
requisito.

Variables Locales
En las secuencias de comandos que hemos escrito hasta ahora, todas las variables (incluyendo
constantes) han sido las variables globales. Las variables globales mantienen su existencia a
travs del programa. Esto est bien para muchas cosas, pero a veces puede complicar el uso de
funciones de shell. Dentro de las funciones del shell, a menudo es deseable tener variables
locales. Las variables locales slo son accesibles dentro de la funcin de shell en el que se
definen y dejan de existir una vez que la funcin de shell termina.
Tener variables locales permite al programador utilizar variables con nombres que ya puedan
existir, ya sea en la secuencia de comandos a nivel mundial o en otras funciones de shell, sin
tener que preocuparse acerca de los posibles conflictos de nombres.
Aqu hay un script de ejemplo que muestra cmo las variables locales se definen y se utiliza:
376

Variables
Locales
echo
"mundial:
func 2
echo "mundial:

[Me @ linuxbox
mundial:
foo
funct_1:
Foo
mundial:
funct_2 foo: foo
mundial: foo

foo = $ Foo "


foo = $ Foo "

~] $ Local vars
= 0
= 1
= 0
= 2
=0

Como podemos ver, las variables locales se definen precediendo el nombre de la variable con
la palabra local. Esto crea una variable que es local a la funcin shell en el que se define. Una
vez fuera de la funcin de shell, la variable ya no existe. Cuando ejecutamos este script, vemos
los resultados:
Vemos que la asignacin de valores a la variable foo local dentro de las dos funciones de shell
no tiene efecto en el valor de foo definida fuera de las funciones.
Esta caracterstica permite que las funciones de shell para ser escritas de modo que sigan
siendo independientes entre s y de la secuencia de comandos en el que aparecen. Esto es muy
valioso, ya que ayuda a evitar que una parte de un programa de interferir con otro. Tambin
permite funciones de shell que se escriben de manera que puedan ser porttil. Es decir, que se
pueden cortar y pegar desde el guin hasta la escritura, segn sea necesario.

Mantenga Scripts Ejecucin


Durante el desarrollo de nuestro programa, es til para mantener el programa en un estado
ejecutable. Al hacer esto, y probando con frecuencia, podemos detectar errores temprano en el
proceso de desarrollo. Esto har que los problemas de depuracin mucho ms fcil. Por
ejemplo, si ejecutamos el programa, hacer un pequeo cambio, a continuacin, ejecute el
programa de nuevo y encontrar un problema, es muy probable que el cambio ms reciente es
el origen del problema. Mediante la adicin de las funciones vacos, llamados talones en
programador-hablar, podemos verificar el flujo lgico de nuestro programa en una etapa
temprana. Cuando la construccin de un taln, que es una buena idea incluir algo que
proporciona informacin para el programador, que muestra el flujo lgico se est llevando a
cabo. Si nos fijamos en la salida de nuestro script ahora:
[Me @ linuxbox ~] $ sys_info_page
<HTML>
<HEAD>
<TITLE> Informacin del sistema Informe Para TWIN2 </ TITLE>
377

26 - Diseo Top-Down
</ HEAD>
<BODY>
<H1> Sistema de Reporte de Informacin Para linuxbox </ h1>
<p> Generado 3/19/2009 04:02:10 PM EDT, por m </ P>

</ BODY>
</ HTML>
vemos que hay algunas lneas en blanco en nuestra salida despus de la indicacin de la hora,
pero no podemos estar seguros de la causa. Si cambiamos las funciones para incluir algunos
comentarios:
report_uptime () {
echo "Funcin report_uptime ejecutado."
retorno
}
report_disk_space () {
echo "Funcin report_disk_space ejecutado."
retorno
}

report_home_space () {
echo "Funcin report_home_space ejecutado."
retorno
}

y ejecutar el script de
nuevo:
[Me @ linuxbox ~] $ sys_info_page
<HTML>
<HEAD>
<TITLE> Informacin del sistema Informe Para linuxbox </ TITLE>
</ HEAD>
<BODY>
<H1> Sistema de Reporte de Informacin Para linuxbox </ h1> <p>
Generado 03/20/2009 05:17:26 AM EDT, por m </ P> Funcin
report_uptime ejecutado.
Funcin report_disk_space ejecutado.
Funcin report_home_space ejecutado.
</ BODY>
</ HTML>

378

Mantenga Scripts
Ejecucin
ahora vemos que, de hecho, nuestros tres funciones se estn ejecutando.
Con nuestro marco de la funcin en su lugar y de trabajo, es el momento de profundizar en
algunos de los cdigos de funcin. En primer lugar, la funcin report_uptime:

report_uptime () {cat
<< - _EOF_
<H2> Sistema Uptime </
h2>
<PRE> $ (tiempo de
actividad) </ PRE>
_EOF_
retorno

}
Es bastante sencillo. Utilizamos un documento de aqu a la salida de un encabezado de
seccin y la salida del comando uptime, rodeado de etiquetas <PRE> para conservar el
formato del comando. La funcin report_disk_space es similar:

report_disk_space () {cat << - _EOF_


<H2> Disco utilizacin del espacio </
h2> <PRE> $ (df -h) </ PRE>
_EOF_
retorno

Esta funcin utiliza el comando df -h para determinar la cantidad de espacio en disco. Por
ltimo, vamos a construir la funcin report_home_space:

report_home_space () {cat << - _EOF_


<H2> Inicio utilizacin del espacio </
h2> <PRE> $ (du -sh / home / *) </
PRE> _EOF_
retorno

Utilizamos el comando du con las opciones - sh para realizar esta tarea. Esto, sin embargo, no
es una solucin completa al problema. A pesar de que va a funcionar en algunos sistemas
(Ubuntu, por ejemplo), no va a funcionar en otros. La razn es que muchos sistemas
establecen los permisos de los directorios de inicio para prevenirlos de ser legible por todos,
que es una medida de seguridad razonable. En estos sistemas, la funcin report_home_space,
como est escrito, lo har
379

Funciones Shell en su .bashrc Archivo


Funciones de Shell son excelentes sustitutos de los alias, y en realidad son el mtodo
preferido para la creacin de comandos pequeos para uso personal. Los alias son
muy limitados en el tipo de comandos y funciones de shell que apoyan, mientras que
las funciones de shell permiten cualquier cosa que puede ser un guin. Por ejemplo, si
nos gust la funcin de shell report_disk_space que hemos desarrollado para nuestro
guin,
podra crear una funcin denominada similares ds para nuestro
archivo .bashrc: DS () {
echo "Disco de la utilizacin del espacio Por $
HOSTNAME" df -h
}
26 - Diseo Top-Down slo funcionar si nuestro script se ejecuta con privilegios de
superusuario. Una mejor solucin sera tener el guin ajustar su comportamiento de acuerdo
con los privilegios del usuario. Vamos a tomar esto en el prximo captulo.

Resumiendo
En este captulo, hemos introducido un mtodo comn para el diseo del programa se llama
diseo de arriba hacia abajo, y ya hemos visto cmo funciona la cscara se utiliza para
construir el refinamiento paso a paso que se requiere. Tambin hemos visto cmo las variables
locales se puede utilizar para hacer funciones de shell independiente el uno del otro y desde el
programa en el que se encuentre. Esto hace posible para las funciones de shell para ser escritos
en una forma porttil y ser reutilizable por lo que les permite ser colocados en mltiples
programas; un gran ahorro de tiempo.

Lectura adicional
La Wikipedia tiene muchos artculos sobre la filosofa de diseo de software. Aqu hay
un par de buenos:
http://en.wikipedia.org/wiki/Top-down diseo
http://en.wikipedia.org/wiki/Subroutines

380

27 - Control de flujo: Bifurcaciones


Con si

27 - Control de flujo: Bifurcaciones Con si


En el ltimo captulo, se nos present un problema. Cmo podemos hacer nuestro script
informe-generador de adaptarse a los privilegios del usuario que ejecuta el guin? La solucin
a este problema se nos obliga a encontrar una manera de "cambiar de direccin" dentro de
nuestro guin, basado en los resultados de una prueba. En trminos de programacin, es
necesario que el programa derive.
Consideremos un ejemplo simple de la lgica expresada en pseudocdigo, una simulacin de
un lenguaje de programacin diseado para el consumo humano:
X=5
Si X = 5, entonces:
Diga "X es igual a 5."
De lo contrario:

x=5
si [$ x -eq 5]; then echo "x es
igual a 5."
ms
echo "x no es igual a 5." fi
Decir "X no es igual a 5."
Este es un ejemplo de una rama. Sobre la base de la condicin, "El X = 5?" Hacer una cosa,
"Say X es igual a 5," de lo contrario hacer otra cosa, "Say X no es igual a 5."

si
El uso de la cscara, que puede codificar la lgica anterior de la siguiente manera:
o podemos entrar directamente en la lnea de comandos (un poco ms corta):

381

[Me @ linuxbox ~] $ x = 5
[Me @ linuxbox ~] $ if [$ x -eq 5]; then echo "es igual a 5"; else echo "no es igual a 5"; fi
es igual a 5
[Me @ linuxbox ~] $ x = 0
[Me @ linuxbox ~] $ if [$ x -eq 5]; then echo "es igual a 5"; else echo "no es igual a 5"; fi
no es igual a 5
27 - Control de flujo: Bifurcaciones Con si
En este ejemplo, ejecutamos el comando dos veces. Una vez, con el valor de x conjunto a 5, lo
que se traduce en la cadena "es igual a 5" ser de salida, y la segunda vez con el valor de x en 0,
lo que resulta en la cadena "no es igual a 5" ser de salida.
La sentencia if tiene la siguiente sintaxis:
si comandos; a continuacin, los
comandos
[Elif comandos; a continuacin,
los comandos ...]
[Otra cosa
comandos]
fi
donde los comandos se muestra una lista de comandos. Esto es un poco confuso a primera
vista. Pero antes de que podamos aclarar esto, tenemos que mirar cmo la cscara evala el
xito o el fracaso de un comando.

[Me @ linuxbox ~] $ ls -d / usr / bin /


usr / bin
[Me @ linuxbox ~] $ echo $?
0
[Me @ linuxbox ~] $ ls -d / bin / usr
ls: no se puede acceder / bin / usr: No existe el fichero o directorio
[me @ linuxbox ~] $ echo $?
2

Estado de salida
Comandos (incluyendo las secuencias de comandos y funciones de shell que escribimos)
emitir un valor para el sistema cuando se terminan, se llama un estado de salida. Este valor,
que es un nmero entero en el rango de 0 a 255, indica el xito o fracaso de la ejecucin del
comando. Por convencin, un valor de cero indica el xito y cualquier otro valor indica el
fracaso. El shell proporciona un parmetro que podemos utilizar para examinar el estado de
salida. Aqu lo vemos en accin:

382

Estado de
salida
En este ejemplo, ejecutamos el comando ls dos veces. La primera vez, el comando se ejecuta
correctamente. Si mostramos el valor del parmetro $ ?, vemos que es cero. Ejecutamos el
comando ls segunda vez, produciendo un error, y examinamos el parmetro $? de nuevo. Esta
vez contiene un 2, lo que indica que el comando ha detectado un error. Algunos comandos
utilizan diferentes valores de estado de salida para proporcionar diagnsticos de errores,
mientras que muchos comandos simplemente salir con un valor de uno cuando fallan. Las
pginas man a menudo incluyen una seccin titulada "Estado de Salida", que describe lo que
se utilizan los cdigos. Sin embargo, un cero indica siempre xito.
El shell proporciona dos rdenes internas extremadamente simples que no hacen nada
excepto terminar ya sea con un estado de salida cero o uno. El verdadero comando siempre se
ejecuta con xito y el falso comando siempre se ejecuta sin xito:

[Me @ linuxbox ~] $ true [me @


linuxbox ~] $ echo $? 0
[Me @ linuxbox ~] $ false [me @
linuxbox ~] $ echo $? 1

Podemos utilizar estos comandos para ver cmo funciona la instruccin if. Lo que la sentencia
if realmente hace es evaluar el xito o el fracaso de los comandos:
[Me @ linuxbox ~] $ si es cierto; then echo "Es verdad."; fi
Es cierto.
[Me @ linuxbox ~] $ si es falso; then echo "Es verdad."; fi
[Me @ linuxbox ~] $
El comando echo "Es verdad." se ejecuta cuando el comando siguiente si se ejecuta
correctamente, y no se ejecuta cuando el comando siguiente si no se ejecuta con xito. Si una
lista de comandos siguiente si, el ltimo comando en la lista se evala:

[Me @ linuxbox ~] $ si es falso; verdadero; then echo "Es verdad."; fi Es cierto.


[Me @ linuxbox ~] $ si es cierto; falsa; then echo "Es verdad."; fi [me @
linuxbox ~] $

383

27

- Control de flujo: Bifurcaciones Con si ___________________________________________

prueba
Por el momento, el comando utilizado con ms frecuencia si es con la prueba. El comando de
prueba realiza una serie de comprobaciones y comparaciones. Tiene dos formas equivalentes:
prueba expresin
y los ms populares:
[expresin]
donde la expresin es una expresin que se evala como verdadera o falsa. El comando test
devuelve un estado de salida de cero cuando la expresin es verdadera y un estado de uno
cuando la expresin es falsa.

Expresiones de archivos
Las siguientes expresiones se utilizan para evaluar el estado de los archivos:
Tabla 27-1: Expresiones prueba de archivos
Expresin
archivol -ef

archivo2

archivol -nt

archivo2

Si es cierto:
archivo1 y archivo2 tienen los mismos nmeros de inodo
(los dos nombres de archivo hacen referencia al mismo
archivo
vinculacin
archivo1 de
es ms
recienteduro).
que archivo2.

archivol -ot

archivo2

archivo1 es ms antiguo que archivo2.

-b archivo
-c archivo
-d archivo

expediente existe y es un archivo de bloque especial


(dispositivo).
expediente existe y es un archivo de caracteres especiales
(dispositivo).
expediente existe y es un directorio.

archivo -e

expediente existe.

-f archivo

expediente existe y es un archivo normal.

archivo -g

expediente existe y es set-grupo-ID.

Archivo -G
archivo -k

expediente existe y es propiedad de la ID de grupo efectivo.


expediente existe y tiene su conjunto "sticky bit".

-L Archivo

expediente existe y es un enlace simblico.

-O Archivo

expediente existe y es propiedad de la ID de usuario efectivo.

archivo -p

expediente existe y es una tubera con nombre.

-r archivo

expediente existe y es legible (tiene permiso de lectura para

384

prueba
el usuario efectivo).
-s expediente
-S expediente
-t fd

-u expediente
-w expediente
-x expediente

expediente existe y tiene una longitud mayor que cero.


expediente existe y es una toma de la red.
fd es un descriptor de fichero dirigido a / desde la terminal.
Esto se puede utilizar para determinar si se redirige
estndar de entrada / salida / error.
expediente existe y es setuid.
expediente existe y se puede escribir (tiene permiso de
escritura para el usuario efectivo).
expediente existe y es ejecutable (ha ejecutar / permiso de
bsqueda para el usuario efectivo).

Aqu tenemos un script que muestra algunas de las expresiones de


archivos:
#! / Bin / bash
# Test-archivo: Evaluar el estado de un archivo
FILE = ~ / .bashrc
si [-e "$ FILE"]; entonces
if [-f "$ FILE"]; entonces
echo "$ archivo es un archivo normal." fi
si [-d "$ FILE"]; entonces
echo "$ archivo es un directorio." fi
si [-r "$ FILE"]; entonces
echo "$ FILE se puede leer." fi
si [-w "$ FILE"]; entonces
echo "$ FILE tiene permisos de
escritura." fi
si [-x "$ FILE"]; entonces
echo "$ FILE es ejecutable / bsquedas." fi
ms
echo "$ archivo no existe" exit 1 fi
Salida

385

27 - Control de flujo: Bifurcaciones Con si


El guin evala el archivo asignado al archivo permanente y muestra sus resultados a medida
que se realiza la evaluacin. Hay dos cosas interesantes a tener en cuenta acerca de este script.
En primer lugar, observe cmo se cotiza el parmetro $ ARCHIVO dentro de las expresiones.
Esto no es necesario, pero es una defensa contra el parmetro de estar vaco. Si la expansin de
parmetro de $ ARCHIVO diera lugar a un valor vaco, causara un error (los operadores se
interpretaran como cadenas no nulos en lugar de los operadores). Uso de las comillas el
parmetro asegura que el operador siempre es seguido por una cadena, incluso si la cadena
est vaca. En segundo lugar, observe la presencia de la orden de salida cerca del final de la
secuencia de comandos. El comando exit acepta un nico argumento opcional, que se
convierte en estado de salida de la secuencia de comandos. Cuando se pasa ningn
argumento, los valores por defecto de estado de salida al estado de salida de la ltima orden
ejecutada. Usando la salida de esta manera permite que la secuencia de comandos para
indicar fracaso si $ FILE se expande al nombre de un archivo que no existe. El comando de
salida que aparece en la ltima lnea del guin est all como una formalidad. Cuando una
secuencia de comandos "se ejecuta fuera de la final" (alcanza el final del archivo), que termina
con un estado de salida de la ltima orden ejecutada por defecto, de todos modos.
Del mismo modo, funciones de shell pueden devolver un estado de salida mediante la
inclusin de un argumento entero a la orden de devolucin. Si tuviramos que convertir el
script anterior a una funcin de shell para incluirlo en un programa ms amplio, que podra
reemplazar los comandos de salida con las declaraciones de devolucin y obtener el
comportamiento deseado:
archivo_prueba {
()
# Test-archivo : Evaluar el estado de un archivo
FILE = ~ /. bashrc

ms

si [-e "$ FILE"]; entonces


si [ -f "$ FILE"]
entonces
echo "$ FILE es un archivo normal ".
fi
si [ -d "$ FILE"]
entonces
echo "$ FILE es un directorio ".
fi
si [ -r "$ FILE"]
entonces
echo "$ FILE es legible ".
fi
si [ -w "$ FILE"]
entonces
echo "$ FILE se puede escribir ".
fi
si [ -X "$ FILE"]
entonces
echo "$ FILE es ejecutable / bsqueda ".
fi
eco "Hace $
volverARCHIVO
1

no existe "

386
prueba
fi
}

Expresiones de Cuerda

Las siguientes expresiones se utilizan para evaluar las cadenas:


Tabla 27-2: Expresiones de Cuerda prueba
Expresin

Si es cierto ...

cadena

cadena no es nulo.

-n cadena

La longitud de la cadena es mayor que cero.

-z cadena

La longitud de la cuerda es igual a cero.

stringi = Cadena2
stringi == cadena2

cadena1 y cadena2 son iguales. Individual o doble


signos iguales se pueden usar, pero el uso de doble
signos iguales se prefieren en gran medida.

stringi ! = Cadena2

cadena1 y cadena2 no son iguales.

stringi > Cadena2


stringi <Cadena2

cadena1 clases despus cadena2.


cadena1 tipo antes cadena2.

Advertencia: El> y <operadores de expresin deben ser citados (o escaparon con una
barra invertida) cuando se utiliza con la prueba. Si no lo son, que sern interpretados
por el shell como operadores de redireccin, con resultados potencialmente
destructivos. Tambin tenga en cuenta que si bien la documentacin de bash establece
que el orden de clasificacin se ajusta a la orden de clasificacin de la localizacin
actual, no es as. ASCII (POSIX) orden se utiliza en las versiones de fiesta hasta e
incluyendo 4.0.
Aqu es un script que incorpora expresiones de
cadena: #! / Bin / bash
# Test-string: evaluar el valor de una cadena RESPUESTA
= tal vez
if [-z "$ RESPUESTA"]; entonces

387

echo "No hay una respuesta." > & 2


exit 1 fi
si ["$ RESPUESTA" = "yes"]; then echo "La
respuesta es S." elif ["$ RESPUESTA" = "no"];
then echo "La respuesta es NO." elif ["$
RESPUESTA" = "quizs"]; then echo "La
respuesta es tal vez."
ms
echo "La respuesta es desconocida." fi
27 - Control de flujo: Bifurcaciones Con si
En este script, se evala la RESPUESTA constante. En primer lugar, determinar si la cadena
est vaca. Si es as, terminamos el guin y establecemos el estado de salida a uno. Note la
redireccin que se aplica al comando de eco. Esto redirige el mensaje de error "No hay una
respuesta." Error estndar, que es lo "correcto" que ver con los mensajes de error. Si la cadena
no est vaca, se evala el valor de la cadena para ver si es igual a "s", "no", o "tal vez".
Hacemos esto mediante el uso de elif, que es la abreviatura de "otro si. "Mediante el uso de
elif, somos capaces de construir una prueba lgica ms compleja.

Expresiones enteros
Las siguientes expresiones se usan con nmeros
enteros: Tabla 27-3: probar Entero Expresiones
Expresin

Si es cierto ...

integerl -eq

entero2

entero1 es igual a Entero2.

integerl -ne

entero2

entero1 no es igual a Entero2.

integerl -LE

entero2

entero1 es menor que o igual a entero2.

integerl -lt

entero2

entero1 es menor que entero2.

integerl -ge
integerl -gt

entero2
entero2

entero1 es mayor que o igual a entero2.


entero1 es mayor que entero2.

Aqu es un script que les demuestra:

#! / Bin / bash

388

# Test-entero: evaluar el valor de un nmero entero. INT = -5


if [-z "$ INT"]; entonces
echo "INT est vaca." > & 2
exit 1 fi

ms

si [$ INT -eq 0]; then echo


"INT es cero."
si [$ INT -lt 0]; entonces
echo "INT es negativo."
ms
echo "INT es positivo." fi
si [$ ((INT% 2)) -eq 0]; thenecho "INT es par."
ms
echo "INT es extrao." fi fi

prueba

La parte interesante de la secuencia de comandos es cmo se determina si un nmero entero


es par o impar. Mediante la realizacin de una operacin de mdulo 2 sobre el nmero, que
divide el nmero por dos y devuelve el resto, se puede decir si el nmero es par o impar.

Una ms moderna versin de prueba


Las versiones recientes de fiesta incluyen un comando compuesto que acta como un
sustituto mejorado para la prueba. Se utiliza la siguiente sintaxis:
[[ expresin]]
donde, como prueba, la expresin es una expresin que se evala como resultado ya sea
verdadera o falsa. El comando [[]] es muy similar a la prueba (que apoya todas sus
expresiones), pero aade una nueva e importante expresin de cadena:
cadenal = ~ regex
que devuelve true si cadenal se corresponde con la expresin regular expresin regular
extendida. Esto abre un montn de posibilidades para la realizacin de tareas como la
validacin de datos. En nuestro ejemplo anterior de las expresiones enteras, el guin sera un
fracaso si la constante INT contena nada ms que un nmero entero. El script necesita una
manera de verificar que la constante contiene un nmero entero. El uso de [[]] Con la cadena
= ~ expresooperador de iones, que podra mejorar la
389

27 - Control de flujo: Bifurcaciones Con


guin si de esta manera:
#! / Bin / bash
# Test-entero2: evaluar el valor de un nmero entero. INT = -5
si [["$ INT" = ~ * - [0-9] + $]?]; entonces
si [$ INT -eq 0]; entonces
echo "INT es cero."
ms
si [$ INT -lt 0]; entonces
echo "INT es negativo."
ms
echo "INT es positivo." fi
si [$ ((INT% 2)) -eq 0]; thenecho "INT es par."
ms
echo "INT es extrao." fi fi
ms
echo "INT no es un entero." > & 2 exit 1 fi

Mediante la aplicacin de la expresin regular, estamos en condiciones de limitar el valor de


INT a slo cadenas que comienzan con un signo menos opcional, seguido por uno o ms
nmeros. Esta expresin tambin elimina la posibilidad de valores vacos.
Otra caracterstica adicional de [[]] es que el operador == es compatible con el patrn que
coincide con el mismo nombre de ruta de expansin manera lo hace. Por ejemplo:

[Me @ linuxbox ~] $ FILE = foo.bar


[Me @ linuxbox ~] $ si [[$ FILE == foo *].]; entonces
> echo "$ archivo coincide con el patrn 'foo. *'"
> fi
foo.bar coincide con el patrn 'foo. *'
Esto hace que [[]] til para evaluar archivo y rutas de acceso.

390

#! / Bin / bash
# Test-integer2a: evaluar el valor de un nmero entero. INT = -5
si [["$ INT" = ~ A - [0-9] + $]?]; entonces si ((INT == 0)); entonces
echo "INT es cero."
ms
if ((INT <0)); entonces
echo "INT es negativo."
ms
echo "INT es positivo." fi
if ((((INT 2%)) == 0)); thenecho "INT es par."
ms
echo "INT es extrao." fi fi
ms
[Me @ linuxbox ~] $ if ((1)); then echo "Es verdad."; fi
echo "INT no es un entero." > & 2 exit 1 fi
Es cierto.
[Me @ linuxbox ~] $ if ((0)); then echo "Es verdad."; fi
[Me @ linuxbox ~] $
(()) - Diseado para los nmeros enteros

(()) - Diseado para los nmeros enteros


Adems de el comando compuesto [[]], golpe tambin proporciona el ((
)) Com
comando de libras, que es til para operar en nmeros enteros. Es compatible con un conjunto
completo de evaluaciones aritmticas, un tema que cubriremos completamente en el Captulo
34.
(()) Se utiliza para realizar pruebas de verdad aritmticas. Un resultados de las pruebas
verdad aritmticas en cierto si el resultado de la evaluacin aritmtica es distinto de cero.
El uso de (()), podemos simplificar un poco el guin de la prueba entero2 como esto:
Observe que usamos menos-que y mayor que los signos y que == se utiliza para probar la
equivalencia. Esta es una sintaxis de aspecto ms natural para trabajar con nmeros enteros.
Ntese tambin, que debido a que el comando compuesto (()) es parte de la sintaxis shell en
lugar de una ordenanza
391

27 - Control de flujo: Bifurcaciones Con si


nario de comandos, y slo se ocupa de los nmeros enteros, es capaz de reconocer las
variables por su nombre y no requiere la expansin a realizar. Discutiremos ((
)) Y la
relacionada
expansin aritmtica en el captulo 34.
#! / Bin / bash
# prueba-entero3: determinar si un nmero entero es dentro de un
# especificada rango de valores.
MIN_VAL = 1
MAX_VAL = 100
INT = 50
Tabla 27-4: Operadores lgicos
si [["$ INT" = ~ A - [0-9] + $]?]; entonces
si [[INT -ge MIN_VAL &&
INT -LE MAX_VAL]]; then echo
Operacin
prueba
[[]] Y"$(())
INT est a $ MIN_VAL a $ MAX_VAL."
Y
-a
&&
ms
Oregn
echo "$ INT est fuera
-o de rango." fi
II
ms
NO! !
echo "INT no es un entero." > & 2 exit 1 fi

Combinando las expresiones


Tambin es posible combinar las expresiones para crear evaluaciones ms complejas. Las
expresiones se combinan mediante operadores lgicos. Vimos esto en el captulo 17, cuando
aprendimos sobre el comando find. Hay tres operaciones lgicas para la prueba y [[]]. Ellos
son AND, OR y NOT. prueba y [[]] utilizar diferentes operadores para representar estas
operaciones:
He aqu un ejemplo de una operacin AND. La siguiente secuencia de comandos determina si
es un nmero entero dentro de un rango de valores:

392

si [$ INT -ge $ MIN_VAL -a $ INT -LE $ MAX_VAL]; then echo "$


INT est a $ MIN_VAL a $ MAX_VAL."
ms
echo "$ INT est fuera de rango." fi
Combinando las expresiones
En este script, determinamos si el valor de INT entero se encuentra entre los valores de
MIN_VAL y MAX_VAL. Esto se realiza por un nico uso de [[]], que incluye dos expresiones
separadas por el operador &&. Tambin podramos haber codificado esta prueba usando:

El! operador de negacin invierte el resultado de una expresin. Devuelve verdadero si una
expresin es falsa, y devuelve false si una expresin es verdadera. En la siguiente secuencia de
comandos, modificamos la lgica de nuestra evaluacin para encontrar los valores de INT que
estn fuera del rango especificado:
#! / Bin / bash
# prueba-integer4: determinar si un nmero entero es fuera de un
# especificada rango de valores.
MIN_VAL = 1
MAX_VAL = 100
INT = 50
]]; entonces _VAL. "
si [["$ INT" = ~ A - [0-9] + $]?]; entonces
si [[! (INT -ge MIN_VAL && INT -LE MAX_VAL) echo "$
INT est fuera $ MIN_VAL a $ MAX_
ms
echo "$ INT est en rango." fi
ms
echo "INT no es un entero." > & 2 exit 1 fi

Tambin se incluyen los parntesis alrededor de la expresin, para la agrupacin. Si stas no


se incluyeron, la negacin slo se aplicara a la primera expresin y no la combinacin de los
si [! \ ($ INT -ge $ MIN_VAL -a $ INT -LE $ MAX_VAL \)]; entonces
dos. Codificacin con esta prueba se llevara a cabo de esta manera:

393

Portabilidad es el duende de las mentes pequeas


Si usted habla con la gente "real" de Unix, usted descubrir rpidamente que muchos
de ellos no les gusta mucho Linux. Ellos consideran que es impuro y sucio. Uno de los
principios de los seguidores de Unix es que todo debe ser "porttil". Esto significa que
cualquier secuencia de comandos que usted escribe debe ser capaz de ejecutar, sin
cambios, en cualquier sistema Unix.
La gente de Unix tienen buenas razones para creer esto. Despus de haber visto lo que
las extensiones de propiedad de los comandos y conchas hizo para el mundo Unix
antes de POSIX, que son naturalmente cuidadoso de los efectos de Linux en su
querido sistema operativo.
Pero la portabilidad tiene un inconveniente grave. Se impide el progreso. Requiere
que las cosas siempre se hacen uso de "mnimo comn denominador" tcnicas. En el
caso de la programacin de shell, que significa hacer todo lo compatible con sh, el
shell original de Bourne.
Este inconveniente es la excusa de que vendedores de software privativo utilizan para
justificar sus extensiones propietarias, slo los llaman "innovaciones". Pero en
realidad son slo dispositivos de lock-in para sus clientes.
Las herramientas de GNU, como bash, no tienen tales restricciones. Animan a la
portabilidad mediante el apoyo a las normas y al estar universalmente disponibles.
echo
"$ INT
fuera
$ MIN_VAL
a $ MAX_VAL."
Puede instalar
bash
y lasest
otras
herramientas
de GNU
en casi cualquier tipo de sistema,
ms
incluso Windows, sin costo. As que no dude en utilizar todas las caractersticas de
echo "$ INT est en rango." fi
bash. Es realmente porttil.
27 - Control de flujo: Bifurcaciones Con si
Puesto que todas las expresiones y operadores utilizados por la prueba son tratados como
argumentos del comando por el shell (a diferencia de [[]] y (())), personajes que tienen un
significado especial para fiesta, como <,>, (y), deben ser citado o escapado.
Al ver que la prueba y [[]] hacer ms o menos lo mismo, lo cual es preferible? prueba es
tradicional (y parte de POSIX), mientras que [[]] es especfico para golpear. Es importante
saber cmo utilizar la prueba, ya que se utiliza mucho, pero [[]] es claramente ms til y es
ms fcil de cdigo.

Los operadores de control: Otra forma de Rama


Bash ofrece dos operadores de control que pueden realizar ramificacin. El && (AND) y ||
(OR) operadores funcionan como los operadores lgicos en el comando compuesto [[]]. Esta es
la sintaxis:
394

Los operadores de control: Otra forma de


Rama
commandl && Comando2 y
commandl || Comando2
Es importante entender el comportamiento de estos. Con el operador &&, commandl se
ejecuta y comando2 se ejecuta si, y slo si, commandl tiene xito. Con el operador ||,
commandl se ejecuta y comando2 se ejecuta si, y slo si, commandl no tiene xito.
En trminos prcticos, esto significa que podemos hacer algo como esto:

[Me @ linuxbox ~] $ mkdir temp temp && cd


Esto crear un directorio llamado temp, y si tiene xito, el directorio de trabajo actual ser
cambiado a la temperatura. El segundo comando se intenta slo si el comando mkdir es
exitosa. Del mismo modo, un comando como este:

[Me @ linuxbox ~] $ [temp -d] || mkdir temp


pondr a prueba para la existencia de la temperatura del directorio, y slo si la prueba falla, se
crear el directorio. Este tipo de construccin es muy til para el manejo de errores en los
scripts, un tema que discutiremos ms en captulos posteriores. Por ejemplo, podramos hacer
esto en un script:
[Temp -d] || exit 1
Si la secuencia de comandos requiere que el directorio Temp, y no existe, entonces el script
terminar con un estado de salida de uno.

Resumiendo
Comenzamos este captulo con una pregunta. Cmo podramos hacer nuestro script
sys_info_page detectar si el usuario tena permiso para leer todos los directorios de inicio?
Con nuestro conocimiento de si, podemos resolver el problema mediante la adicin de este
cdigo a la funcin report_home_space:

report_home_space () {
si [[$ (-u id) -eq 0]]; entonces
395

ms

fi
retorno

cat << - _EOF_


<H2> Inicio Utilizacin del Espacio (Todos los
usuarios) </ h2> <PRE> $ (du -sh / home / *) </ PRE>
_EOF_
cat << - _EOF_
<H2> Inicio Utilizacin del Espacio ($ USER) </ h2>
<PRE> $ (du -sh $ HOME) </ PRE>
_EOF_

}
27 - Control de flujo: Bifurcaciones Con si
Evaluamos la salida del comando id. Con la opcin -u, Identificacin emite el nmero de ID de
usuario numrico del usuario efectivo. El superusuario es siempre cero y cada otro usuario es
un nmero mayor que cero. Sabiendo esto, podemos construir dos documentos diferentes
aqu, uno toma ventaja de privilegios de superusuario, y la otra, restringidos al propio
directorio del usuario.
Vamos a tomar un descanso de la sys_info_page programa, pero no te preocupes. Ser de
nuevo. Mientras tanto, vamos a cubrir algunos de los temas que vamos a necesitar cuando
reanudemos nuestro trabajo.

Lectura adicional
Hay varias secciones de la pgina de manual de bash que proporcionan ms detalles sobre los
temas tratados en este captulo:

Listas (cubre los operadores de control && y ||)

Comandos compuestos (cubiertas [[]], (()) y si)

Expresiones condicionales

RDENES INTERNAS DEL SHELL (cubre prueba)

Adems, la Wikipedia tiene un buen artculo sobre el concepto de pseudocdigo:


http://en.wikipedia.org/wiki/Pseudocode

396

#! / Bin / bash
# Test-entero2: evaluar el valor de un nmero entero. INT = -5
si [["$ INT" = ~ A - [0-9] + $]?]; entonces si [$ INT -eq 0]; entonces
echo "INT es cero."
ms
si [$ INT -lt 0]; entonces
echo "INT es negativo."
ms
echo "INT es positivo." fi
si [$ ((INT% 2)) -eq 0]; thenecho "INT es par."
ms
echo "INT es extrao." fi fi
ms
echo "INT no es un entero." > & 2 exit 1 fi
28 - Lectura de entrada del
teclado

28

- Lectura de entrada del teclado

Las secuencias de comandos que hemos escrito hasta ahora carecen de una caracterstica
comn en la mayora interactividad programas- ordenador. Es decir, la capacidad del
programa para interactuar con el usuario. Aunque muchos programas no necesitan ser
interactivo, algunos programas se benefician de ser capaz de aceptar la entrada directamente
del usuario. Tomemos, por ejemplo, esta secuencia de comandos desde el captulo anterior:
Cada vez que queremos cambiar el valor de INT, tenemos que editar el script. Sera mucho
ms til si la secuencia de comandos se puede pedir al usuario un valor. En este captulo,
vamos a empezar a ver cmo podemos aadir interactividad a nuestros programas.

397

#! / Bin / bash
# Entero leer: evaluar el valor de un nmero entero.
echo -n "Introduzca un nmero entero ->" leer int
si [["$ int" = ~ A - [0-9] + $]?]; entonces si [$ int -eq 0]; entonces
echo "$ int es cero."
ms
si [$ int -lt 0]; entonces
echo "$ int es negativo."
ms
echo "$ int es positivo." fi
si [$ ((int% 2)) -eq 0]; thenecho "$ int es par."
ms
echo "$ int es extrao." fi fi
ms
echo "El valor de entrada no es un nmero entero." >
& 2 exit 1 fi

28 ____________________________________

Lectura de entrada del teclado ______________________________________________________

leer - leer valores de la entrada estndar


La orden interna leer se utiliza para leer una sola lnea de la entrada estndar. Este comando
puede ser utilizado para leer la entrada del teclado o, cuando se emplea la redireccin, una
lnea de datos de un archivo. El comando tiene la siguiente sintaxis:
leer [-opciones] [variables ...]
donde las opciones es una o ms de las opciones disponibles se enumeran a continuacin y
variable es el nombre de una o ms variables utilizadas para mantener el valor de entrada. Si
no se proporciona ningn nombre de variable, la respuesta variable de shell contiene la lnea
de datos.
Bsicamente, leer asigna los campos de la entrada estndar a las variables especificadas. Si
modificamos nuestro script evaluacin entero de usar leer, podra tener este aspecto:
Utilizamos eco con la opcin -n (que suprime el salto de lnea final en la salida) para que
aparezca el smbolo, y luego utilizar leer a la entrada de un valor para la variable int. Al
ejecutar este script de resultados en esta:

398

[Me @ linuxbox ~] leer entero $


#!
/ Bin / bash
Introduzca
un nmero entero -> 5 5
es positivo.
#
Mltiple
5 es
impar. leer: leer varios valores desde el teclado
echo -n "Introduzca uno o ms valores>" var1 var2 leer var3 var4
VAR5
leer - leer valores de la entrada estndar
eco "Var1 = '$ Var1
eco "Var2 = '$ Var2
eco "Var3 = '$ Var3
eco "Var4 = '$ Var4
eco "VAR5 = '$
VAR5
leer puede asignar
de entrada a mltiples variables, como se muestra en este script:

En este script, asignamos y mostrar hasta cinco valores. Observe cmo se comporta cuando se
le da lectura diferente nmero de valores:
[Me @ linuxbox ~] $ lectura mltiple
Introduzca uno o ms valores> abc
var1 = 'A'
var2 = 'B'
var3 = 'C'
var4 = 'D'
VAR5
'E'
=
[Me @ linuxbox ~] $ lectura mltiple
Introduzca uno o ms valores> a
'A'
var1
var2 = = ''
=
var3 ''
var4
= ''
VAR5 = ''
[Me @ linuxbox ~] $ lectura mltiple
Introduzca uno o ms valores> abc
var1 = 'A'
var2 = 'B'
var3 = 'C'
var4 = 'D'
VAR5
'E f g'
=

de

defg

399

28 - Lectura de entrada del teclado


Si de lectura recibe menos que el nmero era de esperar, las variables adicionales estn vacos,
mientras que una cantidad excesiva de los resultados de entrada en la variable final que
contiene la totalidad de la entrada adicional.
Si no aparece ninguna variable despus de que el comando de lectura, una variable de shell,

#! / Bin / bash
# Solo leer:

leer mltiples valores en la variable por defecto

[Me
lectura
nica
Ingrese
echo@-nlinuxbox
"Enter ~] $uno
o ms
valores>
"
uno
o
ms
valores>
Responder
abcd
= 'abcd'
leer
echo
"RESPUESTA = $ CONTESTACIN '"
Al ejecutar este script de resultados en esta:
respuesta, se le asignar toda la entrada:

Opciones
de lectura compatible con las siguientes opciones: Tabla 28-1: Opciones de lectura

Opcin
matriz -a
-d delimitador
-e
cadena -i

num -n
prompt -p
400

Descripcin
Asigne la entrada a la gama, empezando por el ndice cero.
Vamos a cubrir las matrices en el Captulo 35.
El primer carcter en el delimitador de cadena se utiliza para
indicar el final de la entrada, en lugar de un carcter de nueva
lnea.
Utilice Readline para manejar la entrada. Esto permite la
edicin de entrada en la misma manera que la lnea de
comandos.
Utilice cadena como una respuesta por defecto si el usuario
simplemente presiona Enter. Requiere la opcin -e.
Leer caracteres num de entrada, en lugar de una lnea entera.
Visualice un indicador para la entrada usando el smbolo de
cadena.

leer - leer valores de la entrada estndar


-r
Modo Raw. No interprete caracteres de barra invertida como
se escapa.
-s
Modo silencioso. No echo caracteres de la pantalla a medida
que se escriben. Esto es til cuando se introducen las
contraseas y otra informacin confidencial.
-t segundos
Tiempo de espera. Terminar de entrada despus de segundos.
-u fd

leer devuelve un estado de salida distinto de cero si un


momento
de entrada
fuera.
Utilice la entrada
de descriptor
de fichero fd, en lugar de la
entrada estndar.

El uso de las diversas opciones, que podemos hacer cosas interesantes con lectura. Por
ejemplo, con la opcin -p, podemos proporcionar una cadena de peticin:
#! / Bin / bash
#-Secreto leer: Entrada de una frase de contrasea secreta
si se lee -t 10 -SP "Enter passphrase secreto>" secret_pass; luego echo -e "\ nsecret
frase de contrasea = '$ secret_pass'"
ms
echo -e "\ nInput Tiempo de espera
agotado"> & 2 exit 1 fi
#! / Bin / bash
# Lectura nica: leer varios valores en la variable por defecto leer -p
"Ingrese uno o ms valores>" echo "REPLY = '$ Responder'"
Con la -t -s y opciones que podemos escribir un script que lee la entrada y el tiempo de espera
si la entrada no se completa en un tiempo determinado "secreto":
La secuencia de comandos solicita al usuario una contrasea secreta y espera 10 segundos
para que la entrada. Si la entrada no se completa dentro del tiempo especificado, el script
finaliza con un error. Desde la opcin -s se incluye, los caracteres de la frase de contrasea no
se reflejan en la pantalla a medida que se escriben.
401

28 - Lectura del teclado de


entrada
Es posible suministrar al usuario una respuesta predeterminada utilizando las opciones -e y -i
juntos:

#! / Bin / bash
# Lectura predeterminado: suministrar un valor por defecto si el usuario pulsa la
tecla Entrar.
leer -e -p "? Cul es el nombre de usuario" $ -i USUARIO echo "Ha respondido: '$
CONTESTACIN'"
En este guin, que solicitar al usuario que ingrese su / su nombre de usuario y utilizar la
variable de entorno USER para proporcionar un valor por defecto. Cuando se ejecuta la
secuencia de comandos que muestra la cadena por defecto y si el usuario simplemente
presiona la tecla Intro, lectura asignar la cadena predeterminada a la variable respuesta.

[Me @ linuxbox ~] $ Cul es su


nombre de usuario predeterminado
lectura? Me Ha respondido: "yo"

IFS
Normalmente, el shell realiza la divisin de palabras en la entrada proporcionada para leer.
Como hemos visto, esto significa que varias palabras separadas por uno o ms espacios se
convierten en elementos separados en la lnea de entrada, y se asignan a las variables de
separar por lectura. Este comportamiento se configura por una variable de shell llamado IFS
(por campo interno Separador). El valor predeterminado de IFS contiene un espacio, un
tabulador, y un carcter de nueva lnea, cada uno de los elementos que separar unos de otros.
Podemos ajustar el valor de IFS para controlar la separacin de los campos de entrada para
leer. Por ejemplo, el archivo / etc / passwd contiene lneas de datos que utilizan el carcter de
dos puntos como separador de campo. Al cambiar el valor de IFS a una sola de colon,
podemos usar leer para introducir los contenidos de / etc / passwd y campos separados con
xito en diferentes variables. Aqu tenemos un script que hace precisamente eso:

#! / Bin / bash
# Lectura IFS: leer campos de un archivo FILE
= / etc / passwd

402

leer - leer valores de la entrada estndar


leer -P " Introduzca un nombre de usuario> "nombre_usuario
expe
dien _info = $ (grep "A $ nombre_usuario:" $ FILE)
te
si [ -n " $ File_info "];
entonces
IFS = ': "Leer usuario pw cscara nombre uid gid <<< "$ file_info"
eco "Usuario =
'$ User' "
eco "UID =
'$ Uid' "
eco "GID =
'$ Gid' "
eco "Nombre
'$ Nombre' "
completo
eco "Inicio
Dir.= =
'$ A casa' "
eco "Shell =
'$ Shell' "
ms
"Este usuario no
eco existe
"$ Nombre_usuario '"> & 2
Salid 1
a
fi
Esta secuencia de comandos le pide al usuario que introduzca el nombre de usuario de una
cuenta en el sistema, a continuacin, muestra los diferentes campos que se encuentran en el
registro del usuario en el archivo / etc / passwd. El guin contiene dos lneas interesantes. La
primera es: file_info = $ (grep "A $ nombre_usuario:" $ FILE)
Esta lnea asigna los resultados de un comando grep a la file_info variable. La expresin
regular utilizada por grep asegura que el nombre de usuario slo coincidir con una sola lnea
en el archivo / etc / passwd.
La segunda lnea interesante es esta:
IFS = ":" leer usuario pw cscara nombre uid gid <<< "$ file_info"
La lnea se compone de tres partes: una asignacin de variables, un comando de lectura con
una lista de nombres de variables como argumentos, y un nuevo operador de redireccin
extrao. Pronto nos ocuparemos de la primera asignacin de variables.
El depsito permite una o ms asignaciones de variables a tener lugar inmediatamente antes
de un comando. Estas asignaciones alteran el medio ambiente para el comando que sigue. El
efecto de la asignacin es temporal; slo cambiar el entorno para la duracin de la orden. En
nuestro caso, el valor de IFS se cambia a un carcter de dos puntos. Alternativamente,
podramos haber codificado de esta manera:
OLD_IFS = "$ IFS"
IFS = ":"
leer usuario pw cscara uid gid nombre hogar <<< "$ file_info"
IFS = "$ OLD_IFS"
donde almacenamos el valor de IFS, asigne un nuevo valor, realice el comando de lectura, y
luego restaurar IFS a su valor original. Claramente, la colocacin de la asignacin de la
variable en frente de
403

Usted no puede leer Pipe


Mientras que el comando de lectura normalmente toma la entrada de la entrada
estndar, no se puede hacer esto:
echo "foo" | ver
Es de esperar que esto funcione, pero no es as. El comando aparecer para tener xito,
pero la variable REPLY siempre estar vaca. Por qu es esto?
La explicacin tiene que ver con la forma en que la cscara se encarga de las tuberas.
En bash (y otros proyectiles, tales como sh), tuberas crean subniveles. Estas son
copias de la cscara y de su entorno, que se utilizan para ejecutar el comando en la
tubera. En nuestro ejemplo anterior, leer se ejecuta en un subshell.
Subniveles en sistemas tipo Unix crean copias del medio ambiente para los procesos a
utilizar durante la ejecucin. Cuando los procesos de acabados se destruye la copia del
medio ambiente. Esto significa que una subcapa nunca puede alterar el entorno de su
proceso padre. lectura asigna variables, que luego se convierten en parte del medio
ambiente. En el ejemplo anterior, leer asigna el valor "foo" a la respuesta variable en el
entorno de su subnivel, pero cuando el comando se interrumpe, el subnivel y su
entorno son destruidos, y el efecto de la asignacin se pierde.
El uso de cadenas aqu es una manera de evitar este comportamiento. Otro mtodo se
discute en el Captulo 36.
28 - Lectura de entrada del teclado _________________________________________________
el comando es una forma ms concisa de hacer la misma cosa.
El operador <<< indica aqu una cadena. Una cadena de aqu es como un documento aqu,
slo ms corto, que consiste en una sola cadena. En nuestro ejemplo, la lnea de datos del
archivo / etc / passwd se alimenta a la entrada estndar del comando de lectura. Podramos
preguntarnos por qu este mtodo bastante oblicua fue elegido en lugar de: echo "$ file_info"
| IFS = ":" leer usuario pw casa cscara nombre gid uid
Bueno, hay una razn ...

Entrada de Validacin
Con nuestra nueva capacidad de tener la entrada de teclado viene un desafo de programacin
adicional, entrada validar. Muy a menudo la diferencia entre un programa bien escrito y uno
mal escrito radica en la capacidad del programa para hacer frente a lo inesperado. Con
frecuencia, el inesperado aparece en forma de mal de entrada. Hemos hecho un poco de esto
con nuestros programas de evaluacin en el captulo anterior, donde nos registramos los
valores de nmeros enteros y descartadas valores vacos y los caracteres no numricos. Es
importante para llevar a cabo este tipo de controles de programacin cada vez que un
programa recibe de entrada, para protegerse contra datos no vlidos. Esto es especialmente
importante para los programas que son compartidos por varios usuarios. Omitiendo 404

Entrada de
Validacin
estas medidas de seguridad en aras de la economa podran ser excusados si un programa se
va a utilizar una vez y slo por el autor para realizar alguna tarea especial. Incluso entonces, si
el programa lleva a cabo tareas peligrosas como borrar archivos, sera conveniente incluir la
validacin de datos, por si acaso.
Aqu tenemos un ejemplo de programa que valida los diversos tipos de entrada:

#! / Bin / bash
# lectura de validacin: validar la entrada
invalid_input () {
echo "Entrada no vlida '$
CONTESTACIN'"> & 2 salida 1
}
leer -p "Introduzca un solo elemento>"
# de entrada est vaca (no vlido)
[[-z $ Responder]] && invalid_input
# entrada es varios artculos (no vlido)
(($ (Echo $ Responder | wc -w)> 1)) && invalid_input
# se introduce un nombre de archivo vlido?
si [[$ RESPUESTA = ~ * [- [: alnum:] \ ._] + $]]; then
echo "'$ CONTESTACIN' es un nombre de
archivo vlido." si [[-e $ Responder]]; entonces
echo "Y existe el archivo '$ CONTESTACIN'."
ms
echo "Sin embargo, no existe el archivo '$
CONTESTACIN'." fi
# se introduce un nmero de punto flotante?
si [[$ RESPUESTA = ~ A - [[: dgito:]] * \ [[: dgito:?.]] + $]]; thenecho "'$
CONTESTACIN' es un nmero de punto flotante."
ms
echo "'$ CONTESTACIN' no es un nmero de punto flotante."
fi

ms

# se introduce un nmero entero?


si [[$ RESPUESTA = ~ A - [[: dgito:?]] + $]]; thenecho "'$
CONTESTACIN' es un nmero entero."
ms
echo "'$ CONTESTACIN' no es un nmero entero." fi

echo "La cadena '$ CONTESTACIN' no es un nombre de


archivo vlido." fi

405

28 - Lectura del teclado de entrada


Esta secuencia de comandos le pide al usuario que introduzca un elemento. El tema se analiza
posteriormente para determinar su contenido. Como podemos ver, el script hace uso de
muchos de los conceptos que hemos cubierto hasta ahora, incluyendo funciones de shell, [[ ]],
Por/ favor
#!
Bin / seleccione:
bash
1. Mostrar
del
#-Men
leer:informacin
un programa
desistema
informacin del sistema de mens
2.
Mostrar espacio en disco
claro
ecoPantalla
"
3.
Inicio Espacio Utilizacin
Por
favor seleccione:
0. Salir
1.
Mostrarlainformacin
del sistema
Introduzca
seleccin [0-3]>
2.
Mostrar espacio en disco
3.
Visualizacin Utilizacin Inicio Espacio
0. Salir "
leer -p "Introduzca la seleccin [0-3]>"
si [[$ RESPUESTA = ~ A [0-3] $]];
entonces si [[$ RESPUESTA == 0]];
entonces
echo "Programa terminado."
salida fi
si [[$ RESPUESTA == 1]]; entonces
((
)), El operador de control
&&, Y si, adems de una buena dosis de expresiones regulares.

Mens
Un tipo comn de interactividad se llama basado en mens. En los programas basadas en
mens, el usuario se le presenta una lista de opciones y se le pide que elija uno. Por ejemplo,
podramos imaginar un programa que present el siguiente:
Usando lo que aprendimos de escribir nuestro programa sys_info_page, podemos construir
un programa basado en mens para realizar las tareas en el men de arriba:

406

echo "Nombre de host: $


HOSTNAME" salida tiempo de actividad fi
si [[$ RESPUESTA == 2]];
entonces df -h salida fi
si [[$ RESPUESTA == 3]]; entonces
si [[$ (-u id) -eq 0]]; entonces
echo "Utilizacin Inicio Espacio (Todos los usuarios)"
du -sh / home / *
ms
echo "Utilizacin Inicio Espacio ($ USER)" du
-sh $ exit fi fi INICIO
ms
echo "entrada no vlida." > & 2
exit 1 fi

Mens

Esta secuencia de comandos se divide lgicamente en dos partes. La primera parte muestra el
men e introduce la respuesta del usuario. La segunda parte identifica la respuesta y lleva a
cabo la accin seleccionada. Observe el uso de la orden de salida en este script. Se utiliza aqu
para evitar que la secuencia de comandos desde la ejecucin de cdigo innecesario despus de
una accin se ha llevado a cabo. La presencia de mltiples puntos de salida en un programa es
generalmente una mala idea (que hace que la lgica del programa ms difcil de entender),
pero funciona en este script.

Resumiendo
En este captulo, dimos nuestros primeros pasos hacia la interactividad; permitiendo a los
usuarios a introducir datos en nuestros programas a travs del teclado. El uso de las tcnicas
presentadas hasta el momento, es posible escribir muchos programas tiles, tales como
programas de clculo especializados y de usar fciles interfaces a la herramientas de lnea de
comandos arcanos. En el siguiente captulo, nos basaremos en el concepto de programa menimpulsado para que sea an mejor.

Crdito extra
Es importante estudiar los programas en este captulo con cuidado y tener una comprensin
completa de la forma en que se estructuran lgicamente, como los programas venideros ser
cada vez ms complejo. Como ejercicio, vuelve a escribir los programas en este captulo
utilizando el comando de prueba en lugar del comando compuesto [[]]. Sugerencia: Utilice
grep para evaluar las expresiones regulares y evaluar el estado de salida. Esta ser una buena
prctica.
407

28 - Lectura del teclado de entrada

Lectura adicional
El Manual de Referencia Bash contiene un captulo sobre rdenes internas, que incluye
el comando de lectura:
http://www.gnu.Org/software/bash/manual/bashref.html#Bash-Builtins

408

29 - Control de flujo: Looping Con tiempo /


hasta

- Control de flujo: Looping Con tiempo /


hasta
29

En el captulo anterior, hemos desarrollado un programa basado en mens para producir


diversos tipos de informacin del sistema. El programa funciona, pero todava tiene un
problema de usabilidad significativa. Slo se ejecuta una sola eleccin y luego termina. Peor
an, si se hace una seleccin vlida, el programa termina con un error, sin dar al usuario la
oportunidad de intentarlo de nuevo. Sera mejor si pudiramos de alguna manera construir el
programa para que se pudiera repetir la visualizacin del men y la seleccin de una y otra,
hasta que el usuario elige para salir del programa.
En este captulo, vamos a ver un concepto de programacin llamado bucle, que puede ser
utilizado para hacer porciones de programas repiten. El shell proporciona tres comandos
compuestos por bucle. Vamos a ver dos de ellas en este captulo, y el tercero en una tarde.

Looping
La vida cotidiana est llena de actividades repetidas. El ir a trabajar cada da, pasear al perro,
cortar una zanahoria son todas las tareas que implican la repeticin de una serie de pasos.
Vamos a considerar cortar una zanahoria. Si expresamos esta actividad en pseudocdigo,
podra ser algo como esto:
1. obtener la tabla de cortar
2. conseguir cuchillo
3. colocar la zanahoria en la tabla de cortar
4. cuchillo ascensor
5. zanahoria antelacin
6. rebanada de zanahoria
7. si toda la zanahoria en rodajas, a continuacin, dejar de fumar, de lo contrario, vaya al
paso 4
Los pasos del 4 al 7 forman un bucle. Las acciones dentro del bucle se repite hasta que la
condicin, "toda la zanahoria en rodajas," se alcanza.

mientras
Bash puede expresar una idea similar. Digamos que queramos mostrar cinco nmeros en
secuencial
409

29 - Control de flujo: Looping Con tiempo / hasta ______________________


TiAl orden del uno al cinco. una escritura del golpe podra ser construido
como sigue:
#! / Bin / bash
# Tiempo de conteo: mostrar una serie de nmeros
count = 1
mientras que [[$ contar -LE 5]]; do echo $ count count
= $ ((count + 1))
hecho
echo "Terminado".

Cuando se ejecuta, el script muestra lo siguiente:


[Me @ linuxbox ~] $ mientras conteo
12
3
4
5
Terminado.

La sintaxis del comando, mientras que es: mientras que los comandos; hacer comandos; hecho
Al igual que si, mientras se evala el estado de salida de una lista de comandos. Mientras el
estado de salida es cero, realiza las mandos dentro del bucle. En el guin anterior, se crea la
cuenta de variable y le asigna un valor inicial de 1. El comando mientras se evala el estado de
salida del comando test. Mientras el comando test devuelve un estado de salida de cero, se
ejecutan los comandos dentro del bucle. Al final de cada ciclo, el comando de prueba se repite.
Despus de seis iteraciones del bucle, el valor de recuento se ha incrementado a 6, el comando
de prueba ya no devuelve un estado de salida de cero y el bucle termina. El programa
contina con la siguiente declaracin despus del bucle.
Podemos utilizar un bucle while para mejorar el programa de lectura-men del captulo
anterior:

#! / Bin / bash
# Mientras-men: un programa de informacin del sistema de mens

410

Looping
DEMORA = 3 # Nmero de segundos para mostrar los resultados
mientras que [[$ RESPUESTA = 0]!]; hacer
claro
cat << - _EOF_
Por favor seleccione:
1. Mostrar informacin del sistema
2.
Mostrar espacio en disco
3.
Pantalla Inicio Espacio
Utilizacin 0. Salir
_EOF_
leer -p "Introduzca la seleccin [0-3]>"

ms

si [[$ RESPUESTA = ~ A [0-3] $]];


entonces si [[$ RESPUESTA == 1]];
entonces
echo "Nombre de host: $
HOSTNAME" tiempo de actividad
sueo $ DEMORA
fi
si [[$ RESPUESTA == 2]];
entonces df -h
sueo $ DEMORA
fi
si [[$ RESPUESTA == 3]]; entonces
si [[$ (-u id) -eq 0]]; entonces
echo "Utilizacin Inicio Espacio (Todos los usuarios)"
du -sh / home / *
ms
echo "Inicio Espacio Utilizacin ($ USER)" du
-sh $ HOME fi
sueo $ DEMORA
fi
echo "entrada no vlida."
sueo $ DEMORA

fi
hecho
echo "Programa terminado."

Al encerrar el men en un bucle while, somos capaces de tener el programa de repetir la


visualizacin del men despus de cada seleccin. El bucle contina mientras respuesta no es
igual a "0" y el men se muestra de nuevo, dando al usuario la oportunidad de hacer otra
seleccin. Al final de cada accin, un comando del sueo se ejecuta por lo que el programa
har una pausa durante unos segundos para permitir que los resultados de la seleccin para
ser visto antes de que la pantalla se borra y el men se vuelve a mostrar. Una vez RESPUESTA
es igual a "0", lo que indica la seleccin "dejar de fumar",
411

29 ____________________________________

Control de flujo: Looping Con tiempo / hasta ________________________________________

el bucle termina y la ejecucin contina con la lnea siguiente hecho.

Salir de un bucle
Bash proporciona dos rdenes internas que se pueden utilizar para controlar el flujo del
programa dentro de bucles. El comando break termina inmediatamente un bucle, y el control
del programa se reanuda con la siguiente declaracin despus del bucle. El comando continue
hace que el resto del bucle se omiten, y el control del programa se reanuda con la siguiente
iteracin del bucle. Aqu vemos una versin del programa, mientras que-men que incorpora
tanto descanso y continuar:
#! / Bin / bash
#
: Un programa de informacin del sistema de mens
Mientras-menu2
DEMORA = 3 # Nmero de segundos para mostrar los resultados
mientras que la verdadera; hacer
claro
gato << - EOF
Por favor seleccione:
1. Mostrar informacin del sistema
2. Mostrar espacio en disco
3. Visualizacin Utilizacin Inicio Espacio
0. Dejar de
EOF
leer -p

'Introduzca la seleccin [0-3]> "

si [[$ RESPUESTA = ~ A [0-3] $]]; entonces


si [[$ RESPUESTA == 1]]; entonces
echo "Nombre de host: $ HOSTNAME" tiempo de actividad
sueo $ RETRASO continuar
fi
si [[$ RESPUESTA == 2]]; entonces
df -h
sueo $ DEMORA
continuar
fi
si [[$ RESPUESTA == 3]]; entonces
si [[$ (-u id) -eq 0]]; entonces
echo "Utilizacin Inicio Espacio (Todos los usuarios)" du -sh /
home / *
ms

412

fi
si [[$ RESPUESTA == 0]];
echo "Inicio Espacio Utilizacin ($ USER)" du
entonces
-sh $ HOME fi
rotura
sueo $
fi
RETRASO
ms
continuar
"Entrada no
eco
sueo vlida
$ DEMORA
fi
hecho
echo "Programa terminado."

Salir de un bucle

En esta versin de la secuencia de comandos, hemos creado un bucle sin fin (una que nunca
termina por s mismo) mediante el comando fiel a suministrar un estado de salida al mismo
tiempo. Desde cierto siempre salir con un estado de salida de cero, el bucle nunca terminar.
Esta es una tcnica scripting sorprendentemente comn. Dado que el bucle nunca terminar
por s solo, es responsabilidad del programador para proporcionar alguna forma de romper el
bucle cuando sea el momento adecuado. En esta secuencia de comandos, el comando break se
utiliza para salir del bucle cuando se elige la opcin "0". El comando continuar se ha incluido
al final de las otras opciones de secuencia de comandos para permitir la ejecucin ms
eficiente. Mediante el uso de continuar, el script omitir cdigo que no es necesaria cuando se
identifica una seleccin. Por ejemplo, si se elige la seleccin "1" y se identific, no hay ninguna
razn para la prueba de las otras selecciones.

hasta
El comando hasta que se parece mucho tiempo, pero en lugar de salir de un bucle cuando se
encuentra un cdigo de salida distinto de cero, se hace lo contrario. Un bucle hasta que
contina hasta que recibe un estado de salida cero. En nuestro script mientras recuento,
continuamos el bucle siempre y cuando el valor de la variable de recuento era menor o igual a
5. Podramos obtener el mismo resultado mediante la codificacin de la secuencia de
comandos con hasta:
#! / Bin / bash
# Hasta cargos: mostrar una serie de nmeros count =
1
hasta que [[$ contar -gt 5]]; hacer
echo $ conteo

413

count = $ ((recuento + 1))


hecho
echo "Terminado".
29 - Control de flujo: Looping Con tiempo / hasta
#! / Bin / bash
# Tiempo de leer: leer lneas de un archivo
mientras que la liberacin de lectura versin distro; hacer
printf "Distro:% s \ tVersion:% s \ tReleased:% s \ n" \ $ distro \
$ Version \
$
Comunicado hecho
<distros.txt
Al cambiar la expresin de prueba para contar -gt $ 5, hasta que se terminar el bucle en el
momento correcto. La decisin de si se debe utilizar el mismo tiempo o hasta bucle suele ser
una cuestin de elegir la que permite la prueba ms clara que se debe escribir.

Archivos de la lectura con Loops


#! / Bin / bash
# Mientras-READ2: leer lneas de un archivo
Ordenar -k 1,1 -k distros.txt 2n | mientras que la liberacin de lectura versin distro; hacer
printf "Distro:% s \ tVersion:% s \ tReleased:% s \ n" \
$ Distro \
$ Version \
$ Liberacin

hecho
mientras que y hasta que puede procesar la entrada estndar. Esto permite que los archivos
sean procesados con tiempo y hasta bucles. En el siguiente ejemplo, vamos a mostrar el
contenido del archivo tros.txt pantalla utilizado en captulos anteriores:
Para redirigir un archivo al bucle, colocamos el operador de redireccin despus de la
declaracin de hecho. El bucle utilizar leer a la entrada de los campos del archivo redirigido.
El comando de lectura se sale despus de cada lnea se lee, con un estado de salida cero hasta
que se alcanza el final del archivo. En ese momento, saldr con un estado de salida distinto de
cero, terminando as el bucle. Tambin es posible a la entrada estndar tubo en un bucle:

414

Archivos de la lectura con Loops


Aqu tomamos la salida del comando sort y mostrar el flujo de texto. Sin embargo, es
importante recordar que, desde una tubera se ejecutar el bucle en un subnivel, cualquier
variable creados o asignados dentro del bucle se perdern cuando el ciclo termina.

Resumiendo
Con la introduccin de los bucles, y nuestros encuentros anteriores con la ramificacin,
subrutinas y secuencias, hemos cubierto los principales tipos de control de flujo utilizados en
los programas. Bash tiene algunos ms trucos bajo la manga, pero son refinamientos sobre
estos conceptos bsicos.

Lectura adicional

La Gua de Bash para principiantes del Proyecto de Documentacin de Linux tiene


algunos ejemplos ms de los bucles while:
http://tldp.org/LDP/Bash-Beginners-Guide/html/sect 09 02.html

La Wikipedia tiene un artculo sobre bucles, que es parte de un artculo ms en el


control de flujo:
http://en.wikipedia.org/wiki/Control fluir # Loops

415

30 - Solucin de problemas

30 - Solucin de problemas
A medida que nuestros guiones se vuelven ms complejos, es el momento de echar un vistazo
a lo que sucede cuando las cosas van mal y no hacen lo que queremos. En este captulo, vamos
a ver algunos de los tipos comunes de errores que se producen en las secuencias de comandos,
#! / Bin / bash
# Problemas: la escritura para demostrar los errores de
nmero comn = 1
si [$ nmero = 1]; entonces
echo "El nmero es igual a 1."
ms
echo "Nmero no es igual a 1." fi
y describimos algunas tcnicas tiles que se pueden utilizar para localizar y erradicar los
problemas.

Los errores sintcticos


Una clase general de errores es sintctica. Errores sintcticos implican mistyping algn
elemento de la sintaxis del shell. En la mayora de los casos, este tipo de errores conducirn a
la que se deniega la shell para ejecutar el script.
En las siguientes discusiones, vamos a utilizar este script para demostrar los tipos comunes de
[Me @ linuxbox ~] $ Nmero
problemas es igual a 1.
errores:

Como est escrito, este script se ejecuta correctamente:

416

#! / Bin / bash
# Problemas: la escritura para demostrar los errores de
nmero comn = 1
si [$ nmero = 1]; entonces
Nmero de eco "es igual a 1.
ms
echo "Nmero no es igual a 1." fi

ver lo que sucede:


[Me @ linuxbox ~] $ problemas /
home / me / bin / problemas: la lnea
EOF inesperado
10:
coincidencia '"'
/ Home / me / bin / problemas: la error de sintaxis:
lnea 13:

en la bsqueda de
final inesperado de archivo
Los errores sintcticos

Falta Cotizaciones
Si editamos nuestro guin y retiramos la cita se arrastra desde el argumento tras el primer
comando echo:

Se genera dos errores. Curiosamente, los nmeros de lnea no son reportados donde se extrajo
la cita que falta, sino mucho ms tarde en el programa. Podemos ver por qu, si seguimos el
programa despus de la cita que falta. fiesta continuar en busca de la cotizacin de cierre
hasta que encuentra uno, lo que lo hace inmediatamente despus de que el segundo comando
echo. Bash se vuelve muy confuso despus de eso, y la sintaxis del comando si est roto
porque la declaracin fi es ahora dentro de una cita (pero abierto) cadena.
En los guiones largos, este tipo de error puede ser muy difcil de encontrar. Utilizando un
: Sintaxis en
editor con resaltado de sintaxis ayudar. Si se instala una versin completa de vim, resaltado
de sintaxis se puede activar con el comando:

Fichas faltan o inesperados


Otro error comn es olvidar para completar un comando compuesto, como si o
417

#! / Bin / bash
# Problemas: la escritura para demostrar los errores de
nmero comn = 1
si [$ nmero = 1] entonces
echo "El nmero es igual a 1."
ms
echo "Nmero no es igual a 1." fi
[Me @ linuxbox ~] $ problemas
/ Home / me / bin / problemas: la lnea 9: error de sintaxis cerca smbolo
inesperado 'otra cosa'
/ Home / me / bin / problemas: la lnea 9: 'otra cosa'
30 - Solucin de problemas tiempo. Echemos un vistazo a lo que ocurre si eliminamos el
punto y coma despus de la prueba en el caso de comandos:
El resultado es la siguiente:
Una vez ms, el mensaje de error indica un error que se produce ms tarde que el problema
real. Lo que pasa es realmente muy interesante. Como recordamos, si acepta una lista de
comandos y se evala el cdigo de salida de la ltima orden de la lista. En nuestro programa,
tenemos la intencin de esta lista a consistir en un solo comando, [, sinnimo de prueba. El
[comando toma lo que le sigue como una lista de argumentos; en nuestro caso, cuatro
argumentos: $ nmero, 1, =, y]. Con el punto y coma retira la palabra a continuacin, se aade
a la lista de argumentos, que es sintcticamente legal. El siguiente comando echo es legal,
tambin. Se interpreta como otro comando en la lista de comandos que si evaluarn por un
cdigo de salida. Se encontr el otro lado, pero que est fuera de lugar, ya que la cscara lo
reconoce como una palabra reservada (una palabra que tiene un significado especial para el
shell) y no el nombre de un comando, por lo tanto, el mensaje de error.

Expansiones imprevistos
Es posible tener errores que slo se producen de forma intermitente en un script. A veces, la
secuencia de comandos se ejecutar finos y otras veces fallar debido a los resultados de una
expansin. Si volvemos nuestro punto y coma que falta y cambiamos el valor del nmero a
una variable vaca, podemos demostrar:

418

Los errores
sintcticos
#! / Bin / bash
# Problemas: la escritura para demostrar varios errores
comunes =
si [$ nmero = 1]; entonces
echo "El nmero es igual a 1."
ms
echo "Nmero no es igual a 1." fi

Al ejecutar el script con este cambio es consecuencia de la


salida:
[Me @ linuxbox ~] $ problemas
/ Home / me / bin / problemas: la lnea 7: [: =: operador unario Nmero
esperado no es igual a 1.
Recibimos este mensaje de error en lugar crptico, seguido de la salida del segundo comando
echo. El problema es la expansin de la variable de nmero dentro del comando de prueba.
Cuando el comando:
[$ Nmero = 1]
se somete a expansin con el nmero est vaca, el resultado es el
siguiente:
[= 1]
que no es vlido y se genera el error. El operador = es un operador binario (se requiere un
valor en cada lado), pero el primer valor se encuentra, por lo que el comando de prueba
espera que un operador unario (como -z) en su lugar. Adems, puesto que la prueba ha
fallado (debido al error), el comando si recibe un cdigo de salida distinto de cero y acta en
consecuencia, y se ejecuta el segundo comando de eco.
Este problema se puede corregir aadiendo comillas alrededor del primer argumento en el
comando de la prueba:

["Nmero $" = 1]

419

["" = 1]
30 - Solucin de problemas______________________
Luego, cuando se produce la expansin, el resultado ser la siguiente:
que produce el nmero correcto de argumentos. Adems de las cadenas vacas, citas deben
utilizarse en los casos en que un valor podra ampliar en cadenas de varias palabras, como con
los nombres de archivo que contienen espacios incrustados.

Errores lgicos
A diferencia de los errores sintcticos, errores lgicos no impiden que un script se ejecute. El
script se ejecutar, pero no va a producir el resultado deseado, debido a un problema con su
lgica. Hay un sinnmero de posibles errores lgicos, pero aqu estn algunos de los tipos ms
comunes que se encuentran en las secuencias de comandos:
1. Expresiones condicionales incorrectos. Es fcil incorrectamente un cdigo if / then
/ else y tienen la lgica equivocada lleva a cabo. A veces, la lgica se invierte, o ser
incompleta.
2. "Off por uno" errores. Al codificar bucles que emplean contadores, es posible pasar
por alto que el bucle puede requerir que el conteo se inicia con cero, en lugar de uno,
para el recuento para concluir en el punto correcto. Este tipo de errores como
resultado ya sea un bucle "de ir fuera de la final" contando demasiado lejos, o de lo
que falta de la ltima iteracin del bucle terminando una iteracin demasiado pronto.
3. Situaciones no previstas. La mayora de los errores lgicos son el resultado de un
programa de datos o encontrarse con situaciones que eran imprevisto por el
programador. Esto tambin puede incluir expansiones imprevistas, como un nombre
de archivo que contiene espacios incrustados que se expande en mltiples
argumentos de comandos en lugar de un nico nombre de archivo.

Programacin Defensivo
Es importante verificar las hiptesis en la programacin. Esto significa una cuidadosa
evaluacin del estado de salida de los programas y comandos que son utilizados por un
guin. He aqu un ejemplo, basado en una historia real. Un administrador del sistema
cd
$
nombre_dir rm
*
desafortunado escribi un guin para realizar una tarea de mantenimiento en un servidor
importante. El guin contiene las siguientes dos lneas de cdigo:

420

Errores lgicos
No hay nada intrnsecamente malo con estas dos lneas, siempre y cuando el directorio
llamado en la variable, nombre_dir, existe. Pero, qu pasa si no lo hace? En ese caso, el
comando cd falla y el guin sigue a la siguiente lnea y elimina los archivos en el directorio de
trabajo actual. No es el resultado deseado en absoluto! El administrador desventurado
destruy una parte importante del servidor debido a esta decisin de diseo.
Echemos un vistazo a algunas formas de este diseo se podra mejorar. En primer lugar,
podra ser prudente para que la ejecucin del contingente rm en el xito del cd:

cd $ nombre_dir && rm *
De esta manera, si el comando cd falla, el comando rm no se lleva a cabo. Esto es mejor, pero
todava deja abierta la posibilidad de que la variable, nombre_dir, no est definido o est
vaco, que dara lugar a los archivos en el directorio personal del usuario se va a eliminar. Esto
tambin podra ser evitado mediante la comprobacin para ver que nombre_dir en realidad
contiene el nombre de un directorio existente:

[[-d $ Nombre_dir]] && cd $ nombre_dir && rm *


A menudo, lo mejor es dar por terminado el guin con un error cuando una situacin como la
que se produce por encima de:
# Eliminar archivos en el directorio $
nombre_dir si [[! -d "$ nombre_dir"]]; entonces
echo "No existe el directorio: '$ nombre_dir'"> & 2
exit 1 fi
si! cd $ nombre_dir; entonces
echo "No se puede cd para '$ nombre_dir'">
& 2 exit 1 fi
si! rm *; entonces
echo "borrado del archivo fall. Verificar los resultados"> &
2 exit 1 fi

En este caso, comprobamos tanto el nombre, a ver que es la de un directorio existente, y el


xito de la orden cd. Si cualquiera de los dos falla, un mensaje de error descriptivo se enva al
error estndar y el guin termina con un estado de salida de uno para indicar una falla.

421

30 - Solucin de problemas

El diseo es una funcin del tiempo


Cuando yo era un estudiante de la universidad a estudiar diseo industrial, un sabio
profesor afirm que el grado de diseo en un proyecto se determina por la cantidad
de tiempo dado para el diseador. Si le dieron cinco minutos para el diseo de un
dispositivo "que mata a las moscas", que ha diseado un matamoscas. Si le dieron de
[[$ RESPUESTA = ~ A [0-3]
$]]cinco meses, usted puede llegar a un "sistema anti-mosca" guiado por lser en su
lugar.
El mismo principio se aplica a la programacin. A veces un guin "rpido y sucio"
har si slo va a ser utilizado una vez y slo utilizado por el programador. Ese tipo de
guin es comn y se debe desarrollar rpidamente a hacer el esfuerzo econmico.
Tales secuencias de comandos no necesitan una gran cantidad de comentarios y
cheques defensivas. Por otro lado, si un script est pensado para su uso en
produccin, es decir, una secuencia de comandos que se utiliza una y otra vez para
una tarea importante o de mltiples usuarios, es necesario el desarrollo mucho ms
cuidadoso.

Entrada de Verificacin
Una regla general de una buena programacin es que si un programa acepta la entrada, tiene
que ser capaz de hacer frente a cualquier cosa que recibe. Esto generalmente significa que la
entrada debe ser cuidadosamente seleccionados, para asegurar que slo de entrada vlido es
aceptado para su posterior procesamiento. Vimos un ejemplo de esto en el captulo anterior,
cuando se estudi el comando de lectura. Un guin contena la siguiente prueba para verificar
una seleccin de men:
Esta prueba es muy especfica. Slo se devuelve un estado de salida cero si la cadena devuelta
por el usuario es un nmero en el rango de cero a tres. Ninguna otra cosa ser aceptado. A
veces este tipo de pruebas puede ser muy difcil de escribir, pero el esfuerzo es necesario para
producir una secuencia de comandos de alta calidad.

Pruebas
La prueba es un paso importante en todo tipo de desarrollo de software, incluyendo las
secuencias de comandos. Hay un dicho en el mundo del cdigo abierto, "la libertad
anticipada, la liberacin a menudo," que refleja este hecho. Por la liberacin de pronto y con
frecuencia, el software se vuelve ms exposicin a utilizar y las pruebas. La experiencia ha
demostrado que los insectos son mucho ms fciles de encontrar, y mucho menos costoso para
arreglar, si se encuentran al principio del ciclo de desarrollo.
En una discusin anterior, vimos cmo los trozos se pueden utilizar para verificar el flujo del
programa. Desde las primeras etapas de desarrollo del guin, son una tcnica valiosa para
comprobar el progreso
422

si [[-d $ nombre_dir]]; entonces si


cd $ nombre_dir; entonces
echo rm * # PRUEBAS
ms
echo "no puede cd para '$ nombre_dir'"> & 2
exit 1 fi
ms
echo "no hay tal directorio: '$ nombre_dir'"> & 2 exit
1 fi
# PRUEBAS salida

Pruebas

de nuestro trabajo.
Veamos el problema de eliminacin de archivos arriba y ver cmo esto podra ser codificada
para la prueba fcil. Probando el fragmento original de cdigo sera peligroso, ya que su
propsito es eliminar los archivos, pero podramos modificar el cdigo para hacer la caja
fuerte de prueba:
Dado que las condiciones de error ya los mensajes tiles de salida, no hay que aadir ninguna.
El cambio ms importante es colocar un comando echo justo antes del comando rm para
permitir que el mando y la lista de parmetros ampliado que se mostrarn, en lugar de la
orden en realidad est ejecutando. Este cambio permite la ejecucin segura de cdigo. Al final
del fragmento de cdigo, colocamos un comando de salida a la conclusin de la prueba y
evitar que cualquier otra parte de la secuencia de comandos de ser llevado a cabo. La
necesidad de este variar de acuerdo con el diseo de la secuencia de comandos.
Tambin se incluyen algunos comentarios que actan como "marcadores" para nuestros
cambios relacionados con la prueba. Estos pueden ser usados para ayudar a encontrar y
eliminar los cambios cuando finalice la prueba.

Casos de prueba
Para llevar a cabo las pruebas de utilidad, es importante desarrollar y aplicar buenos casos de
prueba. Esto se hace seleccionando cuidadosamente los datos de entrada o condiciones que
reflejan casos borde y esquina operativo. En nuestro fragmento de cdigo (que es muy
simple), queremos saber cmo el cdigo realiza bajo tres condiciones especficas:
1. nombre_dir contiene el nombre de un directorio existente
2. nombre_dir contiene el nombre de un directorio inexistente
3. nombre_dir est vaca
Mediante la realizacin de la prueba con cada una de estas condiciones, se logra una buena
cobertura de la prueba.
Al igual que con el diseo, la prueba es una funcin del tiempo, tambin. No todas las
caractersticas de la escritura tiene que

423

30 - Solucin de problemas ser ampliamente probado. Es realmente una cuestin de


determinar qu es lo ms importante. Ya que podra ser tan potencialmente destructivo si no
funciona bien, nuestro fragmento de cdigo se merece una cuidadosa consideracin, tanto
durante su diseo y pruebas.

Depuracin
Si la prueba revela un problema con un guin, el siguiente paso es la depuracin. "Un
problema" por lo general significa que el guin es, de alguna manera, la no realizacin de las
expectativas del programador. Si este es el caso, tenemos que determinar cuidadosamente
exactamente lo que el guin est haciendo en realidad y por qu. Encontrar errores a veces
puede implicar una gran cantidad de trabajo de detective.
Un guin bien diseado va a tratar de ayudar. Debe ser programado defensiva, para detectar
condiciones anormales y proporcionar informacin til para el usuario. A veces, sin embargo,
si [[-d $ nombre_dir]]; entonces si
cd $ nombre_dir; entonces rm *
ms
echo "no puede cd para '$ nombre_dir'"> & 2
exit 1 fi
# ms
#
echo "no hay tal directorio: '$ nombre_dir'"> & 2
#
salida 1
fi
los problemas son bastante extraa e inesperada, y se requieren tcnicas ms involucrados.

Encontrar el rea del problema


En algunos scripts, particularmente los largos, a veces es til para aislar la zona de la
secuencia de comandos que se relaciona con el problema. Esto no siempre ser el error real,
pero el aislamiento a menudo proporciona una visin de la causa real. Una tcnica que se
puede utilizar para aislar cdigo es "comentando" secciones de una secuencia de comandos.
Por ejemplo, nuestro fragmento de delecin archivo podra ser modificada para determinar si
la seccin eliminada se relacion con un error:

Mediante la colocacin de comentarios smbolos al comienzo de cada lnea en una seccin


lgica de una secuencia de comandos, evitamos que la seccin de ser ejecutado. La prueba
puede entonces realizarse de nuevo, para ver si la eliminacin del cdigo tiene ningn
impacto en el comportamiento del insecto.

Rastreo
Los errores son a menudo casos de flujo lgico inesperado dentro de un script. Es decir, las
partes de la secuencia de comandos son o bien nunca se ejecutan o se ejecutan en el orden
incorrecto o en el

424

Depuracin
momento equivocado. Para ver el flujo real del programa, se utiliza una tcnica llamada
rastreo.
Uno de los mtodos de rastreo consiste en colocar mensajes informativos en una secuencia de
comandos que muestra el lugar de la ejecucin. Podemos aadir mensajes a nuestro
fragmento de cdigo:
echo "la preparacin para eliminar los archivos"> & 2
si [[-d $ nombre_dir]]; entonces si cd $
nombre_dir; then echo "Eliminar archivos"> &
2
rm *
ms
echo "no puede cd para '$ nombre_dir'"> & 2
exit 1 fi
ms
echo "no hay tal directorio: '$ nombre_dir'"> & 2 exit
1 fi
echo "la eliminacin de archivos completa"> & 2

Enviamos los mensajes de error estndar para separarlos de salida normal. Tampoco guin La
lneas que contienen los mensajes, por lo que es ms fcil de encontrar cuando es el momento
de retirarlos.
Ahora, cuando se ejecuta la secuencia de comandos, es posible ver que la eliminacin de
archivos se ha realizado:

[Me @ linuxbox ~] $ borrado-escritura se


prepara para eliminar archivos borrar
archivos de un archivo borrado completo
[me @ linuxbox ~] $

Bash tambin proporciona un mtodo de rastreo, implementado por la opcin -x y el


comando set con la opcin -x. Usando nuestro anterior guin problemas, podemos activar el
rastreo para toda la secuencia de comandos mediante la adicin de la opcin -x a la primera
lnea:
#! / Bin / bash -x
# Problemas: la escritura para demostrar los errores de
nmero comn = 1

425

30 - Solucin de
problemas
si [$ nmero = 1]; entonces
echo "El nmero es igual a 1."
ms
echo "Nmero no es igual a 1." fi

Cuando se ejecuta, los resultados se ven


as:
[Me @ linuxbox ~] $ problemas +
nmero = 1 + '[' 1 = 1 ']'
+ Echo 'El nmero es igual a 1.' El
nmero es igual a 1.

Con el rastreo habilitado, vemos los comandos realizados con expansiones aplicadas. Los
signos ms indican que conducen la pantalla de la traza para distinguirlas de las lneas de
salida regular. El signo ms es el carcter predeterminado de salida de rastreo. Est contenida
en la variable de shell PS4 (cadena pronto 4). El contenido de esta variable se puede ajustar
para que el indicador ms til. Aqu, modificamos el contenido de la variable a incluir el
nmero de lnea actual en la secuencia de comandos donde se realiza la traza. Tenga en cuenta
que se requieren comillas simples para prevenir la expansin hasta que se utiliza realmente el
smbolo:
[Me @ linuxbox ~] PS4 $ export = '$ NUMLINEA +'
[Me @ linuxbox ~] $ dificultad 5 + nmero = 1
7 + '[' 1 = 1 ']'
8 + Echo 'El nmero es igual a 1.'
El nmero es igual a 1.

Para realizar un seguimiento sobre una parte seleccionada de una secuencia de comandos, en
lugar de toda la secuencia de comandos, podemos utilizar el comando set con la opcin -x:

#! / Bin / bash
# Problemas: la escritura para demostrar los errores de
nmero comn = 1
set -x # Encienda el rastreo
si [$ nmero = 1]; entonces
echo "El nmero es igual a 1."

426

#! / Bin / bash
# Problemas: la escritura para demostrar los errores de
nmero comn = 1
echo "nmero = $ nmero" # DEBUG
set -x # Encienda el rastreo si [$ nmero = 1]; entonces
ms echo "El nmero es igual a 1."
ms echo "Nmero no es igual a 1." fi
+ x # desactivar
el seguimiento
echo "Nmero
no es igual a 1." fi
+ x # desactivar el seguimiento

Depuracin

Utilizamos el comando set con la opcin -x para activar el rastreo y el + x opcin para
desactivar el rastreo. Esta tcnica se puede utilizar para examinar mltiples porciones de una
secuencia de comandos problemtico.

El examen de Valores durante la ejecucin


A menudo es til, junto con el rastreo, para mostrar el contenido de las variables para ver el
funcionamiento interno de una secuencia de comandos mientras est siendo ejecutado. La
aplicacin de las declaraciones de eco adicionales suele hacer el truco:
En este ejemplo trivial, simplemente mostramos el valor de la variable nmero y marcar la
lnea agregada con un comentario para facilitar su posterior identificacin y remocin. Esta
tcnica es particularmente til cuando se ve el comportamiento de los bucles y la aritmtica en
las secuencias de comandos.

Resumiendo
En este captulo, nos fijamos en slo algunos de los problemas que pueden surgir durante el
desarrollo de la escritura. Por supuesto, hay muchos ms. Las tcnicas descritas aqu permitir
encontrar errores ms comunes. La depuracin es un arte que se puede desarrollar a travs de
la experiencia, tanto en saber cmo evitar los errores (prueba constantemente a lo largo del
desarrollo) y en la bsqueda de errores (uso eficaz de rastreo).

427

30 - Solucin de problemas

Lectura adicional
La Wikipedia tiene un par de artculos cortos sobre los errores sintcticos y
lgicos: http://en.wikipedia.org/wiki/Syntax error error
http://en.wikipedia.org/wiki/Logic
Hay muchos recursos en lnea para los aspectos tcnicos de la programacin bash:
http://mywiki.wooledge.org/BashPitfalls
http://tldp.org/LDP/abs/html/gotchas.html
http://www.gnu.org/software/bash/manual/html nodo /
Reservado-Word-index.html
De Eric Raymond El arte de la programacin de Unix es un gran recurso para el
aprendizaje de los conceptos bsicos que se encuentran en los programas de Unix bien
escritos. Muchas de estas ideas se aplican a los scripts de shell:
http://www.faqs.org/docs/artu/
http://www.faqs.org/docs/artu/ch01s06.html
Para realmente depuracin de servicio pesado, no es el Bash depurador:
http://bashdb.sourceforge.net/

428

31 - Control de flujo: Bifurcaciones Con


el caso

31 - Control de flujo: Bifurcaciones Con el


caso
#! / Bin / bash
#-Men leer: un programa de informacin del sistema de mens
claro eco "
Por favor seleccione:
1. Mostrar informacin del sistema
2.
Mostrar espacio en disco
3.
Visualizacin Utilizacin Inicio Espacio
0. Salir "
leer -p "Introduzca la seleccin [0-3]>"
si [[$ RESPUESTA = ~ A [0-3] $]];
entonces si [[$ RESPUESTA == 0]];
entonces
En este captulo, vamos a seguir buscando en el control de flujo. En el captulo 28, se
construyeron algunos mens simples y construimos la lgica utilizada para actuar en la
seleccin de un usuario. Para ello, se utiliz una serie de comandos para identificar si cul de
las posibles opciones que se ha seleccionado. Este tipo de construccin aparece con frecuencia
en los programas, tanto es as que muchos lenguajes de programacin (incluyendo la cscara)
proporcionan un mecanismo de control de flujo para las decisiones de seleccin mltiple.

caso
El comando compuesto de opcin mltiple de bash se llama as. Tiene la siguiente sintaxis:
palabra en caso
[Patrn [| comandos patrn] ...)

esac
Si nos fijamos en el programa de lectura-men del captulo 28, vemos la lgica utilizada para
actuar en la seleccin de un usuario:

429

31 - Control de flujo: Bifurcaciones Con el


caso

fi
si

fi
si

echo "Programa
Salida

terminado."

[[$ RESPUESTA == 1]]; entonces


echo "Nombre de host: $
HOSTNAME"
el tiempo de actividad
Salida
[[$ RESPUESTA == 2]]; salida
-h entonces df

fi
si

ms

[[ $ Responder == 3]]; entonces


si [[$ (-u id) -eq 0]]; entonces
echo "Utilizacin Inicio Espacio du (Todos
-sh / home / *
ms
echo "Utilizacin Inicio Espacio du usuarios)
-sh $ HOME
fi
Salid
user)"
a
fi

echo "entrada no vlida." > & 2


exit 1 fi

Utilizando caso, podemos sustituir esta lgica con algo ms


simple:
#! / Bin / bash
# Caso-men: un programa de informacin del sistema de mens
claro eco "
Por favor seleccione:
1. Mostrar informacin del sistema
2.
Mostrar espacio en disco
3.
Visualizacin Utilizacin Inicio Espacio
0. Salir "
leer -p "Introduzca la seleccin [0-3]>" caso $
Responder en
0) echo "Programa terminado." Salida

430

los
"($

caso
1)
2)
3)

eco "Nombre de host: $ HOSTNAME"


el tiempo de actividad
11
df -h
si [[
ms
fi

*)

$ (-u Id) -eq 0]]; then echo "Utilizacin (Todos los usuarios) "
Inicio Espacio du -sh / home / *
echo "Utilizacin Inicio Espacio du
-sh $ HOME

($ USER) "

eco "Entrada no vlida"> & 2


Salida 1

esac
El comando de caso examina el valor de la palabra, en nuestro ejemplo, el valor de la variable
de respuesta, y entonces intenta emparejarlo contra uno de los patrones especificados. Cuando
se encuentra una coincidencia, se ejecutan los comandos asociados con el patrn especificado.
Una vez que se encuentra una coincidencia, se intenta no hay ms partidos.

Patrones
Los patrones utilizados por caso son los mismos que los utilizados por la expansin de
nombre de ruta. Los patrones se terminan con un ")" carcter. Aqu hay algunos patrones
vlidos:

Table32-1: Patrn caso Ejemplos


Patrn

Descripcin

a)

Coincide si la palabra es igual a "a".

[[: Alpha:]])
???)
* .txt)

Coincide si la palabra es un nico carcter alfabtico.


Coincide si la palabra es exactamente tres caracteres de longitud.
Partidos si la palabra termina con los caracteres ".txt".

*)

Coincide con cualquier valor de la palabra. Es una buena prctica


incluir esto como el ltimo modelo en un comando caso, para coger
cualquier valor de la palabra que no coincida con un patrn
anterior; es decir, para detectar cualquier posibles valores no
vlidos.

He aqu un ejemplo de los patrones en el trabajo:


431

31 - Control de flujo: Bifurcaciones Con el caso


#! / Bin / bash
leer -p "entrar palabra>

"

caso en $ Responder
[[: Alpha:]])
[ABC] [0-9])
???)
* .txt)
*)
esac

eco
eco
eco
eco
eco

"Es
"Es
"Es
"Es
"Es

un nico carcter alfabtico. ";;


A, B, o C, seguido de un dgito. ";;
tres caracteres de longitud. ";;
una palabra que termina en '.txt' ";;
algo ms. ";;

Tambin es posible combinar mltiples patrones usando el carcter barra vertical como
separador. Esto crea una "o" patrn condicional. Esto es til para cosas tales como el manejo
de los personajes, tanto maysculas y minsculas. Por ejemplo:

#! / Bin / bash
# Caso-men: un programa de informacin del sistema de mens
claro eco "
Por favor seleccione:
A. Mostrar informacin del sistema
B.
Mostrar espacio en disco
C.
Visualizacin Utilizacin Inicio Espacio
P. Salir
"
leer -p "Introduzca la seleccin [A, B, C o Q]>" caso $
Responder en
q | Q) echo "Programa terminado." Salida
a | A) echo "Nombre de host: $
HOSTNAME" tiempo de actividad
b | B) df -h
c | C) si [[$ (-u id) -eq 0]]; entonces
echo "Utilizacin Inicio Espacio (Todos los usuarios)"
du -sh / home / *
ms
echo "Inicio Espacio Utilizacin ($ USER)" du
-sh $ HOME fi

432

//

*) Echo "entrada no vlida"> & 2 salida


1
esac

caso

Aqu, modificamos el programa de caso-men para utilizar letras en vez de nmeros para la
seleccin del men. Observe cmo los nuevos modelos permiten la entrada de letras
maysculas y minsculas.

Realizacin de mltiples acciones


En las versiones de fiesta antes de la 4.0, caso permiti slo una accin a realizar en una
persona compatible. Despus de una persona compatible, el comando sera terminar. Aqu
vemos un script que pone a prueba un personaje:

#! / Bin / bash
# Case4-1: una prueba personaje
leer -n 1 -p Tipo "
un carcter> "
eco
caso en $ Responder
[[: Upper:]])
eco "' $
es maysculas. ";;
[[: Lower:]])
eco "' $CONTES es minscula. ";;
TACIN es alfabtico. ";;
[[: Alpha:]])
eco "' $CONTES
TACIN es un dgito. ";;
[[: Dgito:]])
eco "' '$CONTES
'$CONTES es un carcter visible. ";;
[[: Graph:]])
eco "' TACIN
'
TACIN
[[: Punct:]])
eco "' $CONTES
es un smbolo de puntuacion. ";;
[Me @ linuxbox
~] $ case4-1
'
TACIN
[[: Space:]])
eco "' $CONTES
es un carcter de espacio en blanco. ";;
escriba un[[:
carcter>
una 'a'eco
es "' $CONTES
'
TACIN
Xdigit:]])
es un dgito hexadecimal. ";;
minscula.
'CONTES
TACIN
esac
'TACIN
Al ejecutar esta secuencia de comandos
' produce esto:
El script funciona para la mayor parte, pero falla si un personaje coincide con ms de uno de
los personajes de las clases POSIX. Por ejemplo, el carcter "a" es a la vez minsculas y
alfabtica, as como un dgito hexadecimal. En bash anteriores a la versin 4.0 no haba
manera para el caso de coincidir ms de una prueba. Las versiones modernas de bash, aadir
el ";; y" notacin para
433

[Me @ linuxbox ~] $ case4-2


un de
carcter>
una 'a' es
31escriba
- Control
flujo: Bifurcaciones
Con el caso por terminado cada accin, por lo que ahora
minscula.
'A' es alfabtico.
podemos
esto:visible. 'A' es un
'A' es unhacer
carcter
dgito hexadecimal.
#! / Bin / bash
# Case4-2: una prueba personaje
leer -n 1 -p Tipo "
un carcter> "
eco
caso en $ Responder
[[: Upper:]])
eco " $
es maysculas ".
$
[[: Lower:]])
eco " CONTES
es minscula. ";; y
TACIN es alfabtico. ";; y
[[: Alpha:]])
eco " $CONTES
'
TACIN
[[: Dgito:]])
eco " $CONTES
es un dgito. ";; y
TACIN es un carcter visible. ";; y
[[: Graph:]])
eco " '$CONTES
TACIN es un smbolo de puntuacion. ";; y
[[: Punct:]])
eco " '$CONTES
'$
TACIN
[[: Space:]])
eco " CONTES
es un carcter de espacio en blanco. ";; y
'$
TACIN
[[: Xdigit:]])
eco " CONTES
es un dgito hexadecimal. ";; y
'
TACIN
CONTES
esac
'
TACIN
Cuando ejecutamos este script, obtenemos
lo siguiente:
'

La adicin de la sintaxis ";; y" permite que el caso contine a la siguiente prueba en lugar de
simplemente por concluida.

Resumiendo
El comando caso es una adicin til a nuestra bolsa de trucos de programacin. Como
veremos en el prximo captulo, es la herramienta perfecta para el manejo de determinados
tipos de problemas.

Lectura adicional

434

La seccin Manual de Referencia sobre Bash condicionales Las construcciones se


describe el comando caso en detalle:
http://tiswww.case.edU/php/chet/bash/bashref.html#SEC21

La Gua avanzada Bash-Scripting ofrece otros ejemplos de aplicacin caso

Lectura
adicional
ciones:
http://tldp.org/LDP/abs/html/testbranch.ht
ml

435

32 - Parmetros
posicionales

32 - Parmetros
posicionales
Una caracterstica que ha estado ausente de nuestros programas es la capacidad de aceptar y
de opciones y argumentos de la lnea de comandos de proceso. En este captulo, vamos a
examinar las caractersticas de shell que permiten a nuestros programas para tener acceso a
los contenidos de la lnea de comandos.

Cmo acceder a la lnea de comandos


El shell proporciona un conjunto de variables llamadas parmetros posicionales que
contienen las palabras individuales en la lnea de comandos. Las variables se denominan 0 a 9.
Pueden ser demostrados de esta manera:

#! / Bin / bash
# Posit-param: secuencia de comandos para ver los parmetros de
lnea de comandos
echo "\ $ 0
=$0\$1
=$1\$2
=$2\$3
=$3\$4
=$4\$5
=$5\$6
=$6\$7
=$7\$8
=$8\$9
=$9

Un guin muy simple que muestra los valores de las variables $ 0- $ 9. Cuando se ejecuta sin
argumentos de lnea de comandos:
[Me @ linuxbox ~] $ posit-param $ 0
= / home / me / bin / posit-param

436

Cmo acceder a la lnea de


comandos
$ 1 =
$ 2 =
$ 3 =
$ 4 =
$ 5 =
$ 6 =
$ 7 =
$ 8 =
$9=
Incluso cuando no se proporcionan argumentos, $ 0 siempre contendr el primer elemento
que aparece en la lnea de comandos, que es el nombre de ruta del programa que se est
ejecutando. Cuando se proporcionan argumentos, vemos los resultados:
[Me @ linuxbox ~] $ posit-param a b c d
$ 0 = / home / me / bin / posit-param
$ 1 = un
$2=b
$3=c
$4=d
$5=
$6=
$7=
$8=
$9=

Nota: En realidad se puede acceder a ms de nueve parmetros mediante la


expansin de parmetro. Para especificar un nmero mayor que nueve, rodear el
nmero entre llaves. Por ejemplo $ {10}, $ {55}, $ {211}, y as sucesivamente.

Determinar el nmero de argumentos


El shell tambin ofrece una variable, $ #, que da el nmero de argumentos en la lnea de
comandos:

#! / Bin / bash
# Posit-param: secuencia de comandos para ver los parmetros de
lnea de comandos se hacen eco "
437

32 - Parmetros
posicionales
Nmero de argumentos: $ #
\$0=$0
\$1=$1
\$2=$2
\$3=$3
\$4=$4
\$5=$5
\$6=$6
\$7=$7
\$8=$8
\$9=$9

El
resultado:
[Me @ linuxbox ~] $ posit-param a b c d
Nmero de argumentos: 4
$ 0 = / home / me / bin / posit-param
$ 1 = un
$2=b
$3=c
$4=d
$5=
$6=
$7=
$8=
$9=

cambiar - Conseguir acceso a muchos argumentos


Pero qu sucede cuando damos el programa de un gran nmero de argumentos como
ste:
[Me @ linuxbox ~] $ posit-param *
Nmero de argumentos: 82 $ 0 = /
home / me / bin / posit-param $ 1 = $
2 = addresses.ldif bin
$ 3 = bookmarks.html $ 4 =
debian-500-i386-netinst.iso $ 5 =
debian-500-i386-netinst.jigdo $ 6 =
debian-500-i386-netinst.template $ 7 =
debian-cd_info.tar.gz

438

Cmo acceder a la lnea de


comandos
$ 8 = Escritorio
$ 9 = listadir-bin.txt
En este sistema de ejemplo, el comodn * expande en 82 argumentos. Cmo podemos
procesar que muchos? La cscara proporciona un mtodo, aunque una torpe, para hacer esto.
El comando de cambio hace que todos los parmetros de "bajar un" cada vez que se ejecuta.
De hecho, mediante el uso de cambio, es posible llegar a funcionar con slo un parmetro
(adems de $ 0, que nunca cambia):

#! / Bin / bash
# Posit-param2: script para mostrar cuentan todos los
argumentos = 1
mientras que [[$ # -gt 0]]; hacer
echo "El argumento $ count = $ 1"
count = $ ((count + 1)) cambio
hecho

Cada cambio de hora se ejecuta, el valor de $ 2 se mueve a $ 1, el valor de $ 3 se mueve a $ 2 y


as sucesivamente. El valor de $ # tambin se reduce en uno.
En el programa posit-param2, creamos un bucle que evala el nmero de argumentos
restantes y contina siempre que haya al menos una. Le mostramos el argumento actual,
incrementar el nmero de variables con cada iteracin del bucle para proporcionar una cuenta
corriente de la serie de argumentos elaborados y, por ltimo, ejecutamos un cambio para
cargar $ 1 con el siguiente argumento. Aqu est el programa en el trabajo:

[Me @ linuxbox ~] $ posit-param2 a b c d


Argumento
1
Argumento 2 = a
=
b
=
c
Argumento
3
Argumento 4 = d

Aplicaciones sencillas
Incluso sin cambio, es posible escribir aplicaciones tiles que utilizan parmetros posicionales.
A modo de ejemplo, he aqu un programa de informacin de archivos simple:

439

#! / Bin / bash
# File_info: programa de informacin de archivos simple
Progname = $ (basename $ 0)
si [[-e $ 1]]; entonces
echo -e "\ narchivo Tipo:"
presentar 1 dlar
echo -e "\ narchivo Estado:"
stat $ 1
ms
echo "$ progname: uso: $ file progname"> & 2 exit 1 fi
- Parmetros posicionales

32

Este programa muestra el tipo de archivo (determinado por el comando file) y el estado del
archivo (desde el comando stat) de un archivo especificado. Una caracterstica interesante de
este programa es la variable progname. Se le da el valor que resulta de la orden basename $ 0.
El comando basename elimina la porcin delantera de una ruta de acceso, dejando slo el
nombre de la base de un archivo. En nuestro ejemplo, basename elimina la parte principal de
file_info () {
# File_info: funcin para mostrar la informacin del archivo
si [[-e $ 1]]; entonces
echo -e "\ narchivo Tipo:"
presentar 1 dlar
echo -e "\ narchivo Estado:"
stat $ 1
ms
echo "$ FUNCNAME: uso: $ file FUNCNAME"> & 2
retorno 1
la ruta de acceso que figura en el parmetro $ 0, la ruta completa de nuestro programa de
ejemplo. Este valor es til cuando la construccin de los mensajes tales como el mensaje de uso
al final del programa. Por la codificacin de esta manera, la secuencia de comandos puede
cambiar el nombre y el mensaje se ajusta automticamente a contener el nombre del
programa.

Uso de parmetros posicionales Con Funciones Shell


As como parmetros posicionales se utilizan para pasar argumentos a los scripts de shell,
tambin pueden ser utilizados para pasar argumentos a Shell funciones. Para demostrarlo,
vamos a convertir el guin file_info en una funcin de la shell:

440

fi
Cmo acceder a la lnea de comandos

Ahora bien, si un script que incorpora la funcin de shell file_info llama a la funcin con un
argumento de nombre de archivo, el argumento se pasa a la funcin.
Con esta capacidad, podemos escribir muchas funciones de shell tiles que no slo se pueden
usar en los scripts, pero tambin dentro del archivo .bashrc.
Observe que la variable progname fue cambiado a la FUNCNAME variable de shell. La
cscara se actualiza automticamente esta variable para realizar un seguimiento de la funcin
de shell actualmente ejecutada. Tenga en cuenta que $ 0 siempre contiene el nombre de ruta
completo del primer punto de la lnea de comandos (es decir, el nombre del programa) y no
contiene el nombre de la funcin de shell como podramos esperar.

Manipulacin de Parmetros posicionales En Masse


A veces es til para gestionar todos los parmetros de posicin como un grupo. Por ejemplo,
podramos querer escribir un "envoltorio" alrededor de otro programa. Esto quiere decir que
creamos una funcin de secuencia de comandos o shell que simplifica la ejecucin de otro
programa. La envoltura proporciona una lista de opciones de lnea de comandos arcanos y
luego pasa a una lista de argumentos para el programa de nivel inferior.
El shell proporciona dos parmetros especiales para este fin. Ambos se expanden en la lista
completa de los parmetros posicionales, pero difieren en formas ms sutiles. Ellos son:
Tabla 32-1: El * Y @ Parmetros especiales
Parmetro
$*

$@

Descripcin
Se expande en la lista de parmetros posicionales, empezando por 1.
Cuando entre comillas dobles, se expande en una cadena entre comillas
dobles que contiene todos los parmetros de posicin, cada uno
separado por el primer carcter de la variable de shell IFS (por defecto
un carcter de espacio) .
Se expande en la lista de parmetros posicionales, empezando por 1.
Cuando entre comillas dobles, se expande cada parmetro de posicin
en una palabra separada entre comillas dobles.

Aqu es un script que muestra estos parametros especiales en accin:

441

32 - Parmetros
posicionales
#! / Bin / bash
# Posit-params3: script para demostrar $ * y $ @
print_params () {echo "\
$ 1 = $ 1" echo "\ $
2 = $ 2" echo "\ $ 3
= $ 3" echo "\ $ 4 =
$ 4"
}
pass_params () {
echo -e "\ N" "
echo -e "\ N" "
echo -e "\ N"
echo -e "\ N"

'$ *:';
print_params $ *
1 "$ *": ' ; print_params "$ *
1$ @: ';
print_params $ @
1"$ @": ' ; print_params "$ @

pass_params

"Palabr "palabra
a"
s
con espacios "

En este programa ms bien complicado, creamos dos argumentos: "la palabra" y "palabras con
espacios", y pasamos a la funcin pass_params. Esa funcin, a su vez, los pasa a la funcin
print_params, utilizando cada uno de los cuatro mtodos disponibles con los parmetros
especiales $! y $ @. Cuando se ejecuta, el script revela las diferencias:

[Me @ linuxbox ~] $ posit-param3


$ *:
$ 1 = $ 2 = palabra palabras $ 3 = $ 4 =
con espacios

1 dlar = palabras de palabras con


espacios $ 2 =
$3=
$4=
$ @:
$ 1 = $ 2 = palabra palabras $ 3 = $
4 = con espacios
"$ @":
$ 1 = palabra

442

$ 2 = palabras con espacios $


3=
$4=
Manipulacin de Parmetros posicionales En Masse
Con nuestros argumentos, tanto $! y $ @ producir un resultado de
cuatro palabras: palabra palabras con espacios "$ *" produce un
resultado de una palabra:
"palabra palabras con espacios"
"$ @" Produce un resultado de dos palabras:
"Palabra" "palabras con espacios"
que coincide con nuestra intencin real. La leccin a sacar de esto es que a pesar de que la
cscara ofrece cuatro maneras diferentes de conseguir la lista de parmetros posicionales, "$
@" es, con mucho, el ms til para la mayora de las situaciones, ya que conserva la integridad
de cada parmetro posicional.

Una aplicacin ms completa


Despus de un largo parntesis, vamos a reanudar el trabajo en nuestro programa
sys_info_page. Nuestra prxima Adems aadir varias opciones de lnea de comandos para
el programa de la siguiente manera:

El archivo de salida. Vamos a aadir una opcin para especificar un nombre de un


archivo para contener la salida del programa. Se especifica como tampoco archivo -f o
- archivo -file.

El modo interactivo. Esta opcin le pedir al usuario un nombre de archivo de salida y


determinar si ya existe el archivo especificado. Si lo hace, el usuario se le pedir antes
se sobrescribe el archivo existente. Esta opcin se especificar por cualquiera -i o -interactive.

Ayuda. De cualquier -h o - -help se puede especificar para hacer que el programa de


salida de un mensaje de uso informativo.

Aqu est el cdigo necesario para implementar el procesamiento de lnea de comandos:


el uso de () {
echo "$ progname: uso: $ progname [-f archivo |
retorno
}

-i] "

# Opciones de lnea de comandos proceso


= interactivos

443

32 - Parmetros posicionales
filename =
mientras que [[-n $ ]]; hacer
1 caso $ 1 de
-f | --file)
-i | --interactive)
-h | --help)
*)

esac
cambio
hecho

cambio
archivo = $ 1
;;
interactive = 1
;;
uso
Salida
;;
uso> & 2 salida 1
;;

En primer lugar, aadimos una funcin de shell llamado uso para mostrar un mensaje cuando
la opcin de ayuda se invoca o una opcin desconocida se intenta.
A continuacin, empezamos el bucle de procesamiento. Este bucle contina mientras el
parmetro posicional $ 1 no est vaca. En la parte inferior del bucle, tenemos un comando de
desplazamiento para avanzar los parmetros posicionales para asegurar que el bucle
finalmente terminar.
Modo interactivo #
si [[-n $ interactivo]]; a continuacin,
mientras que la verdadera; hacer
leer -p "Introduzca el nombre de archivo de salida:"
nombre de archivo si [[-e $ archivo]]; entonces
leer -p "'$ nombre' existe. Sobrescribir? [y / n / q]> caso $
Responder en
Y | y) descanso
Dentro del bucle, tenemos una declaracin de caso que examina el parmetro actual de
posicin para ver si coincide con alguna de las opciones soportadas. Si se encuentra un
parmetro con el apoyo, de actuar sobre l. Si no, se muestra el mensaje de uso y el guin
termina con un error.
El parmetro -f se maneja de una manera interesante. Cuando se detecta, que causa un cambio
adicional que se produzca, lo que hace avanzar el parmetro posicional $ 1 a el argumento de
nombre de archivo suministrado a la opcin -f.
A continuacin aadimos el cdigo para implementar el modo interactivo:

444

Q | q) echo "Programa terminado."


Salida ;;
*) Continuar ;;
esac
elif
[[-z
$
luego continuar
write_html_page () {cat archivo]];
<< - _EOF_
ms
<HTML>
rotura
<HEAD>
fi
<TITLE> $ TTULO </
hecho
TITLE>
fi
</ HEAD>
<BODY>
<H1> $ TTULO </ H1>
<P> $ TIMESTAMP </ P>
$ (Report_uptime)
$ (Report_disk_space)
$ (Report_home_space)
</ BODY>
</ HTML>
_EOF_
retorno
}
# Pgina html de salida
si [[-n $ archivo]]; entonces

Una aplicacin ms completa

Si la variable interactiva no est vaco, se inicia un bucle sin fin, que contiene el smbolo del
cdigo de nombre de archivo y la posterior administracin de archivos existente. Si ya existe
el archivo de salida deseado, el usuario se le solicita sobrescribir, elija otro nombre de archivo,
o salir del programa. Si el usuario opta por sobrescribir un archivo existente, una ruptura se
ejecuta para terminar el bucle. Observe cmo la declaracin de caso slo detecta si el usuario
opta por sobrescribir o dejar de fumar. Cualquier otra opcin hace que el bucle de continuar y
pide al usuario nuevo.
Con el fin de implementar la funcin de archivo de salida, primero debemos convertir el
cdigo de la pgina-escritura existente en una funcin de shell, por razones que se aclararn
en un momento:

445

32 - Parmetros posicionales
si toque $ archivo && [[-f $ archivo]];
entonces
write_html_page> $ archivo
ms
echo "$ progname: No se puede escribir el archivo de salida 1 $ Archivo '"> & 2
ms
fi

fi
escribir la pgina html

El cdigo que se encarga de la lgica de la opcin -f aparece al final de la lista se muestra


arriba. En ella, se prueba la existencia de un nombre de archivo y, si se encuentra uno, se
realiza una prueba para ver si el archivo es de hecho puede escribir. Para ello, se realiza un
toque, seguido por una prueba para determinar si el archivo resultante es un archivo regular.
#! / Bin / bash
# Sys_info_page: programa para la produccin de una pgina de informacin
del sistema progname = $ (basename $ 0)
TITLE = "Informacin del Sistema Para Reportar $ HOSTNAME"
CURRENT_TIME = $ (date + "% x% r% Z")
TIMESTAMP = "gener $ CURRENT_TIME, por $ USER"
report_uptime () {cat
<< - _EOF_
<H2> Sistema Uptime </ h2>
<PRE> $ (tiempo de actividad) </ PRE>
_EOF_
retorno
Estas dos pruebas se encargan de situaciones en las que una ruta de acceso no vlido es de
entrada (contacto fallar), y, si el archivo ya existe, que es un archivo normal.
Como podemos ver, la funcin write_html_page est llamada a llevar a cabo la generacin
real de la pgina. Su salida se dirige ya sea a la salida estndar (si el nombre de archivo
variable est vaca) o redirigido al archivo especificado.

Resumiendo
Con la incorporacin de parmetros de posicin, ahora podemos escribir scripts bastante
funcionales. Para tareas simples, repetitivas, parmetros posicionales permiten escribir
funciones de shell muy tiles que se pueden colocar en el archivo .bashrc del usuario.
Nuestro programa sys_info_page ha crecido en complejidad y sofisticacin. Aqu est una
lista completa, con los cambios ms recientes destacan:

446

Resumiendo
}
report_disk_space () {cat << - _EOF_
<H2> La utilizacin de espacio en disco </ h2>
<PRE> $ (df -h) </ PRE>
_EOF_
retorno
}

report_home_space () {
si [[$ (-u id) -eq 0]]; entonces cat << _EOF_
<H2> Inicio Utilizacin del Espacio (Todos los
usuarios) </ h2> <PRE> $ (du -sh / home / *) </ PRE>
_EOF_
ms
cat << - _EOF_
<H2> Inicio Utilizacin del Espacio ($ USER) </ h2>
<PRE> $ (du -sh $ HOME) </ PRE>
_EOF_
fi
retorno
}

el uso de () {
echo "$ progname: uso: SPROGNAME [-f archivo | -i]" retorno
}
write_html_page () {cat << - _EOF_
<HTML>
<HEAD>
<TITLE> $ TTULO </ TITLE>
</ HEAD>
<BODY>
<H1> $ TTULO </ H1>
<P> $ TIMESTAMP </ P>
$ (Report_uptime)
$ (Report_disk_space)
$ (Report_home_space)
</ BODY>
</ HTML>
_EOF_
retorno
}

# Opciones de lnea de comandos proceso

447

32 - Parmetros
posicionales
= interactivos
filename =
mientras que [[-n $ 1]]; hace
caso $ 1
-f | --file)
-i | --interactive) -h |
--help)
*)

hecho

cambio
archivo = $ 1
;;
interactive = 1
;;
uso
Salida
;;
uso> & 2 salida 1
;;

esac
cambi
o

# modo interactivo
si [[-n $ interactivo]]; a continuacin,
mientras que la verdadera;
hacer
leer -p "Introduzca el nombre de archivo de salida:" nombre
de archivo si [[-e $ archivo]]; entonces
leer -p "'$ nombre' existe. Sobrescribir? [y / n / q]> caso $
Responder en
Y | y) descanso ;;
Q | q) echo "Programa terminado."
Salida
;;
*) Continuar
;;
esac
fi
hecho
fi
# pgina html de salida
si [[-n $ archivo]]; entonces
si toque $ archivo && [[-f $ archivo]]; entonces write_html_page> $ archivo
ms
echo "$ progname: No se puede escribir el archivo '$ nombre'"> &
2 exit 1 fi
ms

448

write_html_page

fi

Resumiendo

No hemos terminado todava. Todava hay ms cosas que podemos hacer y las mejoras que
podemos hacer.

Lectura adicional

El golpe de Hackers Wiki tiene un buen artculo sobre los parmetros posicionales:
http://wiki.bash-hackers.org/scripting/posparams
El Manual de Referencia Bash tiene un artculo sobre los parmetros especiales,
incluyendo $ * y $ @:
http://www.gnu.org/software/bash/manual/bashref.html#Special-Parameters
Adems de las tcnicas discutidas en este captulo, golpe incluye una orden interna
llamada getopts, que tambin se puede utilizar para los argumentos de lnea de
comandos de proceso. Se describe en la seccin RDENES INTERNAS DEL SHELL
de la pgina de manual de bash y en The Bash Hackers Wiki:
http://wiki.bash-hackers.org/howto/getopts tutorial

449

33

33

- Control de flujo: Con Looping para

- Control de flujo: Con Looping para

En este captulo final sobre el control de flujo, vamos a ver otra de las construcciones de bucles
de la concha. El bucle for difiere del tiempo y hasta bucles en que proporciona un medio de
secuencias de procesamiento durante un bucle. Esto resulta ser muy til cuando se programa.
De acuerdo con ello, el bucle for es una construccin muy popular en secuencias de comandos
bash.
Un bucle for se implementa, como es natural, con la de mando. En las versiones modernas de
la fiesta, para est disponible en dos formas.

por: Tradicional Forma Shell


El original de la sintaxis del comando es:
para variable [en palabras]; hacer
comandos

hecho
[Me @ linuxbox ~] $ for i in A B C D; hacer eco $ i; hecho
La
B
C
D
Donde variable es el nombre de una variable que se incrementar durante la ejecucin del
bucle, palabras es una lista opcional de artculos que sern secuencialmente asignados a la
variable, y los comandos son los comandos que se van a ejecutar en cada iteracin del bucle.
El comando es til para la lnea de comandos. Podemos demostrar fcilmente cmo funciona:
En este ejemplo, se da por una lista de cuatro palabras: "A", "B", "C" y "D". Con una lista de
cuatro palabras, el bucle se ejecuta cuatro veces. Cada vez que se ejecuta el bucle, una palabra
se asigna a la variable i. Dentro del bucle, tenemos un comando echo que muestra el valor de i
para mostrar la asignacin. Como con el tiempo y hasta bucles, la palabra clave hecho cierra el
bucle.
450

por: Tradicional Forma


Shell
La caracterstica muy potente de cuenta es el nmero de formas interesantes que podemos
crear la lista de palabras. Por ejemplo, a travs de la expansin de llaves:
[Me @ linuxbox ~] $ for i in {A..D}; hacer eco $ i; hecho
La
B
C
D
o expansin de nombre
de camino:
[Me @ linuxbox ~] $ for i in distros * .txt; hacer eco $ i; hecho
distros por date.txt
distros-dates.txt
distros-clave-nombres.txt
distros-clave-vernums.txt
distros-nombres.txt
distros.txt
distros-vernums.txt
distros-versions.txt
o la sustitucin de
comandos:
#! / Bin / bash
# Ms larga palabra: encontrar la cadena ms larga de un archivo
mientras que [[-n $ 1]]; hacer
si [[-r $ 1]]; entonces
max_word =
max_len = 0
para i en $ (cadenas $ 1); hacer len = $ (echo
$ i | wc -c) si ((len> max_len)); entonces
max_len = $ len max_word = $ i fi
hecho
echo "$ 1: '$ max_word' ($ max_len caracteres)" fi
cambio
hecho

451

#! / Bin / bash
# Ms larga word2: encontrar cadena ms larga en un
archivo para i; hacer
si [[-r $ i]]; entonces
max_word =
max_len = 0
para j en $ (cadenas $ i); hacer len = $ (echo
$ j | wc -c) si ((len> max_len)); entonces
max_len = $ len max_word = $ j fi
hecho
echo "$ i: '$ max_word' ($ max_len caracteres)" fi
hecho
33 - Control de flujo: Con Looping para
En este ejemplo, se busca la cadena ms larga se encuentra dentro de un archivo. Cuando se
les da uno o ms nombres de archivo en la lnea de comandos, este programa utiliza el
programa de cadenas (que se incluye en el paquete binutils de GNU) para generar una lista de
lectura de texto "palabras" en cada archivo. El bucle for procesa cada palabra a su vez y
determina si la palabra actual es el ms largo encontrado hasta el momento. Cuando el bucle
termina, aparece la palabra ms larga.
Si la parte opcional en palabras del comando para se omite, por defecto es el procesamiento de
los parmetros posicionales. Vamos a modificar nuestro guin de ms larga palabra de

Por qu yo?
Usted puede haber notado que la variable i fue elegido para cada uno de los ejemplos
anteriores de bucle. Por qu? No hay ninguna razn especfica de hecho, adems de
la tradicin. La variable utilizada por cualquier variable puede ser vlida, pero yo es
el ms comn, seguido por j y k.
utilizar este mtodo:
Como podemos ver, hemos cambiado el bucle ms externo a utilizar en lugar de tiempo. Al
omitir la lista de palabras en el para el mando, los parmetros posicionales se utilizan en su
lugar. Dentro del bucle, las instancias anteriores de la variable i se han cambiado a la variable
j. El uso de cambio tambin ha sido eliminado.

452

La base de esta tradicin viene del lenguaje de programacin Fortran. En Fortran, las
variables no declaradas que comienzan con las letras I, J, K, L y M se escriben
automticamente como enteros, mientras que las variables que comienzan con
cualquier otra carta se escriben como reales (nmeros con fracciones decimales). Este
comportamiento llev a los programadores utilizar las variables I, J y K para las
variables de bucle, ya que era menos trabajo para utilizarlas cuando se necesitaba una
variable temporal (como variables de bucle a menudo son).
Tambin llev a la siguiente ocurrencia basada en Fortran:
"Dios es real, a menos declarado entero."
por: Tradicional Forma Shell

por: Formulario C Idioma


Las versiones recientes de fiesta han aadido una segunda forma de la sintaxis de comandos,
uno que se asemeja a la forma que se encuentra en el lenguaje de programacin C. Muchos
otros idiomas apoyan esta forma, adems de:
para (( expressionl; expression2; expresin3)); hacer comandos
hecho
donde expressionl, expresin2, y expresin3 son expresiones aritmticas y comandos son los
comandos que se deben realizar durante cada iteracin del bucle.
En trminos de comportamiento, esta forma es equivalente a la siguiente construccin:
(( expressionl)) while ((expresin2));
hacer comandos

#! / Bin / bash
# Simple_counter: demostracin de estilo C de comando
por ((i = 0; i <5; i = i + 1)); hacer echo $ i
hecho
(( expresin3))
hecho
expressionl se utiliza para inicializar condiciones para el bucle, expresin2 se utiliza para
determinar cuando se termina el bucle, y expression3 se lleva a cabo al final de cada iteracin
del bucle.
Aqu es una aplicacin tpica:

453

33 - Control de flujo: Con Looping para__________


Cuando se ejecuta, produce la siguiente salida:

[Me @ linuxbox ~] $ simple_counter 0 1


2
3
4

En este ejemplo, expressionl inicializa la variable i con el valor de cero, expression2 permite
que el bucle para continuar siempre y cuando el valor de i se mantiene a menos de 5, y
expression3 incrementa el valor de i por uno cada vez que se repite el bucle.
La forma de lenguaje C para es til en cualquier momento se necesita una secuencia numrica.
Vamos a ver varias aplicaciones para esto en los dos captulos siguientes.

Resumiendo
Con nuestro conocimiento de la para el mando, ahora vamos a aplicar las mejoras finales a
nuestro script sys_info_page. En la actualidad, la funcin report_home_space se parece a esto:

report_home_space () {
si [[$ (-u id) -eq 0]]; entonces cat << _EOF_
<H2> Inicio Utilizacin del Espacio (Todos los
usuarios) </ h2> <PRE> $ (du -sh / home / *) </ PRE>
_EOF_
ms
cat << - _EOF_
<H2> Inicio Utilizacin del Espacio ($ USER) </ h2>
<PRE> $ (du -sh $ HOME) </ PRE>
_EOF_
fi
retorno
}
A continuacin, vamos a reescribir a proporcionar ms detalles para el directorio home de
cada usuario, e incluyen el nmero total de archivos y subdirectorios en cada uno:
report_home_space () {

454

format = "% locales 8s% 10s% 10s \ n"


locales i dir_list total_files total_dirs total_size nombre_usuario
si [[$ (-u id) -eq 0]]; entonces dir_list = / home / * nombre_usuario = "Todos
los usuarios"
ms
dir_list = $ HOME
nombre_usuario = $ USER
fi
echo "<h2> Inicio Utilizacin del Espacio ($ nombre_usuario) </ H2>"
for i in $ dir_list; hacer
total_files = $ ($ i encuentro -type f | wc -l)
total_dirs = $ ($ i encuentro de tipo D | wc -l)
total_size = $ (du -sh $ i | cort -f 1)

hecho
retorno

echo "<h3> $ i </ H3>" echo "<PRE>"


printf "$ formato" "Dirs" "Archivos" "Tamao"
printf "$ formato" " ---------- "" ---------- "" --------- "
printf "$ formato" $ total_dirs $ total_files $ total_size echo "</
PRE>"

Resumiendo

Esta reescritura se aplica buena parte de lo que hemos aprendido hasta ahora. Todava prueba
para el superusuario, pero en lugar de realizar el conjunto completo de acciones como parte
del caso, establecemos algunas variables utilizadas ms tarde en un bucle for. Hemos aadido
varias variables locales a la funcin y hecho uso de printf para dar formato a algunos de la
salida.

Lectura adicional

La Gua avanzada Bash-Scripting tiene un captulo sobre bucles, con una variedad de
ejemplos que utilizan para:
http://tldp.org/LDP/abs/html/loops1.html

El Manual de Referencia Bash describe los comandos compuestos de bucle, en


particular para:
http://www.gnu.org/software/bash/manual/bashref.html#Looping-Constructs

455

34 - Cadenas y nmeros

34 - Cadenas y nmeros
Los programas de ordenador son todos acerca de cmo trabajar con los datos. En los captulos
anteriores, nos hemos centrado en el procesamiento de datos a nivel de archivo. Sin embargo,
muchos problemas de programacin tienen que ser resueltos usando las unidades ms
pequeas de datos, tales como cadenas y nmeros.
En este captulo, vamos a ver varias caractersticas de concha que se utilizan para manipular
cadenas y nmeros. El shell proporciona una variedad de expansiones de parmetros que
realizan operaciones de cadena. Adems de la expansin aritmtica (que hemos tratado en el
captulo 7), hay un programa de lnea de comandos comn llamado aC, que realiza ms alto
nivel de matemticas.

Expansin Parmetro
A pesar de la expansin de parmetro se acerc en el captulo 7, que no cubrimos en detalle
porque la mayora de las expansiones de los parmetros se utilizan en secuencias de
comandos en lugar de en la lnea de comandos. Ya hemos trabajado con algunas formas de
expansin de parmetros; por ejemplo, pagar las variables. El shell proporciona muchos ms.

Parmetros bsicos
La forma ms simple de la expansin de parmetro se refleja en el uso ordinario de variables.
Por ejemplo:
$A
cuando se expande, se convierte en lo que la variable a contiene. Parmetros simples tambin
pueden estar rodeadas por llaves:
$ {A}
Esto no tiene ningn efecto sobre la expansin, pero es necesario si la variable se encuentra
[Me @ linuxbox ~] $ a = "foo" [me @
linuxbox ~] $ echo "$ un_fichero"
junto a otro texto, que puede confundir a la cscara. En este ejemplo, se intenta crear un
nombre de archivo aadiendo la cadena "_FILE" al contenido de la variable a.

456

Expansin Parmetro
Si llevamos a cabo esta secuencia, el resultado ser nada, porque el shell intentar expandir
una variable llamada un_fichero en lugar de una. Este problema puede ser resuelto mediante
la adicin de llaves:
Tambin hemos visto que los parmetros posicionales mayores de 9 se puede acceder por los
[Me @ linuxbox ~] $ echo "$ {a} _FILE"
foo_file
alrededores el nmero de aparatos de ortodoncia. Por ejemplo, para acceder al parmetro de
posicin undcima, podemos hacer esto:
$ {11}

Expansiones para gestionar variables vacas


Varias expansiones de parmetros se refieren a las variables inexistentes y vacos. Estas
expansiones son muy tiles para el manejo de desaparecidos parmetros posicionales y la
asignacin de valores por defecto para los parmetros.
$ {Parmetro: -palabra}
Si el parmetro no est definido (es decir, no existe) o est vaco, los resultados de esta
expansin en el valor de la palabra. Si el parmetro no est vaca, los resultados de expansin
en el valor del parmetro.
[Me @ linuxbox ~] $ foo =
[me @ linuxbox ~] $ echo $ {foo: - "valor de sustitucin si unset"}
valor de sustitucin si echo unset $ foo
[me @ linuxbox ~] $
[Me @ linuxbox ~] $ Foo = bar
[Me @ linuxbox
~] $ Echo $ {foo: - "valor de sustitucin si unset"} ~] $ echo
bar
[Me @ linuxbox
$ foo
bar
$ {Parmetro: = palabra}
Si el parmetro no est definido o est vaco, esta expansin se traduce en el valor de la
palabra. Adems, el valor de la palabra se asigna al parmetro. Si el parmetro no est vaca,
los resultados de expansin en el valor del parmetro.
[Me @ linuxbox ~] $ foo =
[Me @ linuxbox ~] $ echo $ {foo: = "valor por defecto si unset"}
457

34 - cadenas y nmeros
valor predeterminado si unset [me @ linuxbox ~] $ echo $ foo valor
predeterminado si unset [me @ linuxbox ~] $ foo = bar
[Me @ linuxbox ~] $ echo $ {foo: = "valor por defecto si unset"}
bar
[Me @ linuxbox ~] $ echo $ foo bar

Nota: Los parmetros posicionales y otros especiales no se pueden asignar de


esta manera.
$ {Parmetro:? Palabra}
Si el parmetro no est definido o est vaco, esta expansin hace que la secuencia de
comandos para salir con un error, y el contenido de la palabra se enva al error estndar. Si el
parmetro no est vaca, los resultados de expansin en el valor del parmetro.

[Me @ linuxbox ~] $ foo =


[Me @ linuxbox ~] $ echo $ {foo:? "Parmetro est vaco"}
bash: foo: parmetro est vaco [me @ linuxbox ~] $ echo $?
1
[Me @ linuxbox ~] $ foo = bar
[Me @ linuxbox ~] $ echo $ {foo:? "Parmetro est vaco"}
bar
[Me @ linuxbox ~] $ echo $?
0

$ {Parmetro: + palabra}
Si el parmetro no est definido o est vaco, la expansin se traduce en nada. Si el parmetro
no est vaca, el valor de la palabra se sustituye por parmetro; Sin embargo, no se cambia el
valor del parmetro.

[Me @ linuxbox ~] $ foo =


[Me @ linuxbox ~] $ echo $ {foo: + "valor de sustitucin si se establece"}
[Me @ linuxbox ~] $ foo = bar
[Me @ linuxbox ~] $ echo $ {foo: + "valor de sustitucin si se establece"}
valor de sustitucin si se establece

458

Expansin Parmetro

Las expansiones que devuelven nombres de variable


La cscara tiene la capacidad de devolver los nombres de variables. Esto se utiliza en algunas
situaciones bastante exticos.
$ {!prefijo *}
$ {!prefijo @}
[Me @ linuxbox ~] $ echo $ {! BASH *}
BASH BASH_ARGC BASH_ARGV BASH_COMMAND bash_completion
BASH_COMPLETION_DIR BASH_LINENO BASH_SOURCE
BASH_SUBSHELL BASH_VERSINFO BASH_VERSION
Esta expansin devuelve los nombres de las variables existentes con nombres que comienzan
con el prefijo. De acuerdo con la documentacin bash, ambas formas de la expansin realizan
idnticamente. Aqu, enumeramos todas las variables en el medio ambiente con nombres que
comienzan con bash:

Operaciones de Cuerda
Hay un gran conjunto de expansiones que pueden ser utilizados para operar en cadenas.
Muchas de estas expansiones son especialmente adecuados para las operaciones en las rutas
de acceso.
$ {Parmetro} #
[Me @ linuxbox ~] $ foo = "Esta cadena es larga."
[Me @ linuxbox ~] $ echo "" $ foo 'es $ {# foo} caracteres de largo. "
"Esta cadena es larga. ' es de 20 caracteres de longitud.
se expande en la longitud de la cadena contenida por el parmetro. Normalmente, el
parmetro es una cadena; sin embargo, si el parmetro es o bien @ o *, entonces los resultados
de expansin en el nmero de parmetros posicionales.
$ {Parmetro: offset}
$ {Parmetro: desplazamiento: longitud}
[Me @ linuxbox ~] $ foo = "Esta cadena es larga."
[Me @ linuxbox ~] $ echo $ {foo: 5} cadena es larga.
Estas expansiones se usan para extraer una porcin de la cadena contenida en el parmetro. La
extraccin comienza en caracteres desplazamiento desde el principio de la cadena y contina
hasta el final de la cadena, a menos que se especifica la longitud.

459

[Me @ linuxbox ~] $ echo $ {foo: 5: 6} de


cadena
34 - cadenas y nmeros
Si el valor de desplazamiento es negativo, se considera que significa que comienza desde el
final de la cadena en lugar de al principio. Tenga en cuenta que los valores negativos deben ir
precedidas de un espacio para evitar la confusin con el $ {parmetro: - palabra} expansin.
longitud, si est presente, no debe ser menor que cero.
Si el parmetro es @, el resultado de la expansin es de longitud parmetros posicionales,
empezando en el desplazamiento.

H
ol
a
O
O

[Me @ linuxbox ~] $ foo = 'Este cadena es larga ".


[Me @ linuxbox ~] $ eco $ {Foo : -5}
de largo.
[Me @ linuxbox ~] $ eco
: -5: 2}
he aqu
$ {Parmetro} patrn #
$ {Parmetro ## patrn}
Estas expansiones eliminar una porcin principal de la cadena contenida en el parmetro
definido por el patrn. patrn es un patrn de comodines como los utilizados en la expansin
de nombre de ruta. La diferencia en las dos formas es que la forma # quita la ms corta,
mientras que la forma ## elimina la coincidencia ms larga.
[Me @ linuxbox ~] $ foo = file.txt.zip
[Me @ linuxbox ~] $ echo $ {foo # *.}
txt.zip
[Me @ linuxbox ~] $ echo $ {foo ## *.}
cremallera
$ {Parmetro% patrn}
[Me @ linuxbox ~] $ foo = file.txt.zip
[Me @ linuxbox ~] $ echo $ {foo%. *}
Archivo.txt
[Me @ linuxbox ~] $ echo $ {foo %%. *}
$ {Parmetro %% patrn}
Estas expansiones son los mismos como el # ## y expansiones anteriores, excepto que
eliminan el texto desde el extremo de la cadena contenida en el parmetro en lugar de desde el
principio.

460

Expansin Parmetro
$ {Parmetro / patrn / cadena}
expe
dient
e
$ {Parmetro // patrn / cadena}
$ {Parmetro / # patrn / cadena}
$ {Parmetro / patrn% / cadena}
Esta expansin lleva a cabo una bsqueda y reemplazo en el contenido del parmetro. Si el
texto se encuentra el modelo a juego de comodines, se reemplaza con el contenido de la
cadena. En la forma normal, slo se reemplaza la primera ocurrencia del patrn. En la //
forma, se reemplazan todas las ocurrencias. El / # forma requiere que la coincidencia se
produce al principio de la cadena, y la forma /% requiere el partido que se produzca al final
de la cadena. / Cadena puede ser omitido, lo que hace que el texto que coincide con el patrn
que desea eliminar.
[Me @ linuxbox
[Me @ linuxbox
jpg.jpg
[Me @ linuxbox
jpg-jpg
[Me @ linuxbox
jpg-JPG
[Me @ linuxbox
Jpg.jpg
#! / Bin / bash

~] $ Foo = jpg.jpg
~] $ Echo $ {foo / JPG / jpg}
~] $ Echo $ {foo // JPG / jpg}
~] $ Echo $ {foo / # JPG / jpg}
~] $ Echo $ {foo /% JPG / jpg}

# Ms larga word3: encontrar cadena ms larga en un


archivo para i; hacer
si [[-r $ i]]; entonces
max_word =
max_len =
para j en $ (cadenas $ i); hacer len
= $ {# j}
if ((len> max_len)); entonces

461
Expansin de parmetro es una buena cosa para saber. Las expansiones de manipulacin de
cadenas se pueden utilizar como sustitutos de otros comandos comunes como la sed y cortar.
Expansiones de mejorar la eficiencia de las secuencias de comandos al eliminar el uso de
programas externos. Como ejemplo, vamos a modificar el programa de ms larga palabra se
discuti en el captulo anterior de utilizar la expansin de parmetro $ {#} j en lugar de la
sustitucin de comandos $ (echo $ j | wc -c) y su subcapa resultante, al igual que :

34 - cadenas y nmeros

max_len = $ len
max_word = $ j

hecho fi
eco "$ Yo: '$ Max_word' ($ max_len caracteres) "
fi
cambi
o

hecho
A continuacin, vamos a comparar la eficiencia de las dos versiones con el comando de
tiempo:
[Me @ linuxbox ~] $
tiempo
listadir-USR-bin.txt:
caracteres)
0m3.618s reales
0m1.544s usuario
0m1.768s sys
[Me @ linuxbox ~] $
tiempo
listadir-USR-bin.txt:
caracteres)

de ms larga word2 listadir-USR-bin.txt


scrollkeeper-conseguir-contenido-lista ampliada '

de ms larga word3 listadir-USR-bin.txt


scrollkeeper-conseguir-contenido-lista ampliada '

(38

(38

verdadero usuario 0m0.060s


0m0.056s sys 0m0.008s

La versin original de la secuencia de comandos toma 3,618 segundos para escanear el archivo
de texto, mientras que la nueva versin, con la expansin de parmetro, toma slo 0,06
segundos, una mejora muy significativa.

Caso Conversin
Las versiones recientes de fiesta tienen soporte para la conversin superior / minsculas de
las cadenas. Bash tiene cuatro expansiones de parmetros y dos opciones del comando declare
que la apoyen.
Entonces, qu es la conversin caso bueno para? Aparte del valor esttico obvio, tiene un
papel importante en la programacin. Consideremos el caso de una base de datos de consulta.
Imagine que un usuario ha entrado en una cadena en un campo de entrada de datos que
queremos buscar en una base de datos. Es posible que el usuario introduzca el valor en letras
maysculas o minsculas, o una combinacin de ambos. Desde luego, no queremos poblar
nuestra base de datos con toda posible permutacin de grafas maysculas y minsculas. Qu
hacer?
Un enfoque comn a este problema es normalizar la entrada del usuario. Es decir, convertirlo
en un formulario estandarizado antes de intentar la base de datos de consulta. Podemos hacer
esto por con- 462

#! / Bin / bash
# Ul-declarar: demostrar la conversin de caso a travs de declarar
declarar -u superior declarar -l menor
si [[$ 1]]; entonces superiores = "$ 1" = ms bajos "$ 1" echo $ echo $
superior inferior fi
_____________________________________________________________ Expansin Parmetro
vertir todos los personajes de la entrada del usuario ya sea inferior o maysculas y asegurarse
de que las entradas de base de datos se normalizaron la misma manera.
El comando DECLARE puede usarse para normalizar las cuerdas a cualquiera de maysculas
o minsculas. Usando declarar, podemos forzar una variable para contener siempre el
formato deseado sin importar lo que se le asigna a la misma:
[Me @ linuxbox ~] $ ul-declaro aBc
Abecedario
abecedario
En el guin anterior, declaramos que utilizamos para crear dos variables, superior e inferior.
Asignamos el valor del argumento de la primera lnea de comandos (parmetro de posicin 1)
a cada una de las variables y luego mostrarlos en la pantalla:
Como podemos ver, el argumento de lnea de comandos ("ABC") se ha
normalizado. Hay cuatro expansiones de parmetros que realizan la conversin
superior / minsculas:
Tabla 34-1: Caso de conversin de parmetros Expansiones
Formato

Resultado

$ {Parmetro,,}
$ {Parmetro,}

Expandir el valor de parmetro en minsculas.

$ {} ParameterAA

Expandir el valor de parmetro en maysculas.

$ {} ParameterA

Expandir el valor del parmetro cambiando slo el primero

463

Expandir el valor del parmetro cambiando slo el primer


carcter a minsculas.

34 - cadenas y nmeros
carcter en maysculas (maysculas).
Aqu es un script que demuestra estas expansiones:
#! / Bin /
bash
# Ul-param - demostrar conversin caso a travs de la expansin de parmetro
si [[$ 1]]; entonces
echo $ {1} ,,
{echo $ 1,} echo $ {1AA}
echo $ {1A} fi

Aqu est la secuencia de


comandos en la accin:
[Me @ linuxbox ~] $ ul-param aBc
abecedario
aBc
Abecedario
ABc
Una vez ms, en que procesamos el primer argumento de la lnea de comandos y la salida de
las cuatro variaciones con el apoyo de las expansiones de los parmetros. Aunque este script
usa el primer parmetro posicional, parmetro mi ser cualquier cadena, una variable o
expresin de cadena.

Evaluacin aritmtica y la expansin


Nos fijamos en la expansin aritmtica en el captulo 7. Se utiliza para realizar diversas
operaciones aritmticas con enteros. Su forma bsica es:
$ ((Expresin))
donde la expresin es una expresin aritmtica vlida.
Esto se relaciona con el comando compuesto (()) que se utiliza para la evaluacin de la
aritmtica (pruebas de la verdad) que encontramos en el captulo 27.
En los captulos anteriores, hemos visto algunos de los tipos comunes de expresiones y
operadores. Aqu, vamos a ver una lista ms completa.

464

Evaluacin aritmtica y la expansin

Bases Nmero
De vuelta en el captulo 9, nos dieron un vistazo a los nmeros octales (base 8) y hexadecimal
(base 16). En expresiones aritmticas, el shell soporta constantes enteras en cualquier base.
Tabla 34-2: Especificacin Diferentes Bases Nmero
Notacin
nmero

Descripcin

Onumber

De forma predeterminada, los nmeros sin ningn tipo de notacin


se tratan como decimales (base 10) nmeros enteros.
En expresiones aritmticas, nmeros con un cero a la izquierda se
consideran octal.

Oxnumber

La notacin hexadecimal

# Nmero de base

nmero es en la base de

Algunos ejemplos:

[Me @ linuxbox ~
] $ Echo $ ((0xff))
255
[Me @ linuxbox ~ ] Echo $ $ ((2 # 11111111))
255
En los ejemplos anteriores, imprimimos el valor de la FF hexadecimal nmero (el nmero de
dos dgitos ms grande) y el mayor de ocho dgitos binarios (base 2) nmeros.

Operadores unarios
Hay dos operadores unarios, + y -, que se utilizan para indicar si un nmero es positivo o
negativo, respectivamente. Por ejemplo, -5.

Aritmtica simple
Los operadores aritmticos comunes se listan en la siguiente tabla:
Tabla 34-3: Operadores aritmticos
Operador
+

Descripcin
Adicin

Sustraccin

465

34 - cadenas y nmeros
*

Multiplicacin

/
**

La divisin entera

Mdulo (resto)

Exponenciacin

La mayora de estos son fciles de entender, pero la divisin entera y mdulo requieren ms
discusin.
Desde la aritmtica de la cscara slo opera en nmeros enteros, los resultados de la divisin
son siempre nmeros enteros:

[Me @ linuxbox ~] $ echo $ ((5/2))


2
Esto hace que la determinacin de un resto en una operacin de divisin ms
importante:
[Me @ linuxbox ~] $ echo $ ((5% 2)) 1

Mediante el uso de los operadores de divisin y de mdulo, podemos determinar que 5


dividido por 2 resultados de 2, con un resto de 1.
Calculando el resto es til en bucles. Permite una operacin a realizar en los intervalos
especificados durante la ejecucin del bucle. En el siguiente ejemplo, se muestra una lnea de
nmeros, destacando cada mltiplo de 5:

#! / Bin / bash
# Modulo: demostrar el operador de mdulo
por ((i = 0; i <= 20; i = i + 1)); hacer resto = $ ((i% 5)) if
((resto == 0)); entonces printf "<% d>" $ i
ms
printf "% d" $ i fi
hecho
printf "\ n"

466

Evaluacin aritmtica y la expansin


Cuando se ejecuta, los resultados se ven as:

Asignacin
[Me @ linuxbox ~] $ mdulo
<0> 1 2 3 4 <5> 6 7 8 9 <10> 11 12 13 14 <15> 16 17 18 19 <20>
A pesar de que sus usos pueden no ser aparentes inmediatamente, expresiones aritmticas
pueden realizar la asignacin. Hemos realizado de asignacin de muchas veces, aunque en un
contexto diferente. Cada vez que damos una variable un valor, estamos llevando a cabo la
[Me @ linuxbox ~] $ foo =
[me @ linuxbox ~] $
echo $ foo
[Me @ linuxbox ~] $
"Es cierto.";
fi
if ((foo = 5)); a continuacin, echo
es cierto. [Me @
linuxbox ~] $ 5
echo $ foo
asignacin. Tambin podemos hacerlo dentro de las expresiones aritmticas:
En el ejemplo anterior, primero asignamos un valor vaco a la variable foo y verificamos que s
es vaco. A continuacin, realizamos un si con el comando compuesto ((foo = 5)). Este proceso
hace dos cosas interesantes: 1) se asigna el valor de 5 a la variable foo, y 2) se evala como
cierto porque foo se le asign un valor distinto de cero.
Nota: Es importante recordar el significado exacto de los = en la expresin anterior. Un
solo = realiza la asignacin. foo = 5 dice "hacer foo igual a 5", mientras == evala la
equivalencia. foo == 5 dice "hace foo igual a 5?" Esto puede ser muy confuso, porque el
comando de prueba acepta un solo = equivalencia de cadena. Esta es otra razn para
utilizar los modernos [[]] y (()) comandos ms compuestos en lugar de la prueba.
Adems de los =, la cscara tambin proporciona anotaciones que llevan a cabo algunas tareas
muy tiles:
Tabla 34-4: Operadores de Asignacin
Notacin

Descripcin

467

34 - cadenas y nmeros
parmetro = valor
parmetro + = Valor

Asignacin simple. Asigna el valor de parmetro.


Adicin. Equivalente al parmetro = parmetro + valor.

parmetro - = valor

Resta. Equivalente al parmetro = parmetro - valor.

* parmetro = valor

Multiplicacin. Equivalente al parmetro = valor del


parmetro *.

parmetro / valor =
parmetro% = valor
parmetro++
parmetro++ Parmetro
--parameter

La divisin entera. Equivalente al parmetro = parmetro


/ valor.
Modulo. Equivalente al parmetro = valor del
parmetro%.
Variable post-incremento. Equivalente a = parmetro
parmetro + 1 (sin embargo, vase la discusin ms
adelante).
Variable de decremento posterior. Equivalente al
parmetro = parmetro - 1.
Variable de incremento previo. Equivalente al parmetro =
parmetro + 1.
Variable de decremento previo. Equivalente al parmetro
= parmetro - 1.

Estos operadores de asignacin proporcionan un atajo conveniente para muchas tareas


aritmticas comunes. De especial inters son el incremento (++) y decremento - los operarios,
que aumentan o disminuyen el valor de sus parmetros por uno (). Este estilo de notacin se
toma del lenguaje de programacin C y ha sido incorporada por varios otros lenguajes de
programacin, incluyendo bash.
Los operadores pueden aparecer ya sea en la parte delantera de un parmetro o al final.
Mientras tanto, ya sea aumentar o disminuir el parmetro a una, las dos colocaciones tienen
[Me @ linuxbox ~] $ foo = 1 [me @
linuxbox ~] $ echo $ ((foo ++)) 1
[Me @ linuxbox ~] $ echo $ foo
una sutil diferencia. Si est colocado en la parte delantera del parmetro, el parmetro se
incrementa (o disminuye) antes de que se devuelva el parmetro. Si se coloca despus, se lleva
a cabo la operacin despus se devuelve el parmetro. Esto es bastante extrao, pero es el
comportamiento previsto. Aqu est una demostracin:
468

Evaluacin aritmtica y la expansin


2
Si asignamos el valor de uno a la variable foo y luego incrementamos con el operador ++
colocado despus del nombre de parmetro, foo se devuelve con el valor de uno. Sin embargo,
si nos fijamos en el valor de la variable por segunda vez, vemos el valor incrementado. Si
colocamos el operador ++ delante del parmetro, obtenemos el comportamiento ms
esperado:
[Me @ linuxbox ~] $ foo = 1 [me @
linuxbox ~] $ echo $ ((++ foo))
2
[Me @ linuxbox ~] $ echo $ foo
2
Para la mayora de las aplicaciones de concha, anteponiendo el operador ser el ms til.
Los operadores ++ y - se utilizan a menudo en combinacin con bucles. Vamos a hacer
algunas mejoras en nuestro script de mdulo para apretarlo un poco:

#! / Bin / bash
# Modulo2: demostrar que el operador de mdulo
por ((i = 0; i <= 20; ++ i)); hacer si (((i% 5) == 0));
entonces printf "<% d>" $ i
ms
printf "% d" $ i fi
hecho
printf "\ n"

Operaciones de bits
Una clase de operadores manipula los nmeros de una manera inusual. Estos operadores
trabajan en el nivel de bit. Se utilizan para ciertos tipos de tareas de bajo nivel, a menudo con
el establecimiento o la lectura de bits banderas.
Tabla 34-5: Operadores Bit
Operador
~

469

Descripcin
Negacin bit a bit. Negar todos los bits de un nmero.

34 - cadenas y nmeros
<<
>>
Y

Maysculas izquierda en modo bit. Shift todos los bits en un


nmero a la izquierda.
Desplazamiento derecha en modo bit. Shift todos los bits en un
nmero a la derecha.
AND bit a bit. Lleve a cabo una operacin y en todos los bits en dos
nmeros.

| OR bit a bit. Realizar una operacin OR en todos los bits en dos nmeros.
La

Bitwise XOR. Realizar una operacin O exclusiva sobre todos los


bits en dos nmeros.
[Me @ linuxbox ~] $ por ((i = 0; i <8; ++ i)); hacer echo $ ((1 << i)); hecho
1
2
4
8
16
32
64
128
Tenga en cuenta que tambin hay operadores de asignacin correspondiente (por ejemplo, <<
=) para todos, pero la negacin bit a bit.
Aqu vamos a demostrar la produccin de una lista de potencias de 2, usando el operador de
desplazamiento a izquierda en modo bit:

Lgica
Como descubrimos en el captulo 27, el (()) comando compuesto es compatible con una
variedad de operadores de comparacin. Hay unos pocos ms que se puede utilizar para
evaluar la lgica. Aqu est la lista completa:
Tabla 34-6: Operadores de comparacin
Operador
<=

Descripcin
Menor o igual a

>=

Mayor que o igual a

<

Menos que

>

Ms que

470

Evaluacin aritmtica y la expansin


==

Igual a

!=

No es igual a

&&

Y lgico

Illinois
expr1? expr2: Expr3

OR lgico
Comparacin (ternario). Si exprl expresin se evala a ser
(aritmtica verdadera) entonces expr2-cero no, otra cosa
expr3.

[Me @ linuxbox ~] $ if ((1)); then echo "verdadera"; else echo "false"; fi


verdadero
[Me @ linuxbox ~] $ if ((0)); then echo "verdadera"; else echo "false"; fi
falso
Cuando se utiliza para operaciones lgicas, expresiones siguen las reglas de la lgica
aritmtica; es decir, expresiones que evalan como cero se consideran falso, mientras que las
expresiones no nulos se consideran verdadera. El comando compuesto (()) los mapas de los

[Me @ linuxbox ~] $ a = 0 [me @ linuxbox


~] $ ((a <1 ++ un: - a)) [me @ linuxbox ~] $
echo $ a 1
[Me @ linuxbox ~] $ ((a <1 ++ un: - a))
[Me @ linuxbox ~] $ echo $ a 0
resultados en los cdigos normales de salida de la shell:
El ms extrao de los operadores lgicos es el operador ternario. Este operador (el cual es el
modelo de la una en el lenguaje de programacin C) lleva a cabo una prueba lgica
independiente. Puede ser utilizado como una especie de if / then / else. Acta en tres
expresiones aritmticas (cadenas no funcionar), y si la primera expresin es verdadera (o
distinto de cero) se lleva a cabo la segunda expresin. De lo contrario, se realiza la tercera
expresin. Podemos intentar esto en la lnea de comandos:
Aqu vemos un operador ternario en la accin. Este ejemplo implementa una palanca. Cada
vez que el operador se lleva a cabo, el valor de la variable a interruptores de cero a uno o
viceversa.
Tenga en cuenta que la realizacin de la asignacin dentro de las expresiones no es sencillo.

471

34 - cadenas y nmeros____________________
Cuando intento, golpe declarar un error:

[Me @ linuxbox ~] $ a = 0 [me @ linuxbox ~]


$ ((a <1 a + = 1:? A- = 1))
bash: ((: a <1 a + = 1: a- = 1: intento de cesin a (token error no variable es "- = 1")

Este problema puede ser mitigado por que rodea la expresin de asignacin con parntesis:

[Me @ linuxbox ~] $ ((a <1? (A + = 1) :( a- = 1)))


A continuacin, vemos un ejemplo ms completo de la utilizacin de operadores aritmticos
en un guin que produce una simple tabla de nmeros:
#! / Bin / bash
# Arith-loop: script para demostrar operadores aritmticos
terminado = 0
a=0
printf "un \ ta ** 2 \ ta ** 3 \ n" printf "= \ t ==== \ t ==== \ n"
hasta que ((terminado)); hacer b = $ ((a ** 2)) c = $ ((a ** 3))
printf "% d \ t% d \ t% d \ n" $ a $ b $ c ((a <10 ++ a:? (terminado =
1)))
hecho

En este script, implementamos un bucle hasta que la base del valor de la variable de acabado.
Inicialmente, la variable se pone a cero (falso aritmtica) y continuamos el bucle hasta que se
convierte en no-cero. Dentro del bucle, se calcula el cuadrado y el cubo de la variable de
contador a. Al final del bucle, se evala el valor de la variable de contador. Si es menos de 10
(el nmero mximo de iteraciones), se incrementa en uno, de lo contrario la variable
terminado se le da el valor de uno, haciendo que termin aritmticamente verdadero,
finalizando de este modo el bucle. Ejecucin del script da este resultado:

472

Evaluacin aritmtica y la expansin

bc - Una precisin arbitraria Calculadora Idioma


[Me @ linuxbox ~] $ arith bucle
un
A ** 2 a ** 3
0
0
0
1
1
1
4
2
8
3
9
27
4
16
64
5
25
125
36
6
216
7
49
343
8
64
512
9
729
81
10
100 1000
Hemos visto cmo la cscara puede manejar todo tipo de aritmtica de enteros, pero lo que si
tenemos que realizar ms alto de matemticas o incluso slo tiene que utilizar los nmeros de
punto flotante? La respuesta es, no podemos. Por lo menos no directamente con la cscara.
Para ello, tenemos que utilizar un programa externo. Existen varios enfoques que podemos
tomar. Incorporacin de los programas de Perl o AWK es una posible solucin, pero por
desgracia, fuera del alcance de este libro.
Otro enfoque es usar un programa especializado calculadora. Uno de estos programas se
encuentran en la mayora de los sistemas Linux se llama bc.
El programa bc lee un archivo escrito en su propio lenguaje similar a C y la ejecuta. Un script
bc puede ser un archivo separado o se puede leer de la entrada estndar. El lenguaje bc
soporta un buen nmero de caractersticas que incluyen variables, bucles y funciones
definidas por el programador. No vamos a cubrir en su totalidad antes de Cristo aqu, slo lo
suficiente para darte una idea. bc est bien documentado por su pgina de manual.
Vamos a empezar con un ejemplo sencillo. Vamos a escribir un guin bc aadir 2 ms 2:
La primera lnea de la secuencia de comandos es un comentario. bc utiliza la misma sintaxis
/ * Una muy simple script bc * / 2 + 2
para comentarios como el lenguaje de programacin C. Comentarios, que pueden abarcar
varias lneas, comienzan con / * y terminan con * /.

473

34 - cadenas y nmeros _______________________________________

Usando bc
Si ahorramos el guin bc anteriormente como foo.bc, podemos
ejecutar de esta manera:
[Me @ linuxbox ~] $ bc bc foo.bc 06/01/94
Derechos de autor 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software
Foundation, Inc.
Este es software libre con ABSOLUTAMENTE NINGUNA GARANTA.
Para ms detalles escriba 'garanta'.
4

Si miramos con atencin, podemos ver el resultado en la parte inferior, despus del mensaje
de los derechos de autor. Este mensaje se puede suprimir con la opcin -q (tranquilo).
bc tambin se puede utilizar de forma interactiva:

[Me @ linuxbox ~] $ bc -q 2 +
24
dejar de

Al utilizar bc interactiva, simplemente tecleamos los clculos que queremos realizar, y se


muestran inmediatamente los resultados. El comando bc dejar de fumar termina la sesin
interactiva.
Tambin es posible pasar un guin a travs de la entrada estndar bc:

[Me @ linuxbox ~] $ bc <foo.bc 4

La capacidad de tomar la entrada estndar significa que podemos utilizar aqu los
documentos, aqu, cuerdas y tubos para pasar los scripts. Este es un ejemplo de cadena aqu:
[Me @ linuxbox ~] $ bc <<< "2 + 2" 4

474

bc - Una precisin arbitraria Calculadora Idioma

Un script de ejemplo
Como un ejemplo del mundo real, vamos a construir un script que realiza un clculo comn,
los pagos mensuales del prstamo. En la secuencia de comandos a continuacin, se utiliza un
documento aqu para pasar un script para bc:

#! / Bin / bash
# Prstamo-calc: script para calcular los pagos mensuales del prstamo
Progname = $ (basename $ 0)
el uso de () {
cat << - EOF
De uso: $ progname MESES principal inters Dnde:

Principal es la cantidad del prstamo.


El inters es el APR como un nmero (7% = 0,07).
Meses es la duracin del plazo del prstamo.
EOF

si (($ # = 3)!); luego salga uso 1 fi


director = $ 1
inters = $ 2
meses = $ 3
bc << - EOF
escala = 10 $ i = inters / 12 p = $ = $ principal n meses
a = p * ((i * ((1 + i) a)) / (((1 + i) a) - 1)) imprimir una, "\ n"
EOF

Cuando se ejecuta, los resultados se ven


as:
[Me @ linuxbox ~] $ prstamo Calc-135000 0.0775 180

475

1,270.7222490000
34 - cadenas y nmeros
En este ejemplo se calcula el pago mensual de un prstamo de $ 135.000 a 7,75% TAE durante
180 meses (15 aos). Ntese la precisin de la respuesta. Esto se determina por el valor dado a
la variable especial escala en la secuencia de comandos bc. Una descripcin completa del
lenguaje de scripting bc es proporcionado por la pgina man bc. Mientras que su notacin
matemtica es ligeramente diferente a la de la concha (bc se asemeja ms a C), la mayor parte
de ella resultar muy familiar, con base en lo que hemos aprendido hasta ahora.

Resumiendo
En este captulo, hemos aprendido acerca de muchas de las pequeas cosas que pueden ser
utilizados para obtener el "verdadero trabajo" realizado en los scripts. A medida que nuestra
experiencia con scripting crece, la capacidad de manipular eficazmente cadenas y nmeros le
ser muy valiosa. Nuestra escritura de prstamo-calc demuestra que incluso los guiones
simples se pueden crear para hacer algunas cosas realmente tiles.

Crdito extra
Mientras que la funcionalidad bsica de la escritura de prstamo-Calc est en su lugar, el
guin est muy lejos de ser completa. Para el crdito adicional, trate de mejorar la escritura de
prstamo-calc con las siguientes caractersticas:

Verificacin completa de los argumentos de la lnea de comandos

Una opcin de lnea de comandos para implementar un modo "interactivo" que le


pedir al usuario que introduzca el director, tasa de inters y plazo del prstamo.

Una mejor formato para la salida.

Lectura adicional

476

El golpe de Hackers Wiki tiene una buena discusin sobre la expansin de parmetro:
http://wiki.bash-hackers.org/syntax/pe

El Manual de Referencia Bash cubre esto, tambin:


http://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expan
- sin

La Wikipedia tiene un buen artculo que describe operaciones de bits:


http://en.wikipedia.org/wiki/Bit operacin

y un artculo sobre las operaciones ternarias:


http://en.wikipedia.org/wiki/Ternary
operacin

_______________________________________________________________ Lectura
adicional
as como una descripcin de la frmula para el clculo de los pagos de prstamos
utilizados en nuestro script prstamo-calc:
calculadora http://en.wikipedia.org/wiki/Amortization

477

35

35

- Matrices

- Matrices

En el ltimo captulo, nos fijamos en cmo la cscara puede manipular cadenas y nmeros.
Los tipos de datos que hemos visto hasta ahora son conocidos en los crculos informticos
como variables escalares; es decir, las variables que contienen un solo valor.
En este captulo, vamos a ver otro tipo de estructura de datos llamada una matriz, que
contiene varios valores. Las matrices son una caracterstica de casi todos los lenguajes de
programacin. La cscara de los apoya, tambin, aunque de manera bastante limitada. Aun
as, puede ser muy til para resolver problemas de programacin.

Qu son las matrices?


Los arrays son variables que tienen ms de un valor a la vez. Las matrices estn organizados
como una mesa. Vamos a considerar una hoja de clculo como un ejemplo. Una hoja de
clculo acta como una matriz bidimensional. Tiene ambas filas y columnas, y una celda
individual en la hoja de clculo puede estar ubicado de acuerdo a su direccin de fila y
columna. Una matriz se comporta de la misma manera. Una matriz tiene clulas, que se
llaman elementos, y cada elemento contiene datos. Se accede a un elemento de matriz
individual utilizando una direccin llamada un ndice o subndice.
La mayora de los lenguajes de programacin soportan matrices multidimensionales. Una
hoja de clculo es un ejemplo de una matriz multidimensional con dos dimensiones, anchura
y altura. Muchos lenguajes soportan matrices con un nmero arbitrario de dimensiones,
aunque los arreglos de dos y tres dimensiones son, probablemente, el ms comnmente
utilizado.
Arrays en bash se limitan a una sola dimensin. Podemos pensar en ellos como una hoja de
clculo con una sola columna. Incluso con esta limitacin, hay muchas aplicaciones para ellos.
El soporte para matrices apareci por primera vez en la versin de bash 2. El programa
original shell de Unix, sh, no apoy las matrices en absoluto.

Creacin de un array
Variables de matriz se nombran igual que otras variables bash, y se crean automticamente
cuando se accede a ellos. He aqu un ejemplo:

478

[Me @ linuxbox ~] $ a [1] = foo [me @


linuxbox ~] echo $ {$ a [1]} foo
Creacin de un array
Aqu vemos un ejemplo tanto de la asignacin y el acceso de un elemento de matriz. Con el
primer comando, el elemento 1 de un conjunto se le asigna el valor "foo". El segundo comando
muestra el valor almacenado de elemento 1. El uso de los frenos en el segundo comando es
necesario para evitar que el shell de intentar la expansin ruta en el nombre del elemento de la
[Me @ linuxbox ~] declaro $ -a un
matriz.
Una matriz tambin se puede crear con el comando DECLARE:
El uso de la opcin -a, este ejemplo de declarar crea la matriz a.

Asignacin de valores a una matriz


Los valores pueden ser asignados en una de dos maneras. Los valores individuales pueden
ser asignados con la siguiente sintaxis:
nombre [ndice] = valor

donde nombre es el nombre de la matriz y el subndice es un nmero entero (o expresin


aritmtica) mayor o igual a cero. Tenga en cuenta que el primer elemento de una matriz es
subndice cero, no uno. valor es una cadena o un entero asignado al elemento de la matriz.
Varios valores pueden ser asignados con la siguiente sintaxis:
nombre = (valor1 valor2 ...)
donde nombre es el nombre de la matriz y el valor ... son valores asignados secuencialmente a
[Me @ linuxbox ~] $ das = (Dom Lun Mar Mi Jue Vie Sb)
los elementos de la matriz, comenzando con el elemento cero. Por ejemplo, si quisiramos
asignar das abreviada de la semana para los das de la matriz, podramos hacer esto:

[Me @ linuxbox ~] $ das = ([0] = Sol [1] = Lunes [2] = mar [3] = Wed [4] = jue
Tambin es posible asignar valores a un elemento especfico mediante la especificacin de un
subndice para cada valor:

479

[5] = vie [6] =


sbado)
35 - Matrices

Acceso a los elementos de matriz


Entonces, qu son las matrices bueno para? Al igual que muchas de las tareas de gestin de
datos se pueden realizar con un programa de hoja de clculo, muchas tareas de programacin
se pueden realizar con arrays.
Vamos a considerar una simple recopilacin de datos y presentacin de ejemplo. Vamos a
construir un guin que analiza los tiempos de modificacin de los archivos en un directorio
especificado. A partir de estos datos, nuestro guin te mostrar una tabla que muestra a qu
hora del da los archivos fueron modificados por ltima vez. Una secuencia de comandos de
este tipo podra ser utilizada para determinar cuando un sistema es el ms activo. Esta
secuencia de comandos, llamadas horas, produce este resultado:
[me @ linuxbox ~] $ horas.
Hora Archiv Hora Archivos
os
00 0
12
11
01 1
13
7
14
02 0
1
03 0
15
7
04 1
16
6
05 1
17
5
4
06 6
18
07 3
19
4
08 1
20
1
09 14
21
0
10 2
22
0
23
11 5
0
#! / Bin / bash
Total de archivos = 80
horas #: guin para contar los archivos por el uso de tiempo de
modificacin () {
echo "uso: $ (basename $ 0) directorio"> & 2
}
Ejecutamos el programa de horas, especificando el directorio actual como el objetivo. Produce
una demostracin tabla, para cada hora del da (0-23), el nmero de archivos de la ltima
modificacin. El cdigo para producir este es el siguiente:

480

# Compruebe que el argumento es un


directorio si [[! -d $ 1]]; entonces
salida el uso de 1 fi
# Inicialice matriz
for i in {0..23}; hacer horas [i] = 0; hecho
# Recopilar datos
for i in $ (stat -c% a "$ 1" / * | cort -c 12-13); hacer j = $ {i / #
0}
((++ Horas [j]))
((++ Recuento))
hecho
# Visualizacin de datos
echo -e "Hora \ tFiles \ Thour \ tFiles"
echo -e " --------- \ T ------ \ T ----- \ T ------- "
for i in {0..11}; hacer
j = $ ((i + 12))
printf "% 02d \ t% d \ t% 02d \ t% d \ n" $ i $ {horas [i]} $ j $ {horas [j]}
hecho
printf "\ archivos Ntotal =% d \ n", $ count
Acceso a los elementos de matriz
La secuencia de comandos consta de una funcin (uso) y un cuerpo principal con cuatro
secciones. En la primera seccin, comprobamos que no es un argumento de lnea de comandos
y que es un directorio. Si no es as, se muestra el mensaje de uso y de salida.
La segunda seccin inicializa las horas de matriz. Esto se hace mediante la asignacin de cada
elemento un valor de cero. No hay ningn requisito especial para preparar matrices antes de
su uso, pero nuestro script necesita para asegurarse de que ningn elemento est vaca. Tenga
en cuenta la forma interesante se construye el lazo. Mediante el empleo de la expansin de
llaves ({0..23}), que son capaces de generar fcilmente una secuencia de palabras para el para
el comando.
La siguiente seccin recoge los datos mediante la ejecucin del programa de estadsticas sobre
cada archivo en el directorio. Utilizamos corte para extraer la hora de dos dgitos del
resultado. Dentro del bucle, tenemos que quitar ceros a la izquierda del campo de la hora, ya
que el shell intentar (y en ltima instancia falla) para interpretar los valores "00" al "09" como
nmeros octales (ver Tabla 34-1). A continuacin, incrementamos el valor del elemento de
matriz correspondiente con la hora del da. Por ltimo, incrementamos un contador (recuento)
para realizar un seguimiento del nmero total de archivos en el directorio.
La ltima seccin de la secuencia de comandos muestra el contenido de la matriz. En primer
lugar, la produccin de un par de lneas de cabecera y luego entramos en un bucle que
produce dos columnas de salida. Por ltimo, la produccin de la cuenta final de los archivos.

481

[Me @ linuxbox ~] $ animales = ("un perro" "un gato" "un pez") [me @
linuxbox ~] $ for i in $ {animales [*]}; hacer eco $ i; hecho
un
perro
un
gato
un
pescado
[Me @ linuxbox ~] $ for i in $ {animales [@]}; hacer eco $ i; hecho
un
perro
un
gato
un
pescado
[Me @ linuxbox ~] $ for i in "$ {animales [*]}"; hacer eco $ i; hecho
un perro un gato un pescado
[Me @ linuxbox ~] $ for i in "$ {animales [@]}"; hacer eco $ i; hecho
un
perro
un
gato
un
pesca
do
35 - Matrices

Operaciones de matriz
Hay muchas operaciones de matriz comn. Cosas tales como la supresin de las matrices, la
determinacin de su tamao, la clasificacin, etc. tienen muchas aplicaciones en secuencias de
comandos.

Salida de todo el contenido del de una matriz


Los subndices * y @ pueden utilizarse para acceder a cada elemento de una matriz. Al igual
que con los parmetros de posicin, la notacin @ es el ms til de los dos. Aqu est una
demostracin:
Creamos los animales de la matriz y asignarle tres cuerdas de dos palabras. A continuacin,
ejecutamos cuatro bucles para ver el efecto de la palabra de divisin sobre el contenido de la
matriz. El comportamiento de las notaciones $ {animales [*]} y $ {animales [@]} es idntico
hasta que se citan. Los resultados de notacin * en una sola palabra que contiene el contenido
de la matriz, mientras que los resultados de notacin @ en tres palabras, que coincide con las
matrices de contenidos "reales".

Determinar el nmero de elementos de matriz


El uso de la expansin de parmetro, podemos determinar el nmero de elementos de una
matriz en mucho la misma manera que la bsqueda de la longitud de una cadena. He aqu un
ejemplo:

482

[Me @ linuxbox ~] $ a [100] = foo


[Me @ linuxbox ~] $ echo $ {# a [@]}
matriz
1
[Me @ linuxbox ~] $ echo $ {# a [100]}
3

# Nmero de elementos de la
# Longitud del elemento 100
Operaciones de matriz

Creamos un array y asignamos la cadena "foo" para el elemento 100. A continuacin, se utiliza
la expansin de parmetro para examinar la longitud de la matriz, usando la notacin @. Por
ltimo, nos fijamos en la longitud del elemento 100, que contiene la cadena "foo". Es
interesante notar que mientras que asignamos nuestra cadena de elemento 100, golpe slo
informa de un elemento de la matriz. Esto difiere del comportamiento de algunas otras
lenguas en las que los elementos no utilizados de la matriz (elementos 0-99) se inicializan con
valores vacos y contados.

Encontrar los subndices utilizados por una matriz


Como Bash permite matrices para contener "lagunas" en la asignacin de los subndices, a
[Me @ linuxbox ~] $ foo = ([2] = a [4] = b [6] = c)
[Me @ linuxbox ~] $ for i in "$ {foo [@]}"; hacer eco $ i; hecho
un
b
c
[Me @ linuxbox ~] $ for i in "$ {foo [@]!}"; hacer eco $ i; hecho
2
4
6
veces es til para determinar qu elementos de hecho existe. Esto se puede hacer con una
expansin de parmetro usando las siguientes formas:
$ {! Array [*]}
$ {! Array [@]}
donde la matriz es el nombre de una variable de matriz. Al igual que las otras expansiones que
utilizan * y @, la forma @ entre comillas es el ms til, ya que se expande en palabras
separadas:

Adicin de elementos al final de una matriz


Conocer el nmero de elementos de una matriz no es ninguna ayuda si necesitamos agregar
valores al final de una matriz, ya que los valores devueltos por el * y @ notaciones no nos
dicen el ndice mximo de la matriz en uso. Afortunadamente, el shell nos proporciona una
solucin. Al utilizar el operador = + asignacin, podemos aadir automticamente los valores
al final de una matriz. Aqu, asignamos tres valores a la matriz foo, y luego aadimos tres ms.
483

35 - Matrices

"
H
O
O
+
II
P.
C
D
-h

[Me @ linuxbox ~] $ foo = (a b c)


[Me @ linuxbox ~] $ echo $ {foo [@]}
abc
[Me @ linuxbox ~] $
[Me @ linuxbox ~] $ echo $ {foo [@]}
abcdef

Ordenacin de un conjunto
As como con hojas de clculo, a menudo es necesario para ordenar los valores en una
columna de datos. La cscara no tiene forma directa de hacer esto, pero no es difcil de hacer
con un poco de codificacin:
#! / Bin / bash
# Matriz de tipo: Ordenar una matriz
a = (f e d c b a)
[Me
linuxbox
~] $ array
echo @
"matriz
original
: $ {Atipo
[@]} "
original
matriz:
fedcba
a_sorted = ($ (for i in
"$ matriz
{A [@]}"; hacer eco $ i; hecho | sort))
ordenada:
abcdef
echo "matriz
ordenada:
$ {A_sorted [@]} "
Cuando se ejecuta, el script produce esto:
El script funciona copiando el contenido de la matriz original (a) en una segunda matriz
(a_sorted) con una pieza difcil de sustitucin de comandos. Esta tcnica bsica puede ser
utilizado para realizar muchos tipos de operaciones en la matriz cambiando el diseo de la
[Me @ linuxbox ~] $ foo = (abcdef) [me @
linuxbox ~] $ echo $ {foo [@]} abcdef
tubera.

Eliminacin de una matriz


Para eliminar una matriz, utilice el comando unset:
484

Operaciones de
matriz
[Me @ linuxbox ~] $ foo unset [me @
linuxbox ~] $ echo $ {foo [@]}
[Me @ linuxbox ~] $
unset tambin puede ser utilizado para eliminar los
elementos de matriz individuales:
[Me @ linuxbox ~] $ foo = (abcdef) [me @
linuxbox ~] $ echo $ {foo [@]} abcdef
[Me @ linuxbox ~] $ unset 'foo [2]' [me @
linuxbox ~] $ echo $ {foo [@]} abdef

En este ejemplo, borramos el tercer elemento de la matriz, el subndice 2. Recuerde, matrices


empezamos con subndice cero, no uno! Observe tambin que el elemento de la matriz debe
ser citado para evitar que el shell de realizar la expansin ruta.
Curiosamente, la asignacin de un valor vaco a un array no se vaca su contenido:

[Me @ linuxbox ~] $ foo = (abcdef) [me @


linuxbox ~] $ foo =
[Me @ linuxbox ~] $ echo $ {foo [@]} b c d e f

Cualquier referencia a una variable de matriz sin un subndice se refiere al elemento cero de
la matriz:
[Me @ linuxbox ~] $ foo = (abcdef) [me @
linuxbox ~] $ echo $ {foo [@]} abcdef
[Me @ linuxbox ~] $ foo = A [me @ linuxbox
~] $ echo $ {foo [@]}
ABCDEF

Las matrices asociativas


Las versiones recientes de fiesta ahora soportan matrices asociativas. Las matrices asociativas
utilizan cuerdas en lugar de nmeros enteros como los ndices de matriz. Esta capacidad
permite nuevos enfoques interesantes a la gestin de datos. Por ejemplo, podemos crear una
matriz llamada "colores" y el uso de nombres de colores como los ndices:
485

declarar colores -A colores


["rojo"] = colores "# FF0000"
["verde"] = "# 00ff00 colores"
["azul"] = "# 0000ff"
35 - Matrices
A diferencia de las matrices de enteros indexados, que se crean con slo hacer referencia a
ellos, matrices asociativas deben ser creados con el comando declarar utilizando la nueva
echo $ {colores ["azul"]}
opcin -A. Se accede a elementos de matriz asociativa o menos de la misma manera que los
enteros conjuntos indexados:
En el prximo captulo, vamos a ver un script que hace buen uso de matrices asociativas para
producir un informe interesante.

Resumiendo
Si buscamos la pgina del manual de bash para la palabra "serie", nos encontramos con
muchos casos de fiesta, donde hace uso de variables de matriz. La mayora de ellos son
bastante oscura, pero pueden proporcionar utilidad ocasional en algunas circunstancias
especiales. De hecho, todo el tema de las matrices es bastante infrautilizado en la
programacin de shell, debido en gran parte al hecho de que los programas tradicionales de
shell de Unix (como sh) carecan de apoyo para las matrices. Esta falta de popularidad es
lamentable, porque las matrices son ampliamente utilizados en otros lenguajes de
programacin y proporcionan una herramienta poderosa para resolver muchos tipos de
problemas de programacin.
Arrays y loops tienen una afinidad natural y se usan a menudo juntos. El
de ((expr; expr; expr))
forma de bucle es particularmente adecuado para el clculo de los subndices de matriz.

Lectura adicional
Un par de artculos de la Wikipedia acerca de las estructuras de datos que se encuentran
en este captulo: http://en.wikipedia.org/wiki/Scalar (informtica)
http://en.wikipedia.org/wiki/Associative matriz

486

36 - Exotica

36 - Exotica
En esto, el captulo final de nuestro viaje, vamos a ver algunas probabilidades y termina.
Aunque ciertamente hemos cubierto mucho terreno en los captulos anteriores, hay muchas
caractersticas de bash que no hemos cubierto. La mayora son bastante oscuro, y til sobre
todo para aquellos que la integracin de fiesta en una distribucin de Linux. Sin embargo, hay
unos pocos que, aunque no es de uso comn, son tiles para ciertos problemas de
programacin. Vamos a cubrir aqu.

Comandos Grupo Y subniveles


Bash permite comandos para agruparse. Esto se puede hacer en una de dos maneras; ya sea
con un comando de grupo o con un subnivel. Estos son ejemplos de la sintaxis de cada uno:
Grupo comando:
{Commandl; comando2; [Command3; ...]}
Subshell:
(Comando1; comando2; [command3; ...])
Las dos formas se diferencian en que un comando de grupo rodea a sus rdenes con los
apoyos y un subnivel utiliza parntesis. Es importante sealar que, debido a la forma Bash
implementa comandos de grupo, los tirantes deben estar separados de los comandos de un
espacio y el ltimo comando debe terminar con un punto y coma o ya sea un salto de lnea
antes de la llave de cierre.
Entonces, qu son los comandos de grupo y subniveles bueno para? Mientras que tienen una
ls -l> output.txt
echo "Listado de foo.txt" >> output.txt gato foo.txt
>> output.txt
diferencia importante (que vamos a llegar a en un momento), que son a la vez se utiliza para
gestionar la redireccin. Consideremos un segmento de secuencia de comandos que realiza
redirecciones en varios comandos:
Esto es bastante sencillo. Tres comandos con su salida redirigida a un archivo llamado
output.txt. El uso de un grupo de comandos, podramos codificar esto como sigue:
487

{ls -l; echo "Listado de foo.txt"; foo.txt gato; }> Output.txt


(ls -l; echo "Listado de foo.txt"; foo.txt gato)> Output.txt
36 - Exotica
Usando una subcapa es similar:
Usando esta tcnica hemos salvado a nosotros mismos un poco de mecanografa, pero donde
un comando de grupo o subcapa realmente brilla es con tuberas. Cuando se construye una
{ls -l; echo "Listado de foo.txt"; foo.txt gato; } | Lpr
tubera de comandos, a menudo es til para combinar los resultados de varios comandos en
una sola corriente. Comandos de Grupo y subniveles hacer esto fcil:
Aqu hemos combinado la salida de los tres rdenes y les hilo en la entrada de LPR para
producir un informe impreso.
En la secuencia de comandos que sigue, vamos a utilizar los comandos de grupos y mirar
varias tcnicas de programacin que se pueden emplear en combinacin con matrices
asociativas. Esta secuencia de comandos, llamado gama-2, cuando se le da el nombre de un
directorio, imprime una lista de los archivos en el directorio junto con los nombres del
propietario y el grupo propietario del archivo. Al final de la lista, el script imprime un
recuento de la cantidad de archivos que pertenecen a cada propietario y el grupo. Aqu vemos
los resultados (condensada por razones de brevedad) cuando la secuencia de comandos se da
el directorio / usr / bin:
[Me @ linuxbox ~] $ array-2 / usr / bin
/usr/bin/2to3-2.6
/ Usr / bin / 2to3
/ Usr / bin / a2p
/ Usr / bin / abrowser
/ Usr / bin / aconnect
/ Usr / bin / acpi_fakekey
/ Usr / bin / acpi_listen
/ Usr / bin / add-apt-repositorio

raz
raz
raz
raz
raz
raz
raz
raz

raz
raz
raz
raz
raz
raz
raz
raz

/ Usr / bin / zipgrep


/ Usr / bin / zipinfo
/ Usr / bin / zipnote
/ Usr / bin / zip

raz
raz
raz
raz

raz
raz
raz
raz

488

Comandos Grupo Y subniveles


/ Usr / bin / zipsplit
/ Usr / bin / zjsdecode
/ Usr / bin / zsoelim

raz
raz
raz

raz
raz
raz

Propietarios de archivos:
demonio
1 archivo (s)
raz
1394 archivo (s)
Grupo de
archivos
crontab
demonio
lpadmin
correo
mlocate
raz
sombra
ssh
tty
utmp

propietarios:
1 archivo (s)
1 archivo (s)
1 archivo (s)
4 archivo (s)
1 archivo (s)
1380 archivo (s)
2 archivo (s)
1 archivo (s)
2 archivo (s)
2 archivo (s)

Aqu est una lista (con los nmeros de lnea) de la secuencia de comandos:
1
2
3
4
5
3
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
489

#! / Bin / bash
# gama-2: Utilice matrices para anotar propietarios de archivos
declarar archivos -A file_group grupos file_owner propietarios
si
fi

[[! -d "$ 1"]]; entonces


echo "Uso: matriz de 2 dir"> & 2
salida 1

for i in / * "$!"; hacer


propietario = $ (stat -c% T "$ i")
grupo = $ (stat -c% G "$ i")
archivos ["$ i"] = "$ i"
file_owner ["$ i"] = $ propietario
file_group ["$ i"] = $ grupo
((++ Propietarios [$ propietario]))
((++ Grupos [$ grupo]))
hecho
# Enumerar los archivos recopilados
{ para i en "$ {archivos [@]}"; hacer
printf "% -40s% -10s% -10s \ n" \
"$ I" $ {file_owner ["$ i"]} $ {file_group ["$ i"]}
hecho} | sort

36 - Exotica
eco

]}

$ {grupos [

# Lista los grupos


echo "propietarios del grupo del archivo:"
{For i in "$ {grupos [@]}!"; hacer
printf "% -10s: archivo% 5d (s) \ n"
hecho} | sort

$
{propietario
s[

# propietarios de la lista
echo "dueos de archivos:"
{For i in "$ {propietarios [@]}!"; hacer
printf "% -10s: archivo% 5d (s) \ n"
hecho} | sort
eco

27
28
29
30
31
32
33
34
35
36
37
38
39
40

]}

Echemos un vistazo a la mecnica de este script:


Lnea 5: Asociativa matrices deben ser creados con el comando declarar utilizando la opcin
-A. En este script creamos cinco matrices de la siguiente manera:
archivos contiene los nombres de los archivos en el directorio, indexada por nombre de
archivo
file_group contiene el propietario del grupo de cada archivo, indexada por nombre de archivo
file_owner contiene el propietario de cada archivo, indexada por nombre de archivo
grupos contiene el nmero de archivos que pertenecen al grupo indexado
propietarios contiene el nmero de archivos que pertenecen al propietario indexada
Lneas 7-10: Comprueba que un nombre de directorio vlido se pasa como un parmetro
posicional. Si no, se muestra un mensaje de uso y el script finaliza con un estado de salida 1.
Lneas 12-20: Bucle a travs de los archivos en el directorio. Utilizando el comando stat, las
lneas 13 y 14 extraen los nombres del propietario y grupo propietario del archivo y asignar
los valores a sus respectivas matrices (lneas 16, 17) utilizando el nombre del archivo como el
ndice de matriz. Del mismo modo el propio nombre de archivo se le asigna a la matriz de
archivos (lnea 15).
Lneas 18-19: El nmero total de archivos que pertenecen al propietario del archivo y
propietario del grupo se incrementa en uno.
Lneas 22-27: La lista de archivos se emite. Esto se hace usando los "$ {array [@]}" de expansin
de parmetros que se expande en toda la lista de elemento de la matriz con cada elemento
tratado como una palabra separada. Esto permite la posibilidad de que un nombre de archivo
puede contener espacios incrustados. Tambin tenga en cuenta que todo el bucle est
encerrado entre llaves formando as un grupo de comandos. Esto permite que toda la
produccin del bucle que se canaliza en el comando sort. Esto es necesario debido a la
expansin de los elementos de la matriz no est ordenada.
Lneas 29-40: Estos dos bucles son similares al bucle lista de archivos, excepto que utilizan los
"$ {!

490

___________________________________________________ Comandos Grupo Y subniveles


array [@]} "de expansin que se expande en la lista de ndices de matriz en lugar de la lista de
elementos de la matriz.

Proceso de Sustitucin
Aunque parecen similares y pueden ser utilizadas para combinar corrientes para la
redireccin, hay una diferencia importante entre los comandos de grupo y subniveles.
Mientras que un grupo comando ejecuta todas sus comandos en el shell actual, un subnivel
(como su nombre indica) ejecuta sus comandos en una copia infantil de la shell actual. Esto
significa que el medio ambiente se copia y se le dio a una nueva instancia de la cscara.
Cuando los subshell salidas, se pierde la copia del medio ambiente, por lo que los cambios
realizados en el entorno del subshell (incluyendo la asignacin de variables) se pierde
tambin. Por lo tanto, en la mayora de los casos, a menos que una secuencia de comandos
requiere una subcapa, los comandos de grupo son preferibles a las subcapas. Comandos de
grupo son tanto ms rpido y requieren menos memoria.
Vimos un ejemplo del problema de medio ambiente subshell en el captulo 28, cuando
echo "foo" | ver echo
$ RESPUESTA
descubrimos que un comando de lectura en una tubera no funciona como cabra esperar
intuitivamente. En resumen, si se construye un oleoducto como esto:
El contenido de la variable de respuesta es siempre vaco porque el comando de lectura se
ejecuta en un subshell, y su copia de la respuesta se destruye cuando el subnivel termina.
Debido a que los comandos de tuberas siempre se ejecutan en subniveles, cualquier comando
que asigna las variables se encontrar con este problema. Afortunadamente, la cscara
proporciona una forma extica de expansin llamado proceso de sustitucin que se puede
utilizar para evitar este problema.
Proceso de sustitucin se expresa de dos formas:
Para los procesos que producen la salida estndar:
<(Lista)
o, para los procesos que la entrada estndar de admisin:
> (Lista)
donde lista es una lista de comandos.
Para resolver nuestro problema con la lectura, podemos emplear la sustitucin de proceso
leer <<(echo "foo") echo $
RESPUESTA
como ste:

491

36 - Exotica
Sustitucin de procesos nos permite tratar la salida de un subnivel como un archivo ordinario
[Me @ linuxbox ~] $ echo <(echo "foo") / dev
/ fd / 63
a los efectos de la redireccin. De hecho, ya que es una forma de expansin, podemos
examinar su valor real:
Mediante el uso de eco para ver el resultado de la expansin, vemos que la salida de la
subshell est siendo prestado por un archivo llamado / dev / fd / 63.
Proceso de sustitucin se utiliza a menudo con bucles que contienen lectura. He aqu un
ejemplo de un bucle de lectura que procesa el contenido de un anuncio en el directorio creado
por un subnivel:
#! / Bin / bash
# Pro-sub: demostracin de la sustitucin de proceso
mientras que los enlaces
attr lectura
cat << - EOF
Nombre del
archivo:
Tamao:
Propietario:
Grupo:
Modificado:
Enlaces:
Atributos:
EOF
hecho <<(ls -l | cola

grupo propietario de nombre de archivo de fecha y hora


tamao; hacer
$ Archivo
$ Tamao
$ Propietario
$ Grupo
$ Date $ tiempo
$ vnculos
$ Attr
-n 2)

El bucle se ejecuta leer para cada lnea de una lista de directorios. La lista en s se produce en la
lnea final de la secuencia de comandos. Esta lnea redirecciona la salida de la sustitucin de
proceso en la entrada estndar del bucle. El comando de la cola est incluido en la tubera de
sustitucin proceso para eliminar la primera lnea de la lista, que no es necesario.
Cuando se ejecuta, el script genera una salida como esta:
[Me @ linuxbox ~] $ pro_sub | cabeza -n 20
Nombre del addresses.ldif
archivo:
Tamao:
14540
Propietario: m
Grupo:
m
Modificado: 02.04.2009 11:12
492

Comandos Grupo Y subniveles


Enlaces:
Atributos:

1
-rw-r - r--

Nombre del
archivo:
Tamao:
Propietario:
Grupo:
Modificado:
Enlaces:
Atributos:

papelera
4096
m
m
2009-07-10 7:31
2
drwxr-xr-x

Nombre del
archivo:
Tamao:
Propietario:
Grupo:

bookmarks.html
394213
m
m

Trampas
En el captulo 10, vimos cmo los programas pueden responder a las seales. Podemos
agregar esta capacidad a nuestros scripts, tambin. Aunque las secuencias de comandos que
hemos escrito hasta ahora no han necesitado esta capacidad (debido a que tienen tiempos de
ejecucin muy cortos, y no crean archivos temporales), las secuencias de comandos ms
grandes y ms complicados pueden beneficiarse de tener una rutina de manejo de seales.
Cuando diseamos un gran guin complicado, es importante tener en cuenta lo que sucede si
el usuario cierra la sesin o se apaga el ordenador mientras el script se est ejecutando.
Cuando se produce un evento de este tipo, una seal ser enviada a todos los procesos
afectados. A su vez, los programas que representan esos procesos pueden realizar acciones
para garantizar una terminacin adecuada y ordenada del programa. Digamos, por ejemplo,
que hemos escrito un script que crea un archivo temporal durante su ejecucin. En el curso de
un buen diseo, tendramos el guin elimina el archivo cuando el script termine su trabajo.
Tambin sera buena idea tener el guin borrar el archivo si se recibe una seal que indica que
el programa iba a ser terminado antes de tiempo.
Bash proporciona un mecanismo para este propsito se conoce como una trampa. Las trampas
se implementan con el apropiado nombre de orden interna, trampa. trampa utiliza la
siguiente sintaxis:
#! / Bin / bash
# Trampa-demo: manejo de demostracin simple
seal
trampa seal argumento [seal ...]
donde el argumento es una cadena que ser ledo y entendido como un comando y la seal es
la especificacin de una seal que activar la ejecucin del comando interpretado.
Aqu est un ejemplo sencillo:
493

36 - Exotica

trampa "eco" Te estoy ignorando. '"SIGTERM SIGINT


for i in {1..5}; hacer
echo "$ i iteracin de 5" sueo
5
hecho

Este script define una trampa en la que se ejecutar un comando echo cada vez que sea la
SIGINT o seal SIGTERM se recibe mientras que el script se est ejecutando. La ejecucin del
programa se ve as cuando el usuario intenta detener la secuencia de comandos pulsando
Ctrl-C:
[Me @ linuxbox ~] $
trampa-demo Iteracin 1 de 5
Iteracin 2 de 5 te estoy
ignorando. Iteracin 3 de 5 te
estoy ignorando. Iteracin 4 de 5
Iteracin 5 de 5

Como podemos ver, cada vez que el usuario intenta interrumpir el programa, el mensaje se
imprime en su lugar.
La construccin de una cadena para formar una secuencia til de comandos puede ser difcil,
por lo que es prctica comn para especificar una funcin de shell como el comando. En este
ejemplo, se especifica una funcin de shell separada para cada seal para ser manipulados:

#! / Bin / bash
# Trampa-demo2: manejo de demostracin simple
seal
exit_on_signal_SIGINT () {
echo "Guin interrumpi." 2> & 1 salida
0
}
exit_on_signal_SIGTERM () {
echo "Guin terminado." 2> & 1 salida
0
}

trampa exit_on_signal_SIGINT SIGINT


trampa exit_on_signal_SIGTERM SIGTERM

494

Tram
pas
for i in {1..5}; hacer
echo "$ i iteracin de 5" sueo
5
hecho
Este script tiene dos comandos trampa, uno para cada seal. Cada trampa, a su vez, especifica
una funcin de shell que se ejecuta cuando se recibe la seal en particular. Tenga en cuenta la
inclusin de un comando de salida en cada una de las funciones de manipulacin de la seal.
Sin una salida, el script continuara despus de completar la funcin.
Cuando el usuario presiona CTRL-C durante la ejecucin de este script, los resultados se ven
as:

[Me @ linuxbox ~] $ trampa-demo2


Iteracin 1 de 5 Iteracin 2 de 5
Guin interrump.

Archivos temporales
Una de las razones manejadores de seales se incluyen en las escrituras es para
eliminar los archivos temporales que el guin puede crear para mantener los
resultados intermedios durante la ejecucin. Hay algo de un arte de nombrar los
archivos temporales. Tradicionalmente, los programas de Unix como sistemas crean
sus archivos temporales en el directorio / tmp, un directorio compartido destinado a
este tipo de archivos. Sin embargo, dado que el directorio es compartido, esto plantea
algunos problemas de seguridad, en particular para los programas que se ejecutan
con privilegios de superusuario. Aparte del paso obvio de establecer los permisos
adecuados para los archivos expuestos a todos los usuarios del sistema, es importante
dar a los archivos temporales de los nombres de archivo no predecibles. Esto evita un
exploit conocido como un ataque de raza temp. Una forma de crear una
no predecible (pero an descriptivo) llamo a hacer algo como esto:.. tempfile = / tmp
/ $ (basename $ 0) $$ $ RANDOM
Esto crear un nombre de archivo que consiste en el nombre del programa, seguido
por su ID de proceso (PID), seguido por un nmero entero aleatorio. Tenga en cuenta,
sin embargo, que el RAN $ - variable de shell DOM slo devuelve un valor en el rango
de 1 a 32.767, lo que no es una variedad muy grande en trminos informticos, por lo
que una sola instancia de la variable no es suficiente para superar un atacante
determinado .
495

Una mejor manera es utilizar el programa mktemp (que no debe confundirse con la
funcin de la biblioteca estndar mktemp) para el nombre y crear el archivo temporal.
El programa mktemp acepta una plantilla como argumento que se utiliza para
construir el nombre del archivo. La plantilla debe incluir una serie de caracteres "X",
que se reemplazan por un nmero correspondiente de letras y nmeros aleatorios.
Cuanto ms larga sea la serie de caracteres "X", el ms largo de la serie de caracteres
aleatorios.
He
aqu
un
ejemplo:
tempfile
=
$
(mktemp
/tmp/foobar.$$.XXXXXXXXXX)
Esto crea un archivo temporal y le asigna el nombre al archivo temporal variable. Los
caracteres "x" en la plantilla se sustituyen por letras y nmeros al azar para que el
nombre del archivo final (que, en este ejemplo, tambin incluye el valor expandido de
parmetro especial $$ para obtener el PID) podra ser algo como: / tmp
/foobar.6593.UOZuvM6654
Para los scripts que se ejecutan por los usuarios regulares, puede ser aconsejable evitar
el uso del directorio / tmp y crear un directorio para los archivos temporales en el
usuario de
directorio principal, con una lnea de cdigo como este:
[[-d $ HOME / tmp]] || mkdir $ HOME / tmp
36 - Exotica

Ejecucin asncrona
A veces es deseable realizar ms de una tarea al mismo tiempo. Hemos visto cmo todos los
sistemas operativos modernos son multitarea, al menos, si no multiusuario tambin. Los
scripts pueden ser construidos a comportarse de un modo multitarea.
Por lo general, esto implica el lanzamiento de un guin que, a su vez, pone en marcha una o
ms secuencias de comandos de los nios que realizan una tarea adicional, mientras que la
secuencia de comandos de los padres contina funcionando. Sin embargo, cuando una serie
de secuencias de comandos se ejecuta de esta manera, no puede haber problemas para
mantener el padre y el nio coordinada. Es decir, qu pasa si el padre o el nio depende de la
otra, y una secuencia de comandos deben esperar a que el otro para terminar su tarea antes de
terminar su propia?
Bash tiene una orden interna para ayudar a controlar la ejecucin asncrona como este. El
comando wait hace que una secuencia de comandos de los padres para hacer una pausa hasta
que un proceso especificado (es decir, la secuencia de comandos nio) termina.

esperar
Vamos a demostrar el comando de espera en primer lugar. Para ello, vamos a necesitar dos
guiones, un guin de los padres: 496

Ejecucin asncrona
#! / Bin /
bash
# Asncrono-padre: asncrono demostracin ejecucin (padre)
echo "Padres: a partir ..."
echo "Padres: el lanzamiento de la escritura de los
nios ..."
asncrono-nio y
pid = $!
echo "Padres: nio (PID = $ pid) puesto en marcha."
eco de Padres ": continuar ... sueo
2
eco de Padres ": haciendo una pausa para esperar a los nios a
terminar ... espera $ pid
echo "Padres:. nio est terminado Continua ... echo"
Padres: los padres se lleva a cabo. Salir ".
y una secuencia de comandos nio:
#! / Bin / bash
#
Asncrono-nio
echo "Nio:
sueo 5
echo "Nio:

: Demo ejecucin asncrona (nio)


nio est funcionando ... "
nio se hace. Salir ".

En este ejemplo, vemos que el guin nio es muy simple. La verdadera accin est siendo
realizado por el padre. En el guin de los padres, el guin nio se lanz y puso en el fondo. El
ID de proceso de la escritura de nio se registra mediante la asignacin de la variable pid con
el valor de los $! parmetro de shell, que siempre contendr el ID de proceso del ltimo
trabajo de poner en el fondo.

El guin de los padres contina y luego ejecuta un comando de espera con el PID del proceso
hijo. Esto hace que el guin principal para hacer una pausa hasta que el script nio sale,
momento en el que la secuencia de comandos padres concluye.
Cuando se ejecuta, los scripts de padre e hijo producen el siguiente resultado:

[Me @ linuxbox ~] Padres


asncrono-padre: a partir ...

497

Padres: el lanzamiento de la escritura de nio ...


Padres: nio (PID = 6741) puesto en marcha.
Padres: continuar ...
Nio: Nio est ejecutando ...
Padres: hacer una pausa para esperar a los nios a terminar
... Nio: Nio que se hace. Cmo salir.
Padres: nio est terminado. Continuando ... Padres: los
padres se lleva a cabo. Cmo salir.
36 - Exotica

Canalizaciones con nombre


En la mayora de los sistemas tipo Unix, es posible crear un tipo especial de archivo llamado
una canalizacin con nombre. Las canalizaciones con nombre se utilizan para crear una
conexin entre dos procesos y se puede utilizar igual que otros tipos de archivos. Ellos no son
tan populares, pero que son buenos para conocer.
Hay una arquitectura de programacin comn llamado cliente-servidor, que puede hacer uso
de un mtodo de comunicacin tales como canalizaciones con nombre, as como otros tipos de
comunicacin entre procesos, tales como conexiones de red.
El tipo ms ampliamente utilizado de sistema cliente-servidor es, por supuesto, un navegador
web que comunica con un servidor web. El navegador web acta como el cliente, haciendo
peticiones al servidor y el servidor responde al navegador con las pginas web.
Las canalizaciones con nombre se comportan como archivos, pero en realidad forman (FIFO)
tampones primero en entrar, primero en salir. Al igual que con los tubos ordinarios (sin
nombre), los datos va en un extremo y sale por el otro. Con canalizaciones con nombre, es
posible crear algo como esto:
processl> named_pipe
y
process2 <named_pipe y se
comportar como si: processl |

[Me @ linuxbox ~] $ mkfifo pipel [me @ linuxbox ~] $ ls -l pipel


PRW-r - r-- m me 1 0 2009-07-17 6:41 pipel
process2

Configuracin de una canalizacin con nombre


En primer lugar, debemos crear una canalizacin con nombre. Esto se hace usando el comando
mkfifo:

498

Canalizaciones con nombre


Aqu usamos mkfifo para crear una canalizacin con nombre llamado pipel. Usando ls, que
examinan el archivo y ver que la primera letra en el campo de atributos es "p", que indica que
es una canalizacin con nombre.

El uso de canalizaciones con nombre


Para demostrar cmo funciona la canalizacin con nombre, vamos a necesitar dos ventanas de
[Me @ linuxbox ~] $ ls -l> pipel
terminal (o, alternativamente, dos consolas virtuales). En el primer terminal, entramos en un
simple comando y redirigir su salida a la canalizacin con nombre:

Despus pulsamos la tecla Intro, el comando aparecer para colgar. Esto es porque no hay
nada recibir datos desde el otro extremo de la tubera todava. Cuando esto ocurre, se dice que
el tubo est bloqueado. Esta condicin se borrar una vez que concedemos un proceso para el
[Me @ linuxbox ~] $ cat <pipel
otro extremo y se comienza a leer la entrada de la tubera. El uso de la segunda ventana de
terminal, entramos en este comando:
y el listado del directorio producido a partir de la primera ventana de terminal aparece en el
segundo terminal como la salida del comando cat. El comando ls en el primer terminal se
completa con xito una vez que ya no se bloquea.

Resumiendo
Bueno, hemos completado nuestra j ourney. El nico que queda por hacer ahora es prctica,
prctica, prctica. A pesar de que hemos cubierto mucho terreno en nuestra caminata, apenas
araado la superficie en cuanto a la lnea de comandos va. Todava hay miles de programas de
lnea de comandos que quedan por descubrir y disfrutar. Empezar a cavar alrededor en / usr /
bin y vers!

Lectura adicional

La seccin "Comandos de compuestos" de la pgina de manual de bash contiene una


descripcin completa de los comandos de grupo y notaciones subshell.

La seccin de expansin de la pgina de manual de bash contiene una subseccin de la


sustitucin de procesos.
499

36 - Exotica
El Bash-Scripting Gua avanzada tambin tiene una discusin de la sustitucin de
proceso: http://tldp.org/LDP/abs/html/process-sub.html
Linux Journal tiene dos buenos artculos sobre canalizaciones con nombre. El primero,
de septiembre de 1997:
http://www.linuxjournal.com/article/2156
y el segundo, a partir de marzo de 2009:
http://www.linuxjournal.com/content/using-named-pipes-fifos-bash

500

ndice

ndice

La
comando a2ps .....................................................................333
nombres de ruta absolutos ...................................................9
comando alias .............................................................. 50, 126
alias ..................................................................... 42, 50, 124
American National Standards Institute (ANSI ver)
........................................................................................... 160
Cdigo Estndar Americano para la Informacin
Intercambio (ver ASCII) .....................................................17
anclas ...................................................................................247
servidores FTP annimo ...................................................200
ANSI ....................................................................................160
Cdigos de escape ANSI ......................................... 160, 164
ANSI.sys .............................................................................160
Servidor web Apache ........................................................118
comando apropos.................................................................47
comando apt-cache ............................................................169
comando apt-get............................................................. 168p.
de rdenes de aptitude .....................................................168
archivado.............................................................................230
expansin aritmtica .................... 70, 75, 367, 456, 464
expresiones aritmticas........................ 70, 453, 464, 467
operadores aritmticos............................................... 70, 465
las pruebas de la verdad de aritmtica .................. 391, 464
matrices ....................................................................................
aadir valores al final ...............................................483
la asignacin de valores ............................................479
de asociacin...................................................... 485, 488
la creacin de ..............................................................478
borrado ........................................................................484
determinar el nmero de elementos .......................482
encontrar subndices usados ....................................483
ndice ...........................................................................478
multidimensional ......................................................478
Variables de lectura en .............................................400
clasificacin ................................................................484
subndice .....................................................................478
bidimensional ............................................................478

ASCII .....................................77, 81, 221, 251, 263, 333


carcter campana ........................................................ 157
retorno de carro .......................................................... 267
Para el cotejo............................................ 251, 253, 387
cdigos de control................................... 77, 251, 327
Controlador de salida de Groff ............................... 320
carcter de salto de lnea........................................... 267
carcter nulo ............................................................... 221
caracteres imprimibles .............................................. 251
texto................................................................................ 17
comando aspell .................................................................. 299
ensamblador ....................................................................... 341
lenguaje ensamblador ...................................................... 341
operadores de asignacin ................................................. 467
matrices asociativas .......................................................... 485,488
ejecucin asncrona ........................................................... 496
CD de audio ...................................................................... 180,191
Lenguaje de programacin AWK .................................. 299,473

B
referencias anteriores..................................... 263, 294p.
secuencias de escape de barra invertida .......................... 78
caracteres especiales escapados....................................... 156
copias de seguridad, incrementales................................ 234
comando nombre base ...................................................... 440
Bash ................................................................................ 2, 124
pgina de manual ........................................................ 48
expresiones bsica regular 254, 262p., 292, 296, 306
comando bc......................................................................... 473
Berkeley Software Distribution ...................................... 331
comando bg ........................................................................ 116
binario ...................................................... 93, 97, 341, 465
mscara de bits..................................................................... 96
operadores de bits ............................................................. 469
Bourne, Steve ................................................................ 2, 6
expansin de llaves ........................................ 71, 75, 451
derivacin ........................................................................... 381

501

ndice
comando break .................................................... 412, 445
enlaces rotos ......................................................................... 39
Estilo BSD .......................................................................... 111
buffering............................................................................. 182
bichos .................................................................... 422, 424
construir entorno ............................................................... 346
comando bzip2................................................................... 229

C
Lenguaje de programacin C,
C ++ .........................................
comando cal............................
comando cancel .....................

341, 453, 468, 471


.............................. 341
...................................4
.............................. 338
retorno de carro. 0.18, 77P., 157, 251p., 266, 298, 330
comando compuesto caso................................................. 429
conversin caso.................................................................. 462
comando cat.................................................................. 57, 266
comando cd .................................................................. 9, 11
CD-ROM .............................................................. 179p., 191
comando cdrecord ............................................................. 192
cdrtools192 clases de personajes ... 26P., 248, 250p., 253,
257, 289, 299
rangos de caracteres ..................................... 27, 249P., 299
comando chgrp .................................................................. 103
proceso hijo ........................................................................ 108
comando chmod ........................................... 92, 105, 356
comando chown........................................................ 102, 105
Cromo.................................................................................. 361
clasificacin cronolgica .................................................. 273
cleartext ...................................................................... 200, 202
arquitectura cliente-servidor ........................................... 498
Lenguaje de programacin COBOL ............................... 341
Para el cotejo .......................... 126, 251, 253, 289, 387
ASCII ................................................................. 253, 387
diccionario ................................................................. 251
tradicional.................................................................. 253
comando comm.................................................................. 284
historial de comandos ................................................ 3, 83
lnea de comandos.................................................................
argumentos ................................................................ 436
edicin ........................................................................... 3, 79
expansin ..................................................................... 67
historia .......................................................................... 3, 84
las interfaces............................................................ xvii, 28
opciones de comandos........................................................ 14
sustitucin de comandos.................................... 73, 75, 451
comandos ................................................................................
argumentos .......................................................... 14, 436
Tipo
de
determinar
......................................................................................... 4
3

documentacin ............................................................ 44
archivos de programas ejecutables ..........................42,341
ejecutar como otro usuario ........................................ 99
opciones largas ............................................................ 14
Opciones ...................................................................... 14
comentarios .............................. 128, 134, 298, 355, 424
Sistema de Impresin Comn de Unix .........................329,339
operadores de comparacin .............................................470
compilador ..........................................................................341
compilar ..............................................................................340
terminaciones ...................................................................... 81
comandos compuestos ...........................................................
caso ...............................................................................429
para...............................................................................450
si ...................................................................................381
hasta .............................................................................413
mientras .......................................................................410
(()) .............................................................. 391, 406, 464
[[]] ................................................................................389,406
algoritmos de compresin ................................................227
expresiones condicionales...............................................396,420
los archivos de configuracin ....................... 18, 21, 124
comando configurar ..........................................................346
constantes............................................................................366
comando continuar ............................................................412
los caracteres de control...................................................157,266
cdigos de control...............................................................77,251
operadores de control ............................................................
&& ...............................................................................394,406
||..................................................................................394
terminal de control ............................................................109
COPIA .................................................................................344
copiar y pegar ..........................................................................
en vim ..........................................................................145
en la lnea de comandos ............................................ 80
con X Window System ................................................. 3
paquete coreutils .................................. 45, 48p., 279, 303
contando las palabras en un archivo ............................... 62
comando cp ............................................ 28, 35, 131, 207
UPC ................................................................................. 108P.,340
cron trabajo .........................................................................211
crucigramas.........................................................................247
comando csplit ...................................................................304
CUPS...................................................................................329,339
directorio de trabajo actual ................................................. 8
el movimiento del cursor .................................................. 79
comando de corte ..............................................................276,461

programas demonio .............................................. 108, 118

502

ndice
compresin de datos ......................................................... 226
redundancia de datos ........................................................ 226
la validacin de datos ....................................................... 389
comando date ......................................................................... 4
formatos de fecha .............................................................. 273
comando dd ........................................................................ 190
Debian ................................................................................. 166
Estilo Debian (.deb) .......................................................... 167
depuracin ................................................................ 377, 424
comando declarar .............................................................. 463
programacin defensiva ......................................... 420, 424
delimitadores ................................................... 76, 271, 274
dependencias............................................................ 168, 349
diseo .............................................................................. 422P.
controladores de dispositivo ................................. 174, 341
nombres de dispositivo .................................................... 182
nodos de dispositivos ......................................................... 20
comando df ................................................................. 4, 379
diccin ................................................................................. 342
cotejo fin diccionario ........................................................ 251
comando diff ...................................................................... 284
Restricciones de gestin digital (DRM) ......................... 168
directorios ................................................................................
archivado ..................................................................... 230
cambio ............................................................................. 9
copia ............................................................................... 28
la creacin de ...................................................... 28, 34
de trabajo actual ............................................................. 8
borrado ................................................................ 31, 39
jerrquica ........................................................................ 7
casa ............................................................. 21, 90, 379
listado ............................................................................ 13
en movimiento ................................................... 30, 36
navegar ............................................................................ 7
Variable de OLD_PWD ............................................ 126
padre ................................................................................ 8
Variable PATH........................................................... 126
Variable de las personas con discapacidad ........... 127
eliminacin ......................................................... 31, 39
el cambio de nombre ......................................... 30, 36
raz.................................................................................... 7
compartido .................................................................. 103
sticky bit........................................................................ 98
sincronizacin ............................................................ 238
transferir travs de una red ...................................... 238
visualizacin de contenidos ......................................... 8
particiones de disco ........................................................... 177
Variable DISPLAY ............................................................ 126
Delfn .................................................................................... 27
comando dos2unix............................................................. 267
comillas dobles .................................................................... 75

comando dpkg ................................................................. 168


comando du ............................................................ 269, 379
Protocolo de configuracin dinmica de host (DHCP) 199

E
comando echo ........................
opcin -e ..........................
opcin -n .........................
casos de borde y esquina......
La variable EDITOR .............
ID de grupo efectivo .............
ID de usuario efectivo ..........
declaracin elif ......................
correo electrnico ..................
sistemas embebidos ..............
las variables vacas ................
tneles cifrados......................
cifrado .....................................
final del archivo.....................
bucle sin fin............................
comando enscript ..................
medio ambiente .....................
alias ..................................
el establecimiento de ....
el examen ........................
shell de entrada..............
funciones de shell..........
variables de shell ...........
archivos de inicio...........
subniveles .......................
las variables ....................
comando de la ecuacin .......
archivos ejecutables ..............
archivos
de
programas
ejecutables ..
programas ejecutables ..........
la determinacin de la
ubicacin ...
Variable PATH ..............
comando exit ..........................
estado de salida .....................
comando ampliar ...................
expansiones ............................
aritmtica ........................
abrazadera.......................
sustitucin
de
comandos.
delimitadores .................
errores resultantes de ...
historia ............................
parmetro ........................
nombre de ruta ...............
tilde ..................................

67, 125, 362


.................... 78
................. 398
.................. 423
................ 126
.................... 98
......... 98, 109
................. 388
................. 265
................. 341
.................. 457
................ 206
................. 290
......... 59, 369
................. 413
..................336
99, 124, 404
.................. 124
................. 127
..................124
..................127
.................. 124
..................124
..................127
................. 491
.................. 124
................. 318
.................. 347
.........42, 341
..................................... 43
..................................126
...................5, 386, 407
........................ 382, 386
................................... 279
..................................... 67
70, 75, 367, 456, 464
................... 71, 75, 451
................... 73, 75, 451
..................................... 76
................................... 418
............................ 84, 86
72, 75, 365, 371, 456
................... 68, 75, 451
............................ 69, 75

503

ndice
palabra-divisin ....................................................... 74P.
expresiones ..............................................................................
aritmtica .............................. 70, 453, 464, 467, 479
condicional .......................................................... 396, 420
ext3....................................................................................... 188
expresiones regulares extendidas ................................... 254
Lenguaje de marcado extensible .................................... 265

F
falsa comando .................................................................... 383
comando fdformat............................................................. 190
comando fdisk ................................................................... 185
comando fg ......................................................................... 116
FIFO ..................................................................................... 498
comando de archivo ............................................................ 17
descriptor de archivo .......................................................... 56
la corrupcin del sistema de archivos ............................ 182
Protocolo de transferencia de archivos (FTP) ............... 199
los nombres de archivo .................................................... 221
distingue maysculas y minsculas......................... 11
espacios incrustados en ....................................... 12, 260
extensiones ................................................................... 12
oculto ............................................................................. 11
archivos ....................................................................................
acceso............................................................................. 89
archivado ............................................................. 230, 236
atributos ........................................................................ 90
bloque especial ............................................................ 91
bloquear el dispositivo especial ............................. 212
cambiar el modo de archivo....................................... 92
el cambio de dueo y propietario del grupo......... 102
especial carcter ........................................................... 91
dispositivo especial de caracteres ........................... 212
compresin ................................................................. 226
configuracin ............................................ 18, 124, 264
copia ....................................................................... 28, 34
copia travs de una red ............................................. 199
la creacin de vaco ..................................................... 55
debutante .................................................................... 166
borrado ....................................................... 31, 39, 218
la determinacin de contenidos ................................ 17
nodos de dispositivos ................................................. 20
acceso de ejecucin ..................................................... 90
expresiones ................................................................. 384
descubrimiento .......................................................... 209
oculto ............................................................................. 11
imagen ISO.............................................................. 191p.
listado ....................................................................... 8, 13
modo .............................................................................. 91
en movimiento ...................................................... 30, 35

propietario .................................................................... 92
Permisos ....................................................................... 89
acceso de lectura .......................................................... 90
regular ......................................................................... 212
eliminacin ......................................................... 31, 39
el cambio de nombre ......................................... 30, 35
rpm .............................................................................. 166
biblioteca compartida ................................................. 21
inicio............................................................................ 127
sticky bit ....................................................................... 98
enlaces simblicos .................................................... 212
sincronizacin ............................................................ 238
temporal ...................................................................... 495
texto ............................................................................... 17
transferir travs de una red ................ 199, 235, 238
truncando...................................................................... 55
tipo ................................................................................. 90
visualizacin de contenidos ...................................... 17
acceso de escritura ....................................................... 90
filtros ..................................................................................... 61
comando Buscar ............................................................... 211,234
paquete findutils............................................................... 225
Firefox ................................................................................. 361
cortafuegos ......................................................................... 196
primero en entrar, primero en salir ................................ 498
disquetes ....................................................... 176, 183, 189
control de flujo ........................................................................
derivacin ................................................................... 381
comando compuesto caso......................................... 429
declaracin elif .......................................................... 388
bucle sin fin ............................................................... 413
para el comando compuesto .................................... 450
bucle for ...................................................................... 450
sentencia de funcin ................................................. 374
si el comando compuesto ......................................... 381
looping ........................................................................ 409
por mens ................................................................... 406
las decisiones de seleccin mltiple ...................... 429
mientras que con la lectura de archivos y hasta
bucles ......................................................................... 414
terminacin de un bucle .......................................... 412
trampas ....................................................................... 493
hasta bucle .................................................................. 413
while............................................................................ 410
comando fmt ...................................................................... 309
poltica de enfoque ............................................................... 4
comando veces ................................................................... 309
para el comando compuesto ............................................ 450
bucle for.............................................................................. 450
Previsin............................................................................. 166
Lenguaje de programacin Fortran ............................... 341,453
comando gratis ..................................................................... 5,181

504

ndice
Free Software Foundation.
comando fsck..........................
comando ftp ............................
Servidores FTP .......................
Variable de FUNCNAME.....
sentencia de funcin .............

.................... xix, xxi


.............................. 189
199, 207, 342, 370
.................. 200, 370
.............................. 441
.............................. 374

G
gcc........................................................................................ 342
comando gedit .................................................................. 114,131
comando genisoimage ..................................................... 191
Gentoo ................................................................................ 166
comando getopts ............................................................... 449
Ghostscript ........................................................................ 329
gid ......................................................................................... 89
variables globales ............................................................. 376
globbing ............................................................................... 26
GNOME .................................. 2, 27, 40, 95, 131, 208
gnome-terminal..................................................................... 2
Paquete binutils de GNU ................................................ 452
GNU C Compiler .............................................................. 342
Paquete coreutils GNU ...................... 45, 48p., 279, 303
Paquete findutils GNU .................................................... 225
Proyecto GNU ........... 14, XIX, XXI, 225, 303, 342, 344
comando info ............................................................... 48
GNU / Linux ...................................................................... xix,xxi
interfaces grficas de usuario ........................................ xvii
comando grep ................................................. 62, 243, 403
Groff ................................................................................... 318
comandos de grupo .......................................................... 487
grupos ................................................................................... 89
ID de grupo efectivo................................................... 98
gid.................................................................................. 89
grupo primario de identificacin ............................. 89
setgid............................................................................. 98
Interfaz grfica de usuario ... 3, xvii, 27, 40, 79, 95, 127
comando gunzip ............................................................... 227
comando gzip ..................................................................... 50,227

H
discos duros ....................................................................... 176
enlaces duros ....................................................... 24, 33, 37
la creacin de ............................................................... 37
listado ........................................................................... 38
comando de la cabeza ........................................................ 63
archivos de cabecera ......................................................... 345
Hola mundo ....................................................................... 355
comando de ayuda .............................................................. 44
aqu documentos .............................................................. 369

aqu cuerdas ....................................................................... 404


hexadecimal ................................................................ 93, 465
archivos ocultos.......................................................... 11, 69
estructura jerrquica de directorios ................................... 7
lenguajes de programacin de alto nivel ...................... 341
historia ......................................................................................
expansin ............................................................ 84, 86
bsqueda ..................................................................... 84
comando de la historia ....................................................... 84
directorios de inicio ............................................................ 21
cuenta de root .............................................................. 22
/ Etc / passwd ............................................................... 90
directorio de inicio ............................ 8, 11, 69, 100, 126
INICIO variables .............................................................. 126
nombre de host.................................................................. 157
HTML .............................. 265, 299, 319, 361, 371, 373
Hypertext Markup Language.......................................... 265

Yo
E / S de redireccin (ver redireccin) ............................... 53
comando id .......................................................................... 89
IDE ...................................................................................... 183
si el comando compuesto ........................... 129, 418, 429
La variable IFS .................................................................. 402
IMCP ECHO_REQUEST ................................................. 196
Las copias de seguridad incrementales ......................... 234
archivos de informacin .................................................... 49
init ....................................................................................... 108
scripts de inicio ................................................................. 108
inodos ................................................................................... 37
INSTALAR ........................................................................ 344
asistente de instalacin .................................................... 167
enteros ......................................................................................
aritmtica .................................................................... 70,473
divisin ....................................................................... 71,466
expresiones ................................................................ 388
interactividad .................................................................... 397
El campo interno Separador ............................................ 402
lenguajes interpretados ................................................... 341
programas interpretados.................................................. 342
intrprete ............................................................................ 341
imgenes ISO ................................................................. 191p.
iso9660 ............................................................................... 180,192

J
el control de trabajos ........................................................ 115
el nmero de empleos ...................................................... 115
espectrab ............................................................................ 116
comando unirse ................................................................. 281

505

ndice
Extensiones Joliet .......................................................... 192
Alegra, Bill .................................................................... 137

K
comando kate ................................................................. 131
KDE .............................................. 2, 27, 40, 95, 131, 208
comando kedit ............................................................... 131
kernel ... xvi, xixp., 46, 108, 118, 174, 183, 287, 350
campos clave ...................................................................... 271
comando matar .................................................................. 117
comando killall.................................................................. 120
texto matanza ....................................................................... 80
Knuth, Donald ................................................................... 318
Konqueror ......................................................... 27, 95, 208
Konsole ................................................................................... 2
comando kwrite ..................................................... 114, 131

L
Variable LANG ...........................................126, 251, 253
comando less .......................................... 17, 60, 238, 261
comando lftp ...................................................................... 202
bibliotecas .......................................................................... 341
LibreOffice Escritor ........................................................... xxi
carcter de continuacin de lnea ................................... 359
editores de lnea ................................................................ 137
carcter de continuacin de lnea ................................... 298
enlazador ............................................................................ 341
enlace .................................................................................. 341
enlaces ......................................................................................
roto ................................................................................. 39
la creacin de................................................................ 33
duro.......................................................................... 24, 33
simblico ................................................................ 23, 34
Comunidad Linux ............................................................. 166
Distribuciones de Linux .................................................. 166
CentOS ............................................................... 167, 336
Debian ............................................................. 166p., 340
Fedora .............................................. xix, 89, 167, 336
Previsin ..................................................................... 166
Gentoo......................................................................... 166
Linspire ....................................................................... 167
Mandriva .................................................................... 167
OpenSUSE .......................................................... xix, 167
sistemas de envasado................................................ 166
PCLinuxOS................................................................. 167
Red Hat Enterprise Linux ........................................ 167
Slackware ................................................................... 166
Ubuntu ..................................................xix, 166p., 336
Xandros ....................................................................... 167

Linux Filesystem Hierarchy Standard .. .19, 24, 358


Kernel de Linux ... xvi, xixp., 46, 108, 118, 174, 183,
287, 350
controladores de dispositivo
.................. 174
...........................................
caracteres
literales..................
.................. 245
CD en vivo ..............................
.................. xix
comando ln .............................
variables locales .....................

............. 33, 37
.................. 376

lugar .......................................... .......... 251, 253, 289, 387


comando locale .......................
................. 253
localhost ..................................
.................. 203
comando locate .......................

........ 209, 261

errores lgicos ........................


operaciones lgicas ................
operadores lgicos ..................
relaciones lgicas ...................
smbolo de login .....................

.................. 420
.................. 392
.................. 214
........ 214, 218
............. 5, 201

shell de entrada .......................


opciones largas .......................
interfaz de bucle de retorno ..
looping ....................................

... 90, 99, 127


.................... 14
.................. 199
.................. 409

bucles ....................................... ..420, 466, 469, 486, 492


la compresin sin prdidas ..
.................. 227
compresin con prdida .......
minsculas
a
la
conversin
en
maysculas...................................................
comando lp .............................
comando lpq ...........................
comando lpr ............................
comando lprm ........................
comando lpstat .......................
comando ls ..............................
formato largo ...................
archivo de ver los atributos
de
..
Lukyanov,
Alexander ............
LVM (Logical Volume Manager) ..............

.................. 227
.................. 463
.................. 332
.................. 337
.................. 331
................. 338
.................. 336
................ 8, 13
................... 16
.....................90
................. 202
........ 176, 179

M
lenguaje mquina ......................
mantenimiento ...........................
hacer de comandos.....................
Makefile ......................................
comando man .............................
pginas man ................................
lenguajes de marcas ...................
memoria .......................................
asignado a cada proceso de
mostrando gratis.................
Residente Set Tamao .......
violacin de segmentacin
... uso.....................................

.............................. 340
358, 362, 364, 372
............................... 347
............................... 347
................................ 45
..................... 45, 319
................... 265, 319
109
... 5
111
119
111

506

ndice
el uso de la visualizacin ......................................... 121
virtual .......................................................................... 111
programas basadas en mens .......................................... 406
tecla meta .............................................................................. 81
secuencias de meta ............................................................ 246
metacaracteres .................................................................... 246
metadatos ...................................................................167, 169
comando mkdir ..........................................................28, 34
comando mkfifo ................................................................ 498
comando mkfs ...........................................................188, 190
comando mkisofs .............................................................. 192
comando mktemp .............................................................. 496
nemotcnica ........................................................................ 341
editor modal ....................................................................... 139
fuentes de monoespaciado ............................................... 329
Moolenaar, Bram ............................................................... 137
comando more ...................................................................... 19
comando mount ........................................................178, 192
puntos de montaje .......................................... 21, 178, 180
montaje................................................................................ 177
MP3 ...................................................................................... 104
sistemas multiusuario......................................................... 88
las decisiones de seleccin mltiple .............................. 429
multitarea......................................................... 88, 108, 496
comando mv ...............................................................30, 35

N
canalizaciones con nombre .............................................. 498
comando nano .................................................................... 136
Nautilo ............................................................. 27, 95, 208
comando netstat ................................................................. 198
la creacin de redes ........................................................... 195
servidores FTP annimo ........................................... 200
ruta por defecto .......................................................... 199
Protocolo de configuracin dinmica de host
(DHCP)
...................................................................................... 199
tneles cifrados .......................................................... 206
examinar los ajustes y estadsticas de la red ....... 198
Protocolo de transferencia de archivos (FTP)........ 199
cortafuegos.................................................................. 196
Servidores FTP ........................................................... 200
Red de rea local ........................................................ 199
interfaz de bucle de retorno ..................................... 199
hombre en los ataques medios ................................ 203
routers .......................................................................... 198
comunicacin segura con hosts remotos .... 203
probar si un host est vivo ....................................... 196
trazando la ruta a un host ......................................... 197
la transferencia de archivos ..................................... 238
transportar archivos................................................... 199

Red Privada Virtual .................................................. 206


carcter de nueva lnea ..................................................... 157
saltos de lnea....................................................................... 76
NOTICIAS.......................................................................... 344
comando nl ......................................................................... 305
comando nroff.................................................................... 318
carcter nulo ....................................................................... 221
bases numricas ................................................................. 465

O
octal................................................................... 93, 465, 481
Ogg Vorbis ......................................................................... 104
Variable de OLD_PWD .................................................... 126
OpenOffice.org Writer ........................................... 18, XXP.
OpenSSH ............................................................................ 203
operadores ...............................................................................
aritmtica .......................................................... 70, 465
asignacin ................................................................... 467
binario ......................................................................... 419
comparacin ............................................................... 470
ternario ........................................................................ 471
poseer archivos .................................................................... 89

P
archivos de paquetes......................................................... 167
mantenedores de paquetes .............................................. 167
gestin de paquetes .......................................................... 166
debutante .................................................................... 166
Estilo Debian (.deb) .................................................. 167
paquetes hallazgo ...................................................... 169
herramientas de alto nivel ....................................... 168
Instalacin de paquetes ............................................ 169
herramientas de bajo nivel ...................................... 168
repositorios de paquetes .......................................... 167
Red Hat Estilo (.rpm) ................................................ 167
la eliminacin de los paquetes ................................ 170
RPM ............................................................................. 166
paquetes de actualizacin ........................................ 171
sistemas de envasado........................................................ 166
pgina de descripcin del lenguaje ............. 265, 320, 328
La variable PAGER ........................................................... 126
buscapersonas ...................................................................... 19
expansin de parmetro ................................ 72, 75, 456
directorio padre ..................................................................... 8
proceso padre ..................................................................... 108
comando passwd ............................................................... 106
contraseas ......................................................................... 106
comando pegar................................................................... 280
PATA ................................................................................... 183

507

ndice
comando patch ................................................................ 287
parches ............................................................................. 285
Variable PATH ................................. 126, 129, 356, 374
expansin ruta .................................................. 68, 75, 451
nombres de ruta................................................................. 260
absoluto........................................................................... 9
terminacin .................................................................. 81
relativo ............................................................................ 9
PDF ..................................................................................... 321,331
Programacin Perl language.42, 243, 299, 341, 473
Permisos ............................................................................. 354
Lenguaje de programacin PHP ..................................... 341
comando ping .................................................................... 196
tuberas ........................................................ 60, 404, 491
en sustitucin de comandos ...................................... 73
portabilidad ................................................ 346, 380, 394
porttil................................................................................. 380
Formato de documento porttil ..................................... 321,331
Interfaz de sistema operativo porttil............................ 255
parmetros posicionales............................ 436, 457p., 460
POSIX................................................. 192, 251, 254p., 394
clases de personajes .. 26P., 250p., 253, 257, 289,
299
PostScript................................... 265, 320, 328, 333, 338
comando pr........................................................................ 313,329
grupo primario de identificacin ..................................... 89
caracteres imprimibles ..................................................... 251
comando printenv .............................................................. 73,124
buffers de impresora ........................................................ 181
impresoras ......................................................................... 181,183
salida buffering ......................................................... 181
cdigos de control ..................................................... 327
margarita ruedas ........................................................ 327
nombres de dispositivo ............................................ 183
conductores ................................................................ 329
grfico.......................................................................... 328
impacto........................................................................ 327
lser.............................................................................. 328
comando printf ................................................................. 314,455
impresin.................................................................................
determinar el estado del sistema ............................ 336
historia de ................................................................... 326
Protocolo de impresin de Internet ........................ 337
fuentes de monoespaciado....................................... 327
texto preparacin ....................................................... 329
bastante ....................................................................... 333
colas de impresin .................................................... 336
fuentes proporcionales ............................................. 328
cola ............................................................................... 337
la cola de impresin .................................................. 336
terminar los trabajos de impresin ........................ 338

visualizacin de empleos ......................................... 337


ID del proceso.................................................................... 109
sustitucin proceso ........................................................... 491
procesos .............................................................................. 108
fondo ........................................................................... 115
nio.............................................................................. 108
controlador ................................................................. 113
primer plano .............................................................. 115
interrumpiendo ......................................................... 114
el control de trabajos ................................................ 115
matanza ....................................................................... 117
agradable .................................................................... 110
padre............................................................................ 108
PID............................................................................... 109
ID del proceso ............................................................ 109
SIGINT ....................................................................... 494
seales ......................................................................... 117
SIGTERM ................................................................... 494
sueo ........................................................................... 110
estado .......................................................................... 110
parada.......................................................................... 116
visita ........................................................................... 109,111
zombi .......................................................................... 110
su uso en produccin........................................................ 422
finalizacin programable .................................................. 83
comando ps ........................................................................ 109
La variable PS1 ................................................................. 126,156
Variable de PS2 ................................................................. 363
comando ps2pdf ................................................................ 321
Variable de PS4 ................................................................. 426
pseudocdigo.................................................................... 381,409
comando pstree ................................................................. 121
PuTTY ................................................................................. 208
comando pwd ........................................................................ 8
Variable de las personas con discapacidad .................. 127
Lenguaje de programacin Python ................................ 341

Q
citando .................................................................................. 74
comillas dobles ............................................................ 75
carcter de escape ........................................................ 77
cita desaparecidos ..................................................... 417
comillas simples .......................................................... 76

R
RAID (matriz redundante de discos independientes)
............................................................................................ 176
procesador de imagen de trama .................................... 329
comando de lectura .................. 398, 408, 414, 422, 491

508

ndice
Readline ............................................................................. 79
README ................................................................. 49, 344
redireccin ...............................................................................
tubera obstruida ....................................................... 499
comandos de grupos y subcapas ............................. 487
aqu documentos........................................................ 369
aqu cuerdas................................................................ 404
error estndar ............................................................... 55
entrada estndar.............................................. 57, 370
salida estndar ............................................................. 54
operadores de redireccin .....................................................
Y> ................................................................................... 57
Y >> ................................................................................ 57
< ...................................................................................... 59
<(Lista)......................................................................... 491
<<.............................................................................. 369p.
...................................... 370
<< -....
...................................... 404
<<< ...,
........................................ 54
> .........
...................................... 491
> (Lista),
....................................... 55
>>.......
....................................... 60
62, 243, 295, 389, 403 247
expresiones
regulares anclas .
referencias anteriores ................................. 263, 294p.
bsico ............................... 254, 262p., 292, 296, 306
extendido .................................................................... 254
bases de datos relacionales .............................................. 281
rutas relativas ......................................................................... 9
libertad anticipada, la liberacin a menudo ................. 422
la eliminacin de lneas duplicadas en un archivo ........ 61
RESPUESTA variables .......................................... 398, 491
generador de informes...................................................... 361
repositorios ......................................................................... 167
comando de retorno ............................................... 375, 386
reutilizable ......................................................................... 380
DEP ...................................................................................... 329
comando rlogin .................................................................. 202
comando rm .......................................................................... 31
Extensiones Rock Ridge ................................................... 192
roff ....................................................................................... 318
Codificacin ROT13 .......................................................... 290
RPM ..................................................................................... 166
comando rpm ..................................................................... 169
comando rsync ................................................................... 238
rsync protocolo remoto de actualizacin ....................... 238
Lenguaje de programacin Ruby .................................... 341

variables escalares ............................................................ 478

Schilling, Jorg .................................................................... 192


comando scp ....................................................................... 207
comando de script ...............................................................86
lenguajes de script ..................................................... 42, 341
comando sdiff .................................................................... 304
buscar un archivo de patrones ..........................................62
historia buscar .....................................................................84
Secure Shell........................................................................ 203
comando sed.................................................290, 322, 461
comando set............................................................... 124, 425
setgid .....................................................................................98
setuid ............................................................................ 98, 385
Seward, Julian.................................................................... 229
comando sftp...................................................................... 207
bibliotecas compartidas ............................................ 21, 168
shebang ...................................................................... 355, 360
rdenes internas del shell ..................................................42
funciones de shell ................................ 42, 124, 374, 440
Indicadores de los shells 2, 9, 85, 100, 114, 126, 156, 204,
363
scripts de shell ................................................................... 354
Variable SHELL................................................................. 126
variables de shell............................................................... 124
comando de cambio ................................................. 439, 444
SIGINT ............................................................................... 494
seales ................................................................................. 493
comillas simples ..................................................................76
Slackware ........................................................................... 166
comando del sueo ........................................................... 411
enlace suave .........................................................................23
comando sort ............................................................... 61, 267
claves de ordenacin ......................................................... 271
cdigo fuente .................................. 166p., 174, 265, 340
comando fuente .....................................................135, 357
rbol de cdigo fuente ...................................................... 343
parmetros especiales .............................................. 441, 458
comando de divisin ........................................................ 304
SSH ...................................................................................... 203
comando ssh .............................................................. 203, 235
programa ssh ........................................................................88
Stallman, Richard .............. XVI, XIX, XXI, 131, 255, 342
error estndar .........................................................53p., 56
la eliminacin de .........................................................57
volver a dirigir a un archivo ......................................55
entrada estndar ..........................................53, 370, 398
redireccionamiento .....................................................57
salida estndar .....................................................................53
aadiendo a un archivo ..............................................55
la eliminacin de .........................................................57
redirigir el error estndar de......................................56
volver a dirigir a un archivo ......................................54
archivos de inicio .............................................................. 127

509

ndice
comando stat ...................................................................... 223
sticky bit ............................................................................... 98
dispositivos de almacenamiento .................................... 176
CD de audio .............................................................. 180,191
CD-ROM ................................................................. 179p.,191
la creacin de sistemas de archivos ........................ 185
nombres de dispositivo ............................................ 182
particiones de disco................................................... 177
FAT32 .......................................................................... 185
disquetes .................................................................... 183,189
formato ........................................................................ 185
LVM (Logical Volume Manager) ............................ 179
puntos de montaje .................................................... 178,180
particiones .................................................................. 185
leer y escribir directamente ..................................... 190
la reparacin de los sistemas de archivos .............. 189
desmontaje ................................................................. 181
Unidades flash USB .................................................. 190
editor de flujo .................................................................... 290
cuerdas .....................................................................................
expresiones ................................................................. 387
extraer una porcin de .............................................. 459
longitud de ................................................................. 459
realizar bsqueda y reemplazo en .......................... 461
eliminar parte principal de ...................................... 460
eliminar parte posterior de ...................................... 460
$ {Parmetro: desplazamiento: longitud} ............... 459
$ {Parmetro: offset} .................................................. 459
comando de cuerdas.......................................................... 452
talones ................................................................................ 377,422
estilo .................................................................................... 345
comando su .......................................................................... 99
subniveles.......................................................................... 404,487
comando sudo ..................................................................... 99,101
Sun Microsystems ............................................................. 137
superusuario .............................................. 2, 90, 100, 120
enlaces simblicos.............................................. 23, 34, 38
la creacin de ........................................................ 38, 40
listado ............................................................................ 38
enlace simblico .................................................................. 23
errores de sintaxis ............................................................. 416
resaltado de sintaxis......................................................... 354,359

T
tablas ................................................................................... 281
datos tabulares .................................................................. 271,317
comando tail ......................................................................... 63
archivo de cinta.................................................................. 230
comando tar ........................................................................ 230
tarballs ................................................................................ 343

objetivos ............................................................................. 347


Administrador de tareas .................................................. 113
Tatham, Simon .................................................................. 208
comando TBL ............................................................ 318, 322
camiseta de comandos ........................................................ 64
Teletipo ............................................................................... 109
comando telnet .................................................................. 202
Variable TERM.................................................................. 127
emuladores de terminal ....................................................... 2
sesiones de terminal ...............................................................
terminal de control .................................................... 109
efecto de .bashrc ........................................................ 357
medio ambiente ........................................................... 99
salir .................................................................................. 5
shell de entrada .................................................. 99, 127
Variable TERM .......................................................... 127
utilizando canalizaciones con nombre .................. 499
virtual .............................................................................. 5
con sistemas remotos .................................................. 88
terminales ................................... 81, 87P., 160, 318, 327
operador ternario .............................................................. 471
casos de prueba ................................................................. 423
comando de prueba ........................... 384, 389, 410, 419
cobertura de la prueba...................................................... 423
pruebas ............................................................................ 422P.
TEX ...................................................................................... 318
texto ....................................................................................... 17
el ajuste de longitud de la lnea .............................. 309
ASCII............................................................................. 17
retorno de carro.......................................................... 267
comparar ..................................................................... 283
la conversin de MS-DOS a Unix........................... 289
contando palabras ....................................................... 62
corte ............................................................................. 276
borrar las lneas duplicadas..................................... 275
la supresin de mltiples lneas en blanco........... 267
la deteccin de diferencias....................................... 284
mostrando las lneas comunes ................................ 284
se presentan los caracteres de control .................... 266
Formato DOS ............................................................. 267
La variable EDITOR ................................................. 126
editores............................................................... 130, 264
la ampliacin de las pestaas .................................. 279
archivos ......................................................................... 17
filtracin ....................................................................... 61
plegable ...................................................................... 309
formato ........................................................................ 305
formato para tipgrafos ............................................ 318
tablas de formato ....................................................... 322
unin ........................................................................... 281
carcter de salto de lnea .......................................... 267

510

ndice
minsculas a la conversin en maysculas ........... 289
lneas de numeracin ....................................... 267, 305
paginar ......................................................................... 313
pegar ............................................................................ 280
la preparacin para la impresin............................. 329
la eliminacin de lneas duplicadas ......................... 61
renderizado en PostScript ........................................ 320
ROT13 codificado ...................................................... 290
la bsqueda de patrones ............................................. 62
clasificacin ......................................................... 61, 267
correccin ortogrfica ................................................ 299
sustitucin................................................................... 294
la sustitucin de lengetas para espacios .............. 279
delimitado por tabuladores ...................................... 278
personajes Transliterando ........................................ 288
Formato Unix .............................................................. 267
ver con menos ..................................................... 17, 60
editores de texto ...........................................130, 264, 288
emacs............................................................................ 131
para escribir scripts de shell .................................... 354
gedit .................................................................... 131, 354
interactivo ................................................................... 288
kate ...................................................................... 131, 354
kedit ............................................................................. 131
kwrite ........................................................................... 131
lnea.............................................................................. 137
nano..................................................................... 131, 136
Pico ............................................................................... 131
corriente....................................................................... 290
resaltado de sintaxis ......................................... 354, 359
vi ................................................................................... 131
empuje ...................................................131, 354, 359
visual............................................................................ 137
expansin de tilde ..................................................... 69, 75
comando tload .................................................................... 121
comando top ....................................................................... 111
diseo de arriba hacia abajo ............................................ 372
Torvalds, Linus .......................................................... xvi, xxi
comando touch ................................ 222p., 239, 349, 446
comando tr .......................................................................... 288
comando traceroute ........................................................... 197
rastreo .................................................................................. 425
personajes Transliterando................................................ 288
trampas ................................................................................ 493
comando troff ..................................................................... 318
verdadero comando ........................................................... 383
TTY ...................................................................................... 109
escriba command ................................................................. 43
cajistas ........................................................................ 318, 328
Variable TZ......................................................................... 127

T
89, 102, 166, 250, 357
Ubuntu ................................
comando umask .................
........................... 96, 105
................................... 181
comando umount...............
...................................... 51
comando unalias ................
..................................... 419
operador unario espera,
.....................................465
operadores unarios ............
..................................... 279
comando unexpand ...........
smbolo inesperado ...........
.................................... 418
............................61, 275
comando Uniq....................
.................................... xvii
Unix .....................................
Unix System V ................................................................... 331
comando unix2dos ............................................................ 267
comando unset ................................................................... 484
hasta comando compuesto ............................................... 413
hasta bucle .......................................................................... 413
comando unzip .................................................................. 236
comando updatedb............................................................ 211
proveedores de aguas arriba ............................................ 167
el tiempo de actividad ...................................................... 373
comando uptime ................................................................ 379
Unidades flash USB ............................................... 176, 190
Usenet.................................................................................. 290
Variable USER ........................................................ 125, 127
usuarios ....................................................................................
cuentas ........................................................................... 89
identidad cambiante ................................................... 99
cambio de contraseas .............................................. 106
ID de usuario efectivo.................................... 98, 109
directorio de inicio ...................................................... 90
identidad ....................................................................... 89
contrasea ..................................................................... 90
Permisos configuracin por defecto ......................... 96
setuid ............................................................................. 98
superusuario .................................... 90, 92, 98p., 107
/ Etc / passwd ................................................................ 90
/ Etc / shadow................................................................ 90

V
entrada de validacin........................................................ 404
las variables ..................................................... 72, 364, 456
la asignacin de valores ........................................... 367,467
constantes.................................................................... 366
declarando ................................................................. 364,367
medio ambiente ......................................................... 124
global ........................................................................... 376
local .............................................................................. 376
nombres...................................................................... 366,459
escalar .......................................................................... 478
cscara.......................................................................... 124

511

ndice
vfat ....................................................................................... 188
comando de vi .................................................................... 136
comando vim.......................................................... 263, 359
consolas virtuales .................................................................. 5
Red Privada Virtual .......................................................... 206
terminales virtuales .............................................................. 5
editores visuales ................................................................ 137
comando vmstat................................................................. 121

.bash_login ......................................................................... 127


.bash_profile ...................................................................... 127
.bashrc ........................................ 128, 130, 357, 380, 441
.profile ................................................................................ 127
.ssh / known_hosts ............................................................ 205

espere comando ................................................................. 496


comando wc.......................................................................... 62
pginas web ....................................................................... 265
comando wget .................................................................... 202
Lo que ves es lo que obtienes .......................................... 327
comando whatis................................................................... 47
que comando .................................................................. 43, 73
mientras comando compuesto......................................... 410
comodines......................................... 26, 58, 67, 243, 250
comando wodim ................................................................ 193
palabra-divisin ............................................................ 74pp.
mundo ................................................................................... 89
WYSIWYG .......................................................................... 327

X
Sistema X Window ..............................................3, 88, 206
xargs comando ................................................................... 220
comando xload ................................................................... 121
comando xlogo ................................................................... 114
XML ..................................................................................... 265

Y
texto tirn.............................................................................. 80
comando yum..................................................................... 169

Z
comando zgrep................................................................... 263
comando zip ....................................................................... 236
comando zless ............................................ 50 --help opcin.

./configure....................................................................... 34645
.bash_history .................................................................. 83

512

Comando compuesto (()) ...................................... 464, 470


[Comando ......................................................................... 418

/ ........................................
/ Bin ................................
/ Boot ..............................
/boot/grub/grub.conf.
/ Boot / vmlinuz ............
/ Dev ...............................
/ Dev / cdrom .................
/ Dev / dvd .....................
/ Dev / floppy ................
/ Dev / null .....................
/ Etc .................................
/etc/bash.bashrc ............
/ Etc / crontab.................
/ Etc / fstab .....................
/ Etc / group ...................
/ Etc / passwd.................
/ Etc / profile ..................
/ Etc / shadow ................
/ etc / sudoers.................
/ Lib.................................
/ Perdido encontrado +
/ medios..........................
/ Mnt ...............................
/ Opt................................
/ Proc ...............................
/ Root ..............................
/ Sbin ..............................
/ Tmp ..............................
/ Usr ................................
/ Usr / bin .......................
/ Usr / lib ........................
/ Usr / local .....................
/ Usr / local / bin............
/ Usr / local / sbin ..........
/ Usr / sbin .....................

................................... 20
................................... 20
................................... 20
................................... 20
.................................... 20
.................................... 20
................................... 183
................................... 183
....................................183
..................................... 57
.................................... 21
..................................128
.................................... 21
................ 21, 177, 189
......................................90
21, 90, 274, 279, 403
.......................... 127, 129
..................................... 90
..................................... 99
.....................................21
.................................... 21
.................................... 21
.....................................21
................................... 21
................................... 22
.......................... 22, 100
.................................... 22
........................... 22, 496
.................................... 22
................................... 22
.....................................22
.................................... 22
................. 22, 350, 358
................................... 358
.................................... 22

ndice
/ Usr / share .......................................................................... 22
/ Usr / share / dict .............................................................. 247
/ Usr / share / doc ......................................................... 22, 49
/ Var....................................................................................... 23
/ Var / log .............................................................................. 23
/ var / log / messages ............................................ 23, 64, 183
/ Var / log / syslog ................................................ 64, 183

$
$! ............................................................................. 442, 497
$ ((Expresin)) ................................................................... 464
$ {! Array [@]} ..................................................................... 483
$ {! Array [*]} ...................................................................... 483
$ {! Prefijo @} ...................................................................... 459
$ {! Prefijo *} ....................................................................... 459
$ {Parmetro} # .................................................................. 459
$ {Parmetro ,,}................................................................... 463
$ {Parmetro,}..................................................................... 463

$ {Parmetro: -palabra}..................................................... 457


$ {Parmetro:? Palabra} .................................................... 458
$ {Parmetro: + palabra}................................................... 458
$ {Parmetro: = palabra}................................................... 457
$ {Parmetro // patrn / cadena} ...................................... 461
$ {Parmetro / # patrn / cadena}.................................... 461
$ {Parmetro /% patrn / cadena} ................................... 461
$ {Parmetro / patrn / cadena} ....................................... 461
$ {Parmetro ## patrn} ................................................... 460
$ {Parmetro} patrn # ..................................................... 460
$ {Parmetro %% patrn} ................................................. 460
$ {Parmetro% patrn} ..................................................... 460
$ {} ParameterA.................................................................. 463
$ {} ParameterAA............................................................... 463
$ @ ............................................................................ 441, 449
$ * ............................................................................. 441, 449
$ # ........................................................................................ 437
$ 0 ........................................................................................ 441

513

Anda mungkin juga menyukai