Curso de Introducción a Unix - por F.C.

COMANDOS

Lo primero que necesitamos es tener una cuenta. Cuando el administrador del sistema nos abre una cuenta nos dará un username y un password. Para entrar en la cuenta escribimos nuestro username donde pone login. Luego nos pide el password. Tanto el username como el password son sensibles a mayúsculas o minúsculas.

Una vez dentro de la cuenta utilizamos una terminal (por ejemplo una xterm) para ejecutar los comandos.

Podemos empezar por cambiar el password que nos ha dado el administrador del sistema con el comando:
nispasswd
que nos pedirá nuestro password anterior y el nuevo (lo pide dos veces para evitar errores). La elección del password, por razones de seguridad, debe evitar palabras de diccionarios, es conveniente mezclar números con letras o algún caracter especial.

Sintaxis de los comandos

La forma básica de un comando unix consta de tres partes aunque no todas tienen que estar presentes. La primera, que es necesaria siempre, es el nombre del comando. Luego vienen las opciones que son letras que se ponen precedidas del signo - y que le indican al comando que opción deseamos (algunas de estas opciones requieren un argumento). Por último están los argumentos del comando que pueden ser opcionales o no dependiendo del comando en concreto. Si cometemos errores en la sintaxis, como una opción inexistente, se nos indicará por pantalla cual es la sintaxis de ese comando con sus opciones y argumentos, indicando entre corchetes [] los que son opcionales. También podemos ver la sintaxis en la ayuda del comando. Un ejemplo de comando con opciones y argumentos es:
ls -la dir1l

Comandos más usados

Hay una serie de comandos que se usan muy frecuentemente que se describen brevemente en las siguientes secciones.

man

Nos permite obtener ayuda sobre cualquier comando (man nos muestra la página del manual correspondiente al comando).

Típicamente las secciones que trae la ayuda son:

por ejemplo ejecutando:

man man

Se nos muestra la página de ayuda sobre el comando man. En la sección SYNOPSIS se nos muestra las distintas opciones que tiene el comando.

Utilizando la opción -k en el comando man y una palabra clave o frase entre comillas, mostrará el nombre de todos los comandos que en la sección name incluyen esa palabra o frase. Por ejemplo para buscar que comandos pueden servir para copiar ficheros:

man -k 'copy files'

Otra forma de consultar el manual es con el comando xman que nos abre una ventana donde tendremos diferentes opciones. También podemos utilizar en las SUNs el comando answerbook que nos abre un "navegador" donde podemos consultar diferentes documentos no sólo de UNIX (en la nueva versión de Solaris instalada en el instituto ya no esta disponible este comando sino answerbook2 que nos saca la ayuda en Netscape).

Comandos básicos relacionados con directorios

pwd

Nos muestra el directorio en que estamos trabajando.

ls

Nos muestra los ficheros contenidos en un directorio. Tiene varias opciones muy útiles como -l para un formato largo con una serie de características de cada fichero. La opción -a muestra los ficheros ocultos (ficheros que empiezan por el caracter .). Se puede ordenar la salida por diferentes opciones como por fecha o alfabéticamente.

La información que nos muestra cuando empleamos la opción -l es:

Este comando y otros como cp, rm, etc pueden usar una serie de caracteres llamados "wildcards" que nos permiten seleccionar ficheros que siguen un cierto patrón en su nombre. Estos caracteres son:
* Representa cualquier cadena de carcteres
? Representa un sólo caracter
[...] Podemos poner dentro una lista de caracteres que son los posibles para un solo caracter.
Ejemplos:
cp * ~/textos
Copia todos los ficheros del directorio actual al subdirectorio textos de mi home.
Si tenemos una serie de ficheros cap1.tex cap2.tex cap3.tex capitulo.tex, el comando
mv cap?.tex ~
nos moverá los tres primeros a nuestro home.
ls b[Aa]*
Nos hará una lista de todos los ficheros cuya segunda letra sea una A o a y empiecen por b. En los corchetes puede incluirse un rango como por ejemplo [0-5] [a-z] [A-Z], que respectivamente significan cualquier número del 0 al 5, cualquier letra minúscula y cualquier letra mayúscula.

mkdir

Nos crea un nuevo directorio.

rmdir

Borra un directorio.

cd

Cambia de directorio. Se puede dar la ruta completa al directorio (cd /home/...) o podemos darla relativa al directorio en que estamos (este directorio se representa por el caracter . mientras .. representa el inmediatamente superior). También podemos dar la ruta relativa a nuestro home con el caracter ~ (cd ~/texto). Para ir a nuestro home basta con ejecutar cd sin argumentos.

Comandos básicos relacionados con el manejo de ficheros

cp

Es el comando para copiar ficheros, por ejemplo:
cp unix.tex ~/curso/texto.tex
copia el fichero unix.tex a /home/fcabrera/curso/ cambiandole el nombre a texto.tex . La opción -i nos preguntará si queremos que sobreescriba en el caso de que el nombre del fichero coincida con el de otro fichero que ya existe. La opción -r permite copiar directorios incluyendo todos los ficheros y directorios que cuelgan de él.

mv

Es similar al comando anterior pero no hace una copia sino mueve el fichero (lo cambia de nombre). También está disponible la opción -i.

rm

Borra ficheros. También está la opción -i que nos pide confirmación para borrar cada fichero y la opción -r para borrar todos los ficheros que cuelguen de un directorio.

ln

Permite realizar links entre ficheros. Cada fichero tiene un inode number y al menos un nombre. La correspondencia entre un inode y el nombre es un link y podemos asociar varios nombres a un mismo fichero. Para crear un link ejecutamos el comando:
ln filename1 linkname
Se puede también hacer un link de varios ficheros a un directorio. Sin embargo no podemos hacer links entre directorios, esto sólo lo puede hacer el super-user. Si queremos hacer un link entre directorios hay que utilizar la opción -s que crea lo que se llama un link simbólico. Por ejemplo para hacer un link simbólico a un directorio llamado /net/oso/scratch/fcabrera desde nuestro home llamandolo scratch sólo tenemos que situarnos en nuestro home y ejecutar:
ln -s /net/oso/scratch/fcabrera scratch
Ahora tendremos en el home un directorio scratch que al acceder a él acccedemos a /net/oso/scratch/fcabrera . No es una copia de este directorio sino que físicamente sólo existe el directorio en el disco. También es necesario usar la opción -s entre ficheros normales, si se encuentran en dispositivos físicos distintos. Para borrar un link se usa el comando rm que no borra el fichero sino el link a ese fichero. Por ejemplo:
rm scratch
no borra el directorio sino el link a /net/oso/scratch/fcabrera.

find

Permite buscar un fichero en la estructura de directorios. Hay varias opciones de busqueda como por ejemplo para buscar los ficheros con un determinado nombre, ficheros que tengan un determinado tamaño, que hayan sido modificados en los últimos n dias etc. Por ejemplo:
find . -name text
buscará cualquier fichero que se llame text que se encuentre en el directorio actual o cualquiera que cuelgue de él.
Otro ejemplo que muestra una sintaxis más complicada es el siguiente:
find . \( -name a.out -o -name '*.o' \) -mtime -3 -exec rm {} \;
Que borrara los ficheros a.out y los que terminen en .o que han sido modificados en los últimos 3 dias. La barra \ antes del paréntesis es para evitar que la shell le de un significado especial, las comillas son necesarias cuando se utilizan wildcards en los patrones de busqueda.

Comandos útiles para trabajar con ficheros de texto son:

page y more

Para mostrar un fichero por pantalla de forma que espere cuando el terminal este lleno a que pulsemos alguna tecla.

cat

Encadena una lista de ficheros escribiendolos uno a continuación de otro en la salida estandar.

grep

Busca un patrón de caracteres en uno o varios ficheros. Nos mostrara las lineas en que encuentre el patrón y si la busqueda se realiza en más de un fichero nos indica primero el nombre del fichero. Por ejemplo el comando:
grep -i galaxia *.tex
Nos motrara cada linea que contenga la palabra galaxia en cualquier fichero con extensión .tex, indicando en que fichero se encuentran. La opción -i indica que no importa si es en mayusculas o minusculas.

sort

Permite ordenar las líneas de uno o varios ficheros, hay varias opciones para realizar la ordenación. Por ejemplo:
sort l1 l2 +1
ordena los ficheros l1 y l2 por la segunda palabra (+1) y la salida es dirigida a la salida estandar.

diff

Muestra las diferencias línea pínea de dos ficheros de texto.

cmp

Compara dos ficheros y nos muestra el byte y número de línea donde ocurre la primera diferencia.

head y tail

El comando head muestra las n primeras líneas de un fichero y tail las últimas líneas.

Comandos útiles para examinar el espacio en disco memoria, procesos, usuarios, etc

df

Para ver la cantidad de espacio en disco. La opcion -k nos lo da en kilobytes.

du

Nos da la cantidad de disco usado por el directorio y todos los subdirectorios que cuelgan del directorio especificado. La opción -k nos lo da en kilobytes.

quota

Con la opción -v nos muestra la cantidad de espacio que tenemos de cuenta en el home y la que tenemos ocupada.

top

Nos muestra en pantalla los procesos que ocupan más CPU con el porcentaje correspondiente, así como otras informaciones como memoria de la máquina, memoria utilizada. La información se va actualizando periodicamente.

ps

Nos permite ver los procesos que se están ejecutando.

who

Para saber quien está conectado a la máquina en la que estamos trabajando.

rusers

Nos muestra quien está en cada máquina del sistema. La opción -l nos da información más detallada de cada uno.

whereis o which

Localiza un comando, es decir nos muestra la ruta de acceso del fichero ejecutable.

finger

Muestra información sobre los usuarios como username, nombre completo, cuando a leido su mail por última vez, si está o no conectado y desde donde, etc. Podemos crear un fichero en nuestro home con el nombre .plan cuyo contenido se mostrará cuando alguien haga un finger. Podemos utilizar el username si lo sabemos, o bien buscar por el nombre o apellidos reales.

Redirección de comandos y pipes

Redirección de comandos

Cualquier dispositivo conectado al sistema (impresoras, terminal, dispositivo de audio, mouse, etc), es considerado por UNIX como un fichero.

Los comandos pueden necesitar leer y escribir información. Normalmente lo hacen en la standard input y standard output que es el terminal. Sin embargo ambas pueden redireccionarse a otros ficheros, tanto ficheros normales como dispositivos físicos.

Para redireccionar la entrada estandar se usa < seguido del nombre del fichero. Por ejemplo:
mail fcabrera < file1
Envía un mail a fcabrera tomando como texto el cotenido del fichero file1.

Para redireccionar la salida estandar hay varias opciones (>, >&, >!, >&!, >>, >>&, >>!, >>&!) seguido del fichero al que se dirige la salida.

> Envía el resultado del comando a un fichero reescribiendolo, si se añade & se envían también los erroes, si se añade ! se asegura que se pueda escribir al fichero aunque tengamos definida la variable noclobber que evita la sobrescritura.

>> Envía el resultado a un fichero pero añadiendolo al final. En este caso si esta definida la variable noclobber se produciría un error si el fichero no existe previamente, a menos que añadamos !.

Ejemplos:
cat sound.au > /dev/audio
Enviará el fichero de sonido sound.au a /dev/audio, que es el fichero asociado al dispositivo de audio.
crypt zyxst < texto > texto.crypt

Este comando toma como entrada el fichero texto, lo codifica con la clave zyxst y lo escribe en el fichero texto.crypt.

Pipes

Se denomina un "pipeline" a una serie de comandos separados por | o |&. En el primer caso la salida estandar del primer comando es direccionada a la entrada del segundo, mientras |& redirecciona la salida estandar y los errores.

Los pipelines y los comandos pueden separarse por ; y se ejecutan secuencialmente, o pueden separarse con condicionales. && ejecuta el segundo pipe si el primero se ejecuta sin errores (standard error es 0). || ejecuta el segundo pipe si se produce un error en la ejecución del primero (standard error distinto de 0).

Ejemplos:
Para contar el número de usuarios de la máquina en que estamos trabajando
who | wc -l
who tiene como salida una línea con información por cada usuario conectado a la máquina. Esto es enviado a la entrada del comando wc -l, que cuenta el número de líneas.

El siguiente ejemplo muestra los procesos ordenados por el porcentaje de CPU que emplean.
ps -feao ruser,pid,pcpu,etime,comm | sort -r +2 | more

ps muestra los procesos en un determinado formato, el resultado es ordenado por el comando sort y se muestra por pantalla empleando el comando more.

El ejemplo:
tar -cvf /dev/rmt/0lbn . || (tar -cvf /scfratch/fcabrera/backup .; compress backup; cp ) &
Primero produce un backup del directorio en que estamos en un dispositivo magnético. En caso de que fallara se haría un backup al disco de scratch y lo comprime para ahorrar espacio.

El uso de las comillas en UNIX

UNIX trata de forma diferente los caracteres especiales dependiendo de si sencuentran entre comillas, y del tipo de comillas que sean. Vamos a ver varios ejemplos utilizando el comando echo, que simplemente escribe sus argumentos en la salida estandard separados por espacios y terminando con un retorno de línea.

Las dobles comillas

Veamos los siguientes ejemplos:
echo *
echo "*"
En el primer caso la shell sustituye * por los nombres de todos los ficheros en ese directorio separadeos por espacios. En el segundo caso el resultado nos muestra por pantalla el caracter *. Esto se debe a que las comillas impiden la sustitución de * por nombres de ficheros tratandolo como un caracter sin significado especial.

Otros caracteres que pierden su significado especial entre las comillas son *, ?, >, <, >>, |. Además las dobles comillas también mantienen el significado de los espacios en blanco.

Comillas simples

El uso de las comillas simples puede producir resultados diferentes como por ejemplo:
echo $shell

echo "$shell"

echo '$shell'
Los dos primeros casos tienen el mismo efecto y muestra por pantalla el valor de la variable shell. Esto se debe a que el caracter $, que sirve para referirse al valor de una variable, no pierde su significado dentro de las dobles comillas. Sin embargo esto si sucede dentro de las comillas simples y el resultado en el tercer caso es mostrar por pantalla $shell. También pierden su signicado los caracteres especiales que pierden su significado en las dobles comillas, así como las dobles comillas.

El caracter \

Este caracter sirve para quitar cualquier significado especial que tenga para la shell el caracter que va a continuacion de \ . Por ejemplo:
echo \$shell
como resultado muestra por pantalla $shell.

Las comillas simples invertidas

El significado de las comillas invertidas es completamente diferente. Se emplea encerrando en estas comillas un comando y el resultado es ejecutar el comando insertando la salida en el punto de la línea de comandos donde se encuentra el comando. Por ejemplo:
echo La fecha de hoy es `date`
man `ls`

En el primer caso se ejecuta el comando date insertando el resultado al final de la frase. El segundo dará probablemente error, pues tratará de buscar una página del manual de ayuda para comandos que se llamen como cada uno de los ficheros del directorio. A no ser que algún fichero tenga nombre de comando, el resultado será que no encuentra la página del manual para cada nombre de fichero. Las comillas invertidas mantienen su significado dentro de las dobles comillas, pero no dentro de las comillas simples.