Órdenes básicas

De Wikiunix

Órdenes básicas
Explicación a fondo de las órdenes más básicas que se deben conocer en un sistema Unix por su utilización común.
Tiempo 1 hora y 30 minutos
Nivel Usuario iniciado
Bibliografía Unix Guru UniverseManual práctico de Linux - Mark G. Sobell (2008, Anaya, ISBN: 978-84-415-2350-0)
Prerrequisitos Vocabulario básicoSoporte para pruebas
Las órdenes en Unix siguen el patrón básico siguiente:
nombre_orden opciones argumento(s)
  • Las opciones modifican las manera en que funciona la orden. Normalmente consisten en un guión seguido de una única letra. Por ejemplo:
    ls -l
    También pueden utilizarse varias opciones simultáneamente de forma que se indiquen cada una con un guión:
    ls -l -a
    o agrupándolas todas bajo un mismo guión:
    ls -la
  • Muchas órdenes se utilizan con uno o más argumentos. Si el argumento contiene uno o más espacios en blanco es necesario encerrarlo entre comillas " ". Como en este caso:
    ls "directorio uno"
    o bien protegiendo el espacio con una barra inversa:
    ls directorio\ uno
    Las órdenes se vuelven mucho más efectivas cuando se utilizan como argumento expresiones regulares.

Contenido

Sinopsis de una orden

De forma general se sigue un esquema para especificar de forma simple las opciones y los argumentos necesarios para la ejecución de ésta. Esto se denomina "sinopsis".

En esta sintaxis se siguen las siguientes reglas:

  • Opciones o argumentos encerrados entre "[" y "]" (corchetes) se consideran opcionales.
  • Todo lo que no esté encerrado entre corchetes debe ser introducido.
  • Las palabras de negrita se consideran como literales y deben ser escritas exactamente como aparecen. Esto por lo general se aplica al nombre de la orden y a sus opciones.
  • Los argumentos que se muestran en cursiva deben ser remplazados por aquello que representen. Puede ser el nombre de un fichero o directorio.
  • Los puntos suspensivos "..." implican que el argumento previo puede ser repetido tantas veces como se desee.

Trabajando en la terminal

Cambiando de directorio con cd

Cuando se trabaja desde la terminal[1] no importa dónde te muevas: siempre estás en un directorio. En cada momento, el prompt indica en qué directorio nos encontramos y el comando 'pwd' informa de nuestra posición actual en la jerarquía del sistema de archivos. Ojo: cuando navegas por el sistema de archivos en la terminal siempre estarás en algún lugar.

El comando cd (change directory) te permite moverte de un directorio a otro. En jerga Unix, se denomina cambiar de directorio de trabajo, es decir, cambiar el directorio en el cual te encuentras y en el cual puedes actuar o utilizar archivos y directorios sin especificar un camino.

Vamos a probar cómo funciona:

  • Abriendo una nueva terminal, sin desplazarnos a ningún otro directorio, mostramos el contenido del directorio casa ejecutando la órden 'ls'.
    usuario@usuarioPC:~$ ls
    Documentos Escritorio examples.desktop Imágenes Música Plantillas Público Vídeos
  • Para movernos al directorio "Escritorio", introduce lo siguiente:
    usuario@usuarioPC:~$ cd Escritorio
    usuario@usuarioPC:~\Escritorio$
    El "prompt" cambia para reflejar el directorio de trabajo actual.
Si necesitas moverte dentro de una carpeta cuyo nombre contiene más de una palabra, encierra su nombre entre comillas o bien inserta "\" (barra inversa) antes de cada espacio. Por ejemplo, si queremos ir a un supuesto directorio "Mis documentos" tendremos que introducir:
usuario@usuarioPC:~$cd "Mis documentos"
o bien:
usuario@usuarioPC:~$cd Mis\ documentos
Volviendo a donde estábamos, para ver qué contiene, introduce 'ls':
usuario@usuarioPC:~\Escritorio$% ls
user.Desktop
  • Prueba a moverte dentro de los directorios con 'cd' y ver su contenido, utilizando 'ls'. En este momento, probablemente ya no sabes dónde te encuentras en tu sistema de archivos. Utiliza el comando pwd para saber tu posición:
    usuario@usuarioPC:~/Documentos/DocA$ pwd
    /home/usuario/Documentos/DocA
  • Ahora puedes utilizar el comando cd para desplazarte de vuelta en la jerarquía ejecutando cd sin especificar el camino completo de la carpeta a la que quieres volver. Por ejemplo, si quieres volver al directorio /home, introduce:
    user@Equipo:~$ cd /home
    user@Equipo:/home$
    El prompt muestra que estás en el directorio home. Si quieres volver al directorio "DocA" anterior, puedes teclear lo siguiente:
    usuario@usuarioPC:~/home$ cd /usuario/Documentos/DocA
    usuario@usuarioPC:~/Documentos/DocA$
  • Si intentas moverte dentro de un directorio que no existe, o si tecleas erróneamente el nombre del directorio, verás el siguiente mensaje:
    usuario@usuarioPC:~/Documentos/DocA$ cd Intento
    bash: cd: Intento: No existe el fichero ó directorio.

Atajo a casa

Puede parecer que utilizar la órden 'cd' requiere teclear mucho y en su uso básico, puede ser verdad. De cualquier forma, 'cd' también ofrece muchos atajos que permiten navegar rápida y fácilmente por el sistema de archivos. El atajo más útil es teclear solamente 'cd':
usuario@usuarioPC:~/Documentos/DocA:~$cd
usuario@usuarioPC:~$

Así, cd nos devuelve a nuestro directorio casa (/home/usuario en nuestro caso).

Otro dato interesante es la utilización del carácter ~ (virgulilla) como atajo directo al directorio casa del usuario. El sentido de este atajo es que cualquier sistema Unix considera que los usuarios por defecto trabajan únicamente en su directorio casa o en subdirectorios de éste. Así, este atajo te permite moverte fácilmente por estos directorios. Si se quiere ir al directorio "Documentos" que está dentro de tu directorio casa, se puede utilizar:
usuario@usuarioPC:~$ cd ~/Documentos
usuario@usuarioPC:~/Documentos$

Utilizando este atajo se evita tener que introducir la ruta completa del directorio al que se desea ir (en este caso, /home/usuario/Documentos).

Subiendo/Bajando

Cada directorio en tu sistema de archivos contiene como mínimo dos entradas de forma automática. Se trata de . (punto) y .. (punto punto).

Puedes comprobar esto consultando cualquier directorio ya creado o creando un nuevo:
usuario@usuarioPC:~/Documentos$ mkdir Prueba
usuario@usuarioPC:~/Documentos$ cd Prueba
usuario@usuarioPC:~/Documentos/Prueba$ ls -a
. ..

Especificando el parámetro -a a la órden ls, se muestra el contenido de este directorio, incluidos los archivos ocultos. Así puedes confirmar que los únicos archivos en este nuevo directorio son . (punto) y .. (punto punto).

Estos archivos son muy útiles. El primero, . (punto), representa el actual directorio de trabajo, y puede ahorrarte tiempo en ciertos comandos relacionados con archivos dentro de este directorio. El segundo, .. (punto punto), es un atajo al directorio origen o padre: el directorio inmediatamente superior en la jerarquía del sistema de archivos.

Gracias a la existencia de estos archivos, en cualquier directorio se puede hacer lo siguiente:
usuario@usuarioPC:~/Documentos/Prueba$ cd ..
usuario@usuarioPC:~/Documentos$
Como puedes ver en el prompt, al teclear cd .. regresamos al directorio padre de "Prueba", "Documentos". Siempre que te muevas a un subdirectorio utilizando el comando cd, puedes usar cd .. para volver atrás. Pero también te puedes mover hacia arriba en el sistema de archivos desde el actual directorio hasta alcanzar su límite superior (el directorio raíz, "/"):
usuario@usuarioPC:~/Documentos$ cd ..
usuario@usuarioPC:~$ cd ..
usuario@usuarioPC:/home$ cd ..
usuario@usuarioPC:/$

Ahora ya podemos desplazarnos hacia arriba y abajo en la jerarquía del sistema de archivos. Ojo: No existe un atajo para volver al punto desde el que empiezas a moverte (a no ser que éste sea el directorio casa), por lo que tendrás que desplazarte paso a paso, o bien, indicando la ruta completa del directorio para regresar al lugar inicial.

Creación, movimiento y eliminación de ficheros

A continuación, vamos a comprobar como se trabaja con ficheros a nivel de consola.

En la sección anterior, hemos aprendido a crear un directorio para realizar uno de los ejemplos. Por ejemplo, para crear el directorio nuevo dentro del directorio de trabajo actual, tan sólo hay que ejecutar:
mkdir nuevo
Para crear un fichero, se pueden hacer varias cosas:
  • Crear un fichero vacío utilizando
    touch fich.txt
  • Abrir un editor con un nombre de fichero que no exista y editar su contenido directamente. Por ejemplo:
    vi fich.txt
  • Redireccionar la salida de una orden a un fichero que no exista, pero esto lo veremos más adelante.

Ahora bien, una vez que ya sabemos crear ficheros con y sin contenido, también necesitaremos moverlos de una ruta a otra. Para ello se puede:

  • Copiar el fichero de la ruta origen a la destino
    cp origen/fich.txt destino/nuevo_nombre.txt
  • Mover el fichero de la ruta origen a la destino
    mv origen/fich.txt destino/nuevo_nombre.txt

La diferencia entre ambas órdenes es que con la primera, el fichero de origen sigue existiendo tras su ejecución, mientras que con la segunda tan sólo queda el nuevo fichero.

Por último, sólo nos queda aprender a eliminar ficheros y directorios:

  • Para eliminar un fichero:
    rm fich.txt
  • Para eliminar un directorio vacío:
    rmdir directorio
  • Para eliminar un directorio con todo su contenido:
    rm -r directorio

Ojo: Hay que tener mucho cuidado al utilizar la orden rm, puesto que no tiene vuelta atrás. Los elementos que sean borrados con rm no van a una papelera ni a una carpeta desde donde se puedan recuperar: simplemente desaparecen del sistema de archivos.

Ejecución de procesos

Para ejecutar un proceso desde la terminal tan sólo debemos realizar la llamada:
<nombre_proceso>
Por ejemplo, si quisiéramos ejecutar el editor emacs:
emacs
Así estaríamos ejecutando dicho proceso en primer plano (foreground). Si queremos continuar trabajando con la terminal desde la que hemos llamado al proceso tenemos que ejecutarlo en segundo plano (background):
<nombre_proceso> &
En nuestro ejemplo:
emacs &
Para devolver un proceso que se encuentre en segundo plano al primero utilizamos la orden fg:
fg <nombre_proceso>
fg emacs

Ahorrando tiempo

Ejecutar varias órdenes

  • Ejecutar varias órdenes en secuencia: separándolas con ";" (punto y coma)
    cd /home ; ls ; cd
  • Ejecutar varias órdenes como si fueran una sola: separándolas con ";" (punto y coma) y rodeándolas entre "{" y "}" (llaves). Más adelante veremos la diferencia con la forma anterior.
    {cd /home ; ls ; cd ;}
  • Órdenes en más de una línea: colocar "\" (barra inversa) al final de la línea actual y pulsar Intro, apareciendo una nueva línea que comienza por ">" donde deberemos terminar de escribir la orden
    cd \
    >/home

Flujo de datos en la terminal

Cada proceso en entornos Unix suele disponer de tres archivos abiertos al comienzo de su ejecución: la entrada estándar (stdin), la salida estándar (stdout) y la salida de errores estándar (stderr). Se denominan estándar porque suelen estar asignados a descriptores de ficheros conocidos, de manera que un programa siempre tomará los datos de entrada por el descriptor cero, enviará los resultados por el uno y mostrará los errores por el dos. Nota: Esto no se utiliza en sistemas gráficos como X Window o en demonios.

El shell del sistema es el encargado, generalmente, de abrir esta entrada y conectarla con el terminal al que está asignado el programa, puesto que es el programa más usual para comunicarse con un operador.

OJO: Aunque por defecto estén asociados así, la entrada estándar NO es el teclado y la salida estándar NO es la pantalla.

  • Redireccionar las salidas:
    • stdin: con "<"
      orden < fichero
    • stdout: con ">" (reescribe el fichero, en caso de que contenga algo se pierde) y ">>" (añade contenido al final del fichero)
      orden > fichero
      orden >> fichero
    • sterr: con "2>"
      orden 2> fichero
  • Redireccionar stdout y stderr a un mismo archivo (las siguientes formas son equivalentes, pero se suele usar la segunda por rapidez):
    orden > archivo 2>&1
    orden >& archivo
  • Redireccionar salida de varios procesos: agrupar comandos con llaves, separados por ;

Tuberías

Las tuberías (pipes) son mecanismos de comunicación específicos para todos los sistemas Unix. Una tubería, simbolizada por "|" (barra vertical), permite asignar la salida estándar de una orden a la entrada estándar de otra, de la misma forma en que una tubería permite la comunicación entre la entrada estándar de una orden y la salida estándar de otra.

En el siguiente ejemplo, la salida estándar del listado se envía a sort, el cual ordena los resultados en orden alfabético.
ls -al | sort
Esto permite conectar una cierta cantidad de órdenes a través de sucesivas tuberías. En el siguiente ejemplo, se listan todos los archivos del directorio actual, selecciona las líneas que contienen la palabra "zip" y cuenta la cantidad total de líneas:
ls -l | grep zip | wc -l

Trabajar con varios archivos

Existen formas para expandir archivos dentro de una misma línea de órdenes.

  1. Se pueden especificar uno a uno como una lista de caracteres entre "{" y "}" (llaves) y separados por comas (sin espacios).
  2. Con expresiones regulares se pueden denotar varios ficheros cuyo nombre cumpla unas características especiales. Para ello se utilizan metacaracteres (operadores), entre los cuales se encuentra:
  • "*" denota varias apariciones (o ninguna) de la expresión que lo precede
  • "?" denota una aparición de la expresión que lo precede
  • "+" denota una o más apariciones de la expresión que lo precede
  • "[" y "]" sirven para especificar rangos de valores o conjunto

Atajos de teclado

Los atajos de teclado suelen resultar muy útiles a la hora de trabajar en la terminal, puesto que simplifican movimientos bastante comunes:

  • TAB: El tabulador ayuda a autocompletar y muestra opciones para un programa.
  • CTRL - A: Va al comienzo de la línea, igual que la tecla Inicio.
  • CTRL - E: Va al final de la línea, igual que la tecla Fin.
  • META - F: Va a la siguiente palabra.
  • META - B: Va a la anterior palabra.
  • : Muestra el comando anterior del histórico.
  • ![ A - Z +]: Muestra y ejecuta el comando que empiece con la cadena introducida. Por ejemplo,
    !l
    podría ejecutar
    ls
  • !!: Ejecuta el comando anterior.

Esquema general

Redireccionamiento de E/S de Shell
Redirección Significado
> fichero dirige salida estándar o archivo
>> fichero anexa salida estándar o archivo
< fichero toma salida estándar o archivo
2> fichero dirige salida de errores
>& fichero dirige salida estándar y de errores
p1 | p2 conecta salida estándar de p1' con la entrada de p2


Resumen

Las órdenes más comunes que han sido explicadas en este apartado son:

Orden Descripción
pwd Averigua el directorio actual
cd Cambia de directorio
ls Lista el contenido de un directorio
mkdir Crea un nuevo directorio
cat Muestra el contenido de un archivo
cp Copia un archivo
mv Mueve un archivo
rm Elimina un archivo

Referencias


Ejercicios

Ejercicios de la sección de órdenes básicas
Aspectos pedagógicos: Permiten el aprendizaje de órdenes elementales y favorecen la asimilación de trabajo en la terminal. Se trabajará con órdenes muy simples para el procesamiento básico de archivos y directorios, tales como listados, copias, movimiento, creación y borrado entre otras.
Preparación previa: Para hacer estos ejercicios debes acceder al sistema con el usuario por defecto usuario (recuerda que la contraseña es unix). A continuación:
  • Ve al directorio casa del usuario actual. Comprueba que existe un directorio llamado unix y dentro de éste un subdirectorio llamado ordenes_basicas. Para ello ejecuta:
    ls unix
    Debe aparecer el directorio ordenes_basicas. En caso de que no exista alguno de estos elementos, puedes hacer varias cosas:
    1. Descargar el archivo comprimido con la jerarquía de elementos de comprobación que se encuentra en la portada del wiki y descomprimirlo en el directorio casa del usuario actual.
    2. Apagar la máquina virtual y restaurar el snapshot que funcionaba bien.
    3. Apagar la máquina virtual y borrarla eliminando el disco duro virtual. A continuación, descargar el disco duro y volver a configurar la máquina de nuevo.
  • Ve al subdirectorio unix/ordenes_basicas. Limpia el sistema antes de realizar los demás ejercicios para prevenir posibles incongruencias:
    python ordenes.py -c
    o
    python ordenes.py --clean
  1. Crea un directorio llamado nuevo.
  2. Copia el fichero b.txt del directorio antiguo en el nuevo directorio que acabas de crear.
  3. Duplica el fichero b.txt en la misma ruta pero con el nombre bueno.txt.
  4. Copia el directorio antiguo/num al directorio nuevo.
  5. Vuelve al directorio inicial (ordenes_basicas) y ejecuta el primer control intermedio:
    python ordenes.py -p 1
    o
    python ordenes.py --partial 1
Debes haber aprendido a: Queda por aprender:
Copiar ficheros, duplicarlos, crear directorios Mover ficheros, borrarlos,...
  1. Borra el fichero 3.txt dentro de nuevo/num.
  2. Ve al directorio nuevo/num.
  3. Ejecuta la orden pwd y guarda el resultado en el fichero pwd.res en el directorio inicial (ordenes_basicas).
  4. Vuelve al directorio ordenes_basicas y crea un directorio doble con dos subdirectorios internos: primero y segundo.
  5. Mueve el fichero 1.txt de nuevo/num a primero.
  6. Enlaza el fichero enlacea2.txt de segundo al fichero 2.txt de nuevo/num.
    Ojo: El enlace debe ser duro, no simbólico (aunque puedes probar a hacer algún enlace simbólico para ver que es igual de simple).
  7. Lista el directorio nuevo y guarda el resultado en el fichero nuevo.res.
  8. Vuelve al directorio inicial (ordenes_basicas) y ejecuta el segundo control intermedio:
    python ordenes.py -p 2
    o
    python ordenes.py --partial 2
Debes haber aprendido a: Queda por aprender:
Copiar ficheros, duplicarlos, crear directorios, mover ficheros, borrarlos,... Limpieza final del directorio.
  1. Borra todos los ficheros y directorios nuevos que has creado desde que empezaste los ejercicios:
    • El directorio nuevo.
    • El fichero pwd.res.
    • El fichero nuevo.res.
    • El directorio doble.
  2. Vuelve al directorio inicial (ordenes_basicas) y ejecuta el control final:
    python ordenes.py
Tras la realización de estos ejercicios debes tener clara la utilización y el manejo de las siguientes órdenes:
lscpcdmvrm


Si aún sigues teniendo dudas puedes:

  1. Releer el artículo Órdenes básicas de nuevo al completo, o tan sólo las secciones en las que tengas dudas.
  2. Volver a desarrollar los ejercicios de nuevo.
  3. Revisar los artículos creados en el wiki para cada una de las órdenes.
  4. Revisar el manual de las órdenes implicadas (recuerda que tienes los enlaces en los artículos del wiki de cada una y además en está el manual del sistema).
Herramientas personales