Capítulo 4
El shell de Unix
Es muy fácil crear archivos en el sistema operativo UNIX. Por lo tanto, los usuarios tienden a crear muchos archivos que utilizan una gran cantidad de espacio. Se ha dicho que la única cosa estándar y común a todos los sistemas UNIX es el mensaje-del-día que les pide a los usuarios que borren los archivos que no necesitan.
Guía del administrador de System V.2
4.1 Comandos Unix
Cuando ingresa al sistema Unix, se enfrenta con algo más o menos como lo que se muestra a continuación:
/home/larry$
Ese "algo" se denomina prompt1. Como su nombre sugiere, le solicita a Ud. que ingrese un comando. Todos los comandos Unix consisten de una secuencia de letras, números y caracteres. No son válidos los espacios dentro del nombre del comando. Algunos comandos válidos son mail, cat, y CMU_is_Number-5. Algunos caracteres no están permitidos, volveremos a este tema más adelante.
Unix además hace diferencia entre mayúsculas y minúsculas2, lo que significa que Cat y cat son comandos distintos.
El prompt se muestra como resultado del accionar de un programa especial denominado intérprete de comandos3. El intérprete de comandos o shell acepta los comandos que escribe el usuario y los ejecuta. Los comandos pueden formar programas en el lenguaje del intérprete de comandos, y a dichos programas se los denomina "guiones de shell".
_____________________________________________
1 N. del T.: prompt significa solicitud.
2 La diferenciación entre mayúsculas y minúsculas es una cosa muy personal. Algunos sistemas operativos como OS/2 y Windows NT preservan las diferencias, pero no las cuentan como distintas. En la práctica habitual con Unix, se utiliza raramente la diferenciación. La situación de tener un par de comandos Cat y cat diferentes, no es común.
3 N. del T.: intérprete de comandos del inglés shell.
Los shell en Unix se clasifican en dos grandes grupos: los tipo Bourne y los tipo C. Los shell tipo Bourne toman su nombre a partir de su inventor, Steven Bourne. Steven Bourne escribió el shell original de Unix, denominado sh; a partir de entonces, la mayoría de los shells tienen un nombre con el sufijo sh para indicar que son extensiones de la idea original. Existen varias implementaciones de este shell, que colectivamente llevan el nombre de shells Bourne. También son comunes los shells tipo C cuyo original fue implementado por Bill Joy. Tradicionalmente, los shell Bourne se han utilizado para los scripts de shell y por razones de compatibilidad con el sh original, mientras que los shells C han sido más comunes en su aplicación interactiva. (Los C tienen ventajas en cuanto a sus mejores características interactivas, aunque son más difíciles de programar.)
Linux viene con un shell Bourne denominado bash, escrito por la organización "Free Software Foundation"4. El nombre bash proviene de Bourne Again SHell, uno de los tantos juegos de palabras en Unix. Se trata de un shell Bourne "avanzado": tiene las capacidades estándar de programación que se encuentran en todos los shells Bourne y además varias de las características interactivas que se encuentran en los shells C. bash es el shell predeterminado cuando uno usa Linux.
Apenas ingresa por primera vez, el prompt que Ud. ve es producto de la acción de bash, en otras palabras: está Ud. corriendo su primer programa Unix, el shell bash. Mientras esté conectado, el shell bash estará permanentemente funcionando.
4.1.1 Un comando Unix típico
El primer comando que debe conocer es cat. Para utilizarlo, escriba "cat" y luego oprima |_Intro_|:
/home/larry$ cat
Si tiene ahora el cursor posicionado en una línea nueva, entonces lo que ha hecho está bien. Existen unas cuantas variantes que podría haber tecleado, algunas funcionarán, otras no.
o
Si tuvo algún error de tecleo al escribir "cat" , debería haber visto algo más o menos así:/home/larry$ ct
ct: command not found
/home/larry$
Por lo tanto, el shell le informa que no pudo encontrar un programa denominado "ct" , y le ofrece otro prompt para seguir trabajando. Recuerde que Unix hace diferencia entre mayúsculas y minúsculas: CAT está mal escrito.
o
Puede que Ud. haya escrito algunos espacios en blanco antes del comando, como:5/home/larry$ cat
Sin embargo, el resultado es correcto, y el programa cat corre sin problemas.
_____________________________________________
4 N. del T.: La Fundación para el Software Libre _tal es la traducción de su nombre_ se ocupa de la producción y distribución de software que no tiene limitaciones en su uso y/o copia, enfrentando de esta manera las prácticas de las compañías tradicionales de desarrollo. Que el software sea libre no significa que sea barato: la libertad incluye la gratuidad, pero es mucho más que ello.
5 El ' ' indica que el usuario escribió un espacio.
o
También puede que haya oprimido un |_Intro_| en una línea en blanco; no se preocupe y continúe, pues no tiene ningún efecto.Doy por sentado que Ud. ha corrido con éxito cat y está esperando que haga algo que lo maraville. Pues bien, no, no es un juego. cat es una muy útil utilidad que no parece muy útil a primera vista. Escriba cualquier cosa y luego oprima |_Intro_|. Lo que verá es:
/home/larry$ cat
Help! I'm stuck in a Linux program!
Help! I'm stuck in a Linux program!
Lo que parece haber hecho cat es devolver un eco de lo escrito. Esto es útil a veces, tal vez no ahora. Así que salgamos de este programa y veamos otros con beneficios más obvios.
Para finalizar ciertos comandos Unix, teclee |_Ctrl-d_|6. |_Ctrl-d_| es el carácter end-of-file7, o EOF, para abreviar. Puede que en ciertos libros de texto aparezca como end-of-text8. Nos referiremos a este carácter como EOF. Es un carácter de control que informa a los programas Unix que ha cesado el ingreso de datos. Cuando cat ve que no teclea más nada, termina.
Para ver otro ejemplo parecido, pruebe el programa sort. Como su nombre lo indica, sort es un programa de clasificación. Si Ud. teclea unas cuantas líneas y luego oprime |_Ctrl-d_|, sort las mostrará a la salida de manera ordenada. Esta clase de programas se denominan filtros, porque toman texto desde su entrada, lo filtran, y lo vierten a su salida modificado de alguna manera. Tanto cat como sort son filtros inusuales. cat es inusual pues lee el texto de entrada y no lo cambia.
sort es inusual porque lee todas las líneas de entrada hasta el EOF, antes de emitir su salida. La mayoría de los filtros trabajan sobre la base de línea por línea: leen una línea de la entrada, realizan cierto cómputo, y escriben una línea diferente de salida.
4.2 Autoayuda
El comando man muestra las páginas de la guía de referencia para un comando dado9. Por ejemplo:
/home/larry$ man cat
cat(1) cat(1)
NAME
cat - Concatenates or displays files
SYNOPSIS
cat [-benstuvAET] [--number] [--number-nonblank] [--squeeze-blank]
[--show-nonprinting] [--show-ends] [--show-tabs] [--show-all]
[--help] [--version] [file...]
DESCRIPTION
This manual page documents the GNU version of cat ...
________________________________________________
6 Mantenga oprimida la tecla etiquetada |_Ctrl|_y aprete |_d_|, luego suelte ambas.
7 N. del T.: fin de archivo.
8 N. del T.: fin de texto.
9 man también puede mostrar información acerca de las llamadas al sistema, subrutinas, formatos de archivos, etc.. En la versión original de Unix el comando mostraba la información exactamente igual a la que aparecía en la documentación impresa. Por ahora, es probable que Ud. sólo esté interesado en obtener ayuda acerca de los comandos.
Hay aproximadamente una página completa de información sobre cat10. Pruebe correr "man" en este momento. No espere entender la página de manual que se le muestra. Las páginas de manual suponen un cierto conocimiento de Unix, conocimiento que tal vez Ud. no tenga en este momento.
Cuando termine de leer la página, es probable que vea un bloque en video inverso al final de la página, parecido a "--more--" o a "Line 1". Se trata del pedido de más (información), que pronto le será muy familiar.
En lugar de dejar escapar el texto fuera de los límites de la pantalla, man se detiene al final de cada página, y espera para ver que ha decidido hacer Ud.. Si desea seguir leyendo, oprima |_Barra espaciadora_| y avanzará una página. Si desea terminar con la lectura de la página del manual, oprima |_q_|. Regresará entonces al prompt del shell, que esperará hasta que Ud. escriba otro comando.
man provee además una función de búsqueda de palabras clave. Por ejemplo, digamos que Ud. está interesado en el tema PostScript, el lenguaje de control de impresoras desarrollado por Adobe. Si escribe "man -k ps" o "man -k Postscript" , recibirá como resultado una lista de todos los comandos, llamadas al sistema, y otras partes documentadas de Unix que contengan la palabra "ps" (o "Postscript") en su nombre o descripción breve. Esto puede llegar a ser muy útil cuando quiere buscar una herramienta para hacer algo, pero no conoce su nombre, o si existe.
4.3 Almacenaje de la información
Los filtros son muy útiles cuando Ud. se ha transformado en un usuario experimentado, pero tienen un pequeño problema. Cómo almacena Ud. la información. Seguramente, ¡no se espera que Ud. teclee todas las cosas cada vez que desea utilizar el programa! Por supuesto que no. Unix provee archivos y directorios.
Un directorio es como una carpeta, contiene hojas de papel, o archivos. Una carpeta suficientemente grande puede contener otras carpetas, puede haber directorios dentro de directorios. En Unix, se denomina sistema de archivo a la colección de archivos y directorios. Inicialmente en el sistema de archivo sólo existe un directorio, denominado "root"11. Dentro de este directorio hay más directorios, y dentro de ellos hay archivos, y aún más directorios12.
_____________________________________________
10 N. del T.: El ejemplo se ha mantenido en inglés, pues es muy probable que Ud. tenga instaladas las páginas de manual en dicho idioma, de manera predeterminada. Pruebe más tarde de instalar el conjunto de páginas de manual que están disponibles en castellano.
11 N. del T.: directorio raíz.
Cada archivo y cada directorio tiene un nombre. Nos referiremos a su nombre corto13, que puede coincidir con el de otro archivo y/o directorio en alguna otra parte del sistema de archivo, y al nombre largo14, que es único. Un nombre corto para un archivo puede ser joe, mientras que su nombre completo podría ser /home/larry/joe. El nombre completo se denomina usualmente trayectoria15. La trayectoria puede decodificarse como una secuencia de directorios. Por ejemplo, veremos como se lee /home/larry/joe:
/home/larry/joe
La barra inicial indica el directorio raíz.
Aquí esta el directorio denominado home. Está dentro del directorio raíz.
Este es el directorio larry, el cual está dentro de home.
joe está dentro de larry. Una trayectoria puede referirse tanto a un directorio como a un nombre de archivo, así que joe podría ser cualquiera de ellos. Todos los items antes del nombre corto deben ser directorios.
Una manera sencilla de visualizar todo esto es mediante un diagrama en árbol. Para ver el diagrama de un sistema típico Linux, mire la Figura 4.1. Debe Ud. notar que dicho diagrama no está completo (¡un sistema Linux completo tiene más de 8000 archivos!) y sólo muestra algunos de los directorios estándar. Por lo tanto, puede haber algunos directorios del diagrama que no estén en su sistema, y de hecho su sistema tendrá directorios que no aparecen en la figura.
4.3.1 Miremos los directorios con ls
Ahora que ya sabe de la existencia de archivos y directorios, debe haber también una manera de manipularlos. Por supuesto. El comando ls es uno de los más importantes, y lo que hace es listar los archivos. Si prueba a correr el comando "ls" , entonces verá:
/home/larry$ ls
/home/larry$
Está bien, no se preocupe por no ver nada. Unix es intencionalmente callado: si no hay archivos para mostrar, no muestra nada (ni siquiera un "no hay archivos"). Por lo tanto, la ausencia de salida es la manera de ls de decir que no encontró ningún archivo.
Pero hace un momento dije que hay más de 8000 archivos por allí: ¿dónde están? Acaba de encontrar el concepto de directorio "actual". Como puede ver en el prompt, su directorio actual es /home/larry y allí no hay archivos. Si desea la lista de archivos de un directorio más poblado, pruebe con el directorio raíz:
/home/larry$ ls /
bin etc install mnt root user var
dev home lib proc tmp usr vmlinux
/home/larry$
_____________________________________________
12 Puede haber o no un límite a la "profundidad" a la cual puede llegar el sistema de archivo. (En mi caso nunca la alcancé, uno fácilmente puede tener directorios de 10 niveles de profundidad.)
13 N. del T.: Nombre relativo del archivo o directorio.
14 N. del T.: Nombre completo o absoluto.
15 N. del T.: trayectoria del inglés path.
___________________________________________________________________________________________Figura 4.1 Típico árbol (podado) de directorios Unix.
/ ________||bin
|___dev
|
|___etc
|
|___home ________larry
| |
| |___sam
|___lib
|
|___proc
|
|___tmp
|
|___usr________||X11R6
|
|___bin
|
|___emacs
|
|___etc
|
|___g++-include
|
|___include
|
|___lib
|
|___
| local
| ||_bin
| |___emacs
| |
| |___etc
| |
| |___lib
|
|___man
|
|___spool
|
|___src________linux
|
|___tmp
En el comando anterior, "ls /" , el directorio ("/" ) es lo que se denomina un parámetro. La primer palabra de un comando es el nombre del comando, y cualquier cosa que le siga son sus parámetros. Los parámetros generalmente modifican la forma en la que actúa un programa para ls, el parámetro le dice de cual directorio desea Ud. la lista de archivos. Algunos comandos tienen parámetros especiales denominados opciones o interruptores16 Para ver esto, pruebe:
/home/larry$ ls -F /
bin/ etc/ install/ mnt/ root/ user/ var@
dev/ home/ lib/ proc/ tmp/ usr/ vmlinux
/home/larry$
_____________________________________________
16 N. del T.: interruptores del inglés switches.
El "-F" es una opción. Las opciones son clases especiales de parámetros que comienzan con un guión y modifican el funcionamiento del programa. Para "ls", "-F" es una opción que le permite a Ud. ver cuales de las entradas son directorios, cuales son archivos especiales, cuales programas, y cuales son archivos normales. Cualquiera que termina con una barra es un directorio. Trataremos con más detalle las características de ls más adelante. ¡Es un programa sorprendentemente complejo!
Por ahora, hay dos lecciones que se deben aprender. Primero, debe aprender que es lo que hace ls. Pruebe unos cuantos otros directorios de los que se muestran en el árbol de la Figura 4.1, y fíjese en su contenido. Naturalmente, algunos estarán vacíos, y otros tendrán muchos archivos dentro. Le sugiero que utilice "ls" con y sin la opción "-F" . Por ejemplo, "ls /usr/local" debe aparecer más o menos así:
/home/larry$ ls /usr/local
archives bin emacs etc ka9q lib tcl
/home/larry$
La segunda lección es más general. Muchos comandos Unix son como ls. Tienen opciones, que en general consisten de un carácter precedido por un guión, y tienen parámetros. A diferencia de ls, algunos comandos requieren ciertos parámetros y/u opciones. Para mostrar como se usan los comandos, utilizaremos el siguiente formato:
ls [-aRF] [directorio]
En general, y desde ahora en adelante, utilizaré plantillas de comandos como la mostrada, antes de introducir comandos nuevos para Ud.. La primer palabra es el comando (en este caso ls). A continuación del comando siguen todos los parámetros. Los parámetros opcionales se encerrarán entre corchetes ("[" y "]"). Las meta-variables están inclinadas_son palabras que toman el lugar de los parámetros reales. (Por ejemplo, más arriba puede Ud. ver que dice directorio, lo cual debe ser reemplazado por el nombre de un directorio real.)
Las opciones son un caso especial. Están encerradas entre corchetes, pero Ud. puede utilizar una sola de ellas sin necesidad de emplear todas juntas. Por ejemplo, con las tres opciones enumeradas más arriba para el caso de ls, Ud. tiene ocho maneras posibles de correr el comando: con o sin cada una de las opciones. (Contraste "ls -R" con "ls -F" .)
4.3.2 El directorio actual y cd
- pwd
El uso de los directorios puede ser insoportable si se tiene que teclear la trayectoria completa cada vez que se quiere acceso a un directorio. En lugar de ello, los shell de Unix tienen una característica denominada directorio "actual", "presente", o "de trabajo". Es muy probable que su configuración de shell muestre dicho directorio como parte del prompt: /home/larry. Si no lo hace, pruebe el comando pwd, que proviene de la sigla de las palabras present working directory17. (Algunas veces el prompt muestra el nombre de la máquina. Esto sólo es útil realmente en un entorno de red en el cual hay una gran cantidad de máquinas diferentes.)
mousehouse>pwd
/home/larry
mousehouse>
Como puede Ud. ver, pwd le dice cuál es su directorio actual18_ se trata de un comando muy simple. La mayoría de los comandos actúa, de forma predeterminada, sobre el directorio actual.
- cd [directorio]
Podemos cambiar nuestro directorio actual mediante el comando cd. Por ejemplo, pruebe:
/home/larry$ cd /home
/home$ ls -F
larry/ sam/ shutdown/ steve/ user1/
/home$
Si Ud. omite el parámetro opcional directorio, se lo retornará a su directorio raíz personal, o directorio original. De otro modo, cd lo cambiará al directorio especificado. Por ejemplo:
/home$ cd
/home/larry$ cd /
/$ cd home
/home$ cd /usr
/usr$ cd local/bin
/usr/local/bin$
Como puede ver, cd le permite expresar el directorio de destino con trayectorias absolutas o relativas. Una trayectoria absoluta comienza con una "/" y especifica todos lo directorios que existen antes del archivo que Ud. desea. Una trayectoria relativa está referida a su directorio actual. En el ejemplo anterior, cuando estaba en "/usr", hice un movimiento relativo a "local/bin" "local" es un directorio que existe bajo "/usr", y "bin" es un directorio bajo "local". ("cd home" también fue un cambio de directorio relativo.)
Existen dos directorios que se utilizan solamente para trayectorias relativas: "." y "..". El directorio "." se refiere al directorio actual, y ".." es el directorio anterior: son "abreviaturas" de directorio, y existen en todos los directorios, aunque no cuadran bien en la metáfora de "carpeta dentro de carpeta". Aún el directorio raíz tiene un directorio anterior: él es su propio directorio anterior.
_____________________________________________
17 N. del T.: Directorio de trabajo actual.
18 En este libro verá todos los términos en uso: directorio de trabajo presente, directorio actual, o directorio de trabajo. Prefiero "directorio actual", aunque a veces recurra a las otras formas a causa de razones de estilo.
El archivo ./chapter-1 viene a ser el archivo chapter-1 que está en el directorio actual. Ocasionalmente, será necesario que Ud. coloque explícitamente el "./" para que ciertos comandos funcionen, aunque esto es raro. En la mayoría de los casos, dará igual poner ./chapter-1 o chapter-1.
El directorio ".." es más útil cuando queremos "retroceder":
/usr/local/bin$ cd ..
/usr/local$ ls -F
archives/ bin/ emacs@ etc/ ka9q/ lib/ tcl@
/usr/local$ ls -F ../src
cweb/ linux/ xmris/
/usr/local$
En este ejemplo, me cambié al directorio anterior mediante "cd .." y luego listé el directorio /usr/src desde /usr/local utilizando el nombre ../src. Debe advertir que si hubiese estado en /home/larry, ejecutar el comando "ls -F ../src" no me habría servido al propósito de ver lo que hay en /usr/src.
El directorio "~/" es un alias para su directorio personal:
/usr/local$ ls -F ~/
/usr/local$
Puede ver que aún no hay nada en su directorio personal. "~/" será más útil a medida que aprendamos más acerca de como manipular los archivos.
4.3.3 Creación y borrado de directorios
- mkdir directorio1 [directorio2 . . . directorioN]
En Unix, crear directorios es extremadamente simple, y puede ser una muy útil herramienta de organización. Para crear un nuevo directorio, utilice el comando mkdir. Por supuesto, mkdir viene de make directory19.
Con un pequeño ejemplo, veamos como funciona esto:
/home/larry$ ls -F
/home/larry$ mkdir report-1993
/home/larry$ ls -F
report-1993/
/home/larry$ cd report-1993
/home/larry/report-1993$
mkdir puede tomar más de un parámetro, a los que interpreta como nombres de directorios que debe crear. Puede especificarlos mediante su nombre relativo o absoluto; report-1993 es un caso de ejemplo con trayectoria relativa.
/home/larry/report-1993$ mkdir /home/larry/report-1993/chap1 ~/report-1993/chap2
/home/larry/report-1993$ ls -F
chap1/ chap2/
/home/larry/report-1993$
_____________________________________________
19 N. del T.: Crear directorio.
- rmdir directorio1 [directorio2 . . . directorioN]
El opuesto de mkdir es rmdir (remove directory20). rmdir trabaja exactamente igual que mkdir. Un ejemplo de rmdir es:
/home/larry/report-1993$ rmdir chap1 chap3
rmdir: chap3: No such file or directory
/home/larry/report-1993$ ls -F
chap2/
/home/larry/report-1993$ cd ..
/home/larry$ rmdir report-1993
rmdir: report-1993: Directory not empty
/home/larry$
Como puede apreciar, rmdir se niega a borrar un directorio que no existe, y tampoco permite eliminar directorios que tengan algo dentro. (Recuerde que report-1993 tiene un subdirectorio, chap2, dentro de él) Existe un tema interesante para pensar, entonces: ¿qué pasa si intenta eliminar su directorio actual? Averigüémoslo:
/home/larry$ cd report-1993
/home/larry/report-1993$ ls -F
chap2/
/home/larry/report-1993$ rmdir chap2
/home/larry/report-1993$ rmdir .
rmdir: .: Operation not permitted
/home/larry/report-1993$
Otra situación del mismo estilo, es que sucede si intenta eliminar el directorio anterior al directorio actual. Bien, esto no es un problema nuevo: el directorio anterior al actual no está vacío (existe el actual en él), así que no puede ser borrado.
4.4 Información en movimiento
Todos este asunto de los directorios está muy lindo, pero no son de ninguna ayuda, a menos que Ud. tenga algún sitio donde almacenar sus datos. Los dioses del Unix vieron este problema y lo solucionaron haciendo que los usuarios tengan archivos21
_____________________________________________
20 N. del T.: Eliminar directorio.
21N. del T.: También denominados ficheros.
Aprenderemos más acerca de la creación y edición de archivos en los próximos capítulos.
Los comandos básicos para manipular archivos en Unix son cp, mv, y rm. Sus nombres provienen de copy22, move23, y remove24, respectivamente.
4.4.1 cp como un monje
- cp [-i] fuente destino
- cp [-i] archivo1 archivo2 . . . archivoN directorio-de-destino25
cp es una utilidad muy práctica en Unix, y además muy poderosa. Permite que una persona pueda copiar más información en un segundo que lo que podía copiar un monje del siglo XIV en todo un año.
Debe ser muy cuidadoso con cp si no dispone de una cantidad importante de espacio en disco. A nadie le hace gracia ver el mensaje "Disk full"26 cuando está trabajando con archivos importantes.
cp también puede sobreescribir archivos existentes sin previo aviso, trataremos este tema más adelante.
Bien, hablaremos primero acerca de la primer línea en la plantilla del comando. El primer parámetro de cp es el nombre del archivo que hay que copiar, el segundo es el lugar donde se desea depositar la copia. Puede obtener una copia con un nombre distinto, o una en un directorio diferente. Veamos algunos ejemplos:
/home/larry$ ls -F /etc/passwd
/etc/passwd
/home/larry$ cp /etc/passwd .
/home/larry$ ls -F
passwd
/home/larry$ cp passwd frog
/home/larry$ ls -F
frog passwd
/home/larry$
El primer comando cp que corrí tomó el archivo /etc/passwd, que contiene los nombres de todos los usuarios en un sistema Unix, y lo copió en mi directorio raíz. cp no borra el archivo fuente, así que no hice nada que pudiera dañar el sistema. O sea que ahora existen dos copias del contenido del archivo /etc/passwd, ambas se denominan passwd, pero una está en el directorio /etc y la otra en /home/larry.
_____________________________________________
22 N. del T.: Copiar.
23 N. del T.: Mover.
24 N. del T.: Quitar, borrar.
25 cp necesita de dos renglones en su plantilla porque el significado del segundo parámetro depende de la cantidad de parámetros.
26 N. del T.: Disco lleno.
Luego, creamos una tercera copia de /etc/passwd cuando tecleamos "cp passwd frog", ahora hay tres copias: /etc/passwd, /home/larry/passwd y /home/larry/frog. El contenido de esos tres archivos es el mismo, sus nombres de archivo difieren.
cp puede copiar archivos entre directorios si el primer parámetro es un archivo y el segundo es un directorio. En este caso, el nombre simple (sin el path) de destino coincidirá con el original, para cada archivo.
También se puede copiar un archivo y cambiar su nombre de destino en una sola operación, caso que se da cuando ambos parámetros son nombres de archivo. Aquí reside uno de los peligros de cp. Si tecleara "cp /etc/passwd /etc/group" , el comando cp crearía normalmente un archivo nuevo con el contenido idéntico al de /etc/passwd y con el nombre /etc/group. Por lo tanto, si /etc/group ya existiera, cp destruiría el contenido del antiguo sin darle la oportunidad de guardarlo. (Ni siquiera escribirá un mensaje en el cual le advierta que está por destruir un archivo al copiarle otro encima). Echemos una mirada a otro ejemplo de cp:
/home/larry$ ls -F
frog passwd
/home/larry$ mkdir passwd_version
/home/larry$ cp frog passwd passwd_version
/home/larry$ ls -F
frog passwd passwd_version/
/home/larry$ ls -F passwd_version
frog passwd
/home/larry$
¿Cómo usé cp en este caso? Evidentemente, cp puede tomar más de dos parámetros, como se puede apreciar en la segunda línea de plantillas del comando. Lo que el comando anterior realizó es copiar los archivos que aparecen listados (frog, y passwd) al directorio passwd_version. De hecho, cp puede tomar cualquier número de parámetros: interpreta los primeros n - 1 como los nombres de archivo que debe copiar, y el nésimoparámetro como el nombre del directorio al cual se deben copiar los anteriores.
No puede renombrar archivos cuando copia más de uno a la vez siempre mantienen su nombre simple. Esto nos lleva a una pregunta interesante. ¿Qué es lo que pasaría si tecleamos "cp frog passwd toad" , donde frog y passwd existen, y toad no es un directorio? Inténtelo y lo sabrá.
4.4.2 La poda con rm
- rm [-i] archivo1 archivo2 . . . archivoN
Ahora que hemos aprendido como crear millones de archivos con cp (y créame, muy pronto encontrará nuevas maneras de crear más archivos), sería útil aprender la manera de borrarlos. De hecho, es muy simple: el comando que anda necesitando es rm, y funciona como Ud. se lo esperaría: a cualquier archivo cuyo nombre se pasa como parámetro a rm se lo borra. Por ejemplo:
/home/larry$ ls -F
frog passwd passwd_version/
/home/larry$ rm frog toad passwd
rm: toad: No such file or directory
/home/larry$ ls -F
passwd_version/
/home/larry$
Como puede Ud. apreciar, rm es extremadamente espartano. No sólo no pide su confirmación, sino que borra cosas aún en el caso en que haya errores en la línea de comandos. Esto bien puede ser peligroso. Considere la diferencia entre estos dos comandos:
/home/larry$ ls -F
toad frog/
/home/larry$ ls -F frog
toad
/home/larry$ rm frog/toad
/home/larry$
y este otro:
/home/larry$ rm frog toad
rm: frog is a directory
/home/larry$ ls -F
frog/
/home/larry$
Como puede ver, la diferencia en un caracter hace una diferencia importante en la salida del comando. ¡Es vital que Ud. controle lo que ha escrito en sus líneas de comando antes de presionar |_Intro_|!
4.4.3 Sería interesante tener un rastrillo
- mv [-i] nombre-viejo nombre-nuevo
- mv [-i] archivo1 archivo2 . . . archivoN nuevo-directorio
Por último, el otro comando del que debe cuidarse es mv. mv se parece un montón a cp, excepto que borra el archivo original después de copiarlo. Se puede entender como la utilización conjunta de cp y rm. Veamos que podemos hacer:
/home/larry$ cp /etc/passwd .
/home/larry$ ls -F
passwd
/home/larry$ mv passwd frog
/home/larry$ ls -F
frog
/home/larry$ mkdir report
/home/larry$ mv frog report
/home/larry$ ls -F
report/
/home/larry$ ls -F report
frog
/home/larry$
Como puede ver, mv renombra un archivo (que es el primer parámetro) si el segundo parámetro es un archivo. Si el segundo parámetro es un directorio, mv moverá el archivo al nuevo directorio, manteniendo el mismo nombre simple.
Debe Ud. ser muy cuidadoso con mv, el comando no controla si el archivo ya existe, y borrará cualquier archivo que hubiera con el nombre de destino. Por ejemplo, si ya tengo un archivo de nombre frog existente en mi directorio report, el comando "mv frog report" borrará el archivo /report/frog y lo reemplazará con /frog.
De hecho, existe una manera de lograr que tanto rm, cp, y mv le consulten a Ud. antes de eliminar archivos. Los tres comandos nombrados aceptan la opción "-i" a tal efecto. Si Ud. utiliza un alias puede hacer que el shell ejecute: "rm -i" automáticamente cuando teclee: "rm" . Aprenderá más de estos temas luego en la Sección 9.1.3 en la página 92.