materials

La interfaz de texto

Introducción

Una de las funciones del sistema operativo es hacer de intermediario entre el usuario y el equipo: el sistema operativo le proporciona una interfaz para comunicarse con el ordenador. Las interfaces pueden ser de dos tipos:

Los primeros sistemas operativos sólo tenían la interfaz de texto. La interfaz gráfica facilita enormemente su uso puesto que ahora no es necesario conocer multitud de órdenes, y entonces, ¿por qué usar la línea de comandos?. Las razones son varías:

Conceptos básicos

La consola

El funcionamiento de la consola es el siguiente:

Para abrir una terminal en GNU/Linux se puede hacer desde el menú o usando el atajo Ctrl+Alt+T. Además en cualquier distribución Linux, junto a la terminal gráfica que usamos por defecto se crean 6 terminales de texto a las que podemos acceder con Ctrl+Alt+F1, …, Ctrl+Alt+F6. La terminal gráfica suele ser la 7 (Ctrl+Alt+F7).

En Windows tenemos 2 tipos de terminal diferente:

CMD

PowerShell

PowerShell incluye alias para muchos de sus cmdlets lo que permite ejecutarlos usando los comandos CMD y también en muchos casos los comandos de GNU/Linux. Por ejemplo para obtener el listado de ficheros de la carpeta C:\ podemos usar el cmdlet

Get-ChildItem -Path C:\

o bien uno de sus alias

dir C:\
ls C:\

Windows no diferencia entre mayúsculas y minúsculas así que podemos usar los comandos y sus argumentos en mayúsculas o en minúsculas. Linux sí que lo hace y todos sus comandos están en minúsculas.

Desde la terminal está restringida la ejecución de algunos comandos de administración. Para ejecutarlos debemos hacer:

El prompt

El lugar donde el usuario escribe una orden en el símbolo del sistema se llama prompt. Es el símbolo que muestra el sistema operativo para indicar que está preparado para recibir órdenes. Además muestra información como el directorio actual o, en el caso de Linux, el nombre del usuario y del ordenador.

Prompt Windows

En Windows el prompt es el símbolo > y muestra el directorio actual: C:\Users\batoi, es decir, el directorio personal del usuario “batoi”.

Prompt linux

En Linux el prompt de cualquier usuario (excepto root) es $ y la información que muestra es el usuario (batoi), el nombre del ordenador (pc-juanbatoi) y el directorio actual (~, que significa el directorio personal del usuario, es decir, /home/batoi). El símbolo @ separa el usuario y el ordenador y el símbolo : separa el ordenador del directorio actual.

Prompt root

En Linux el prompt del usuario root es #. La información mostrada es la misma que antes, pero en este caso el directorio actual no es el directorio personal de root por lo cual no pone ~).

El directorio actual es el directorio en el cual nos encontramos en este instante y en el cual se ejecutará la orden. Si, por ejemplo, la orden es de crear el directorio “prueba” (mkdir prueba) ese directorio se creará en el directorio actual. En los ejemplos anteriores se crearía dentro de /home/batoi (en los ejemplos de Linux) y dentro de C:\Users\batoi (en el ejemplo de Windows).

Comodines

Si los parámetros son nombres de ficheros podemos utilizar caracteres comodines. Los comodines son:

Vamos a ver algunos ejemplos en los que utilizaremos el comando copy. Se trata de un comando de Windows que permite copiar ficheros y al que se le pasan 2 parámetros: el primero el nombre del fichero a copiar y el segundo la ruta donde lo copiaremos:

copy inf*.txt C:\Users\juan\prueba

Esta orden copiará todos los ficheros cuyo nombre empieza por “inf” seguido de cualquier carácter y cuya extensión es “.txt”, del directorio actual al directorio C:\Users\juan\prueba (copiará inf.txt, informe.txt, informacion_junio.txt, etc pero no informe.doc, mi_informe.txt, …)

copy *_junio.doc C:\Users\juan\prueba

Copia todos los ficheros cuyo nombre acaba por “_junio” y cuya extensión es “.doc”, del directorio actual al directorio C:\Users\juan\prueba (copiará informe_junio.doc, ventas_junio.doc, etc pero no informe_junio_clientes.doc, informe_junio.txt, …)

copy *.* C:\Users\juan\prueba

Copia todos los ficheros (con cualquier nombre y extensión) del directorio actual al directorio C:\Users\juan\prueba

copy ma?o.jpg C:\Users\juan

Copia todos los ficheros cuyo nombre es “ma”, una letra cualquiera y “o” y cuya extensión es “.jpg” del directorio actual al directorio C:\Users\juan (copiará mano.jpg, mazo.jpg, etc pero no marzo.jpg -2 letras- ni mao.jpg -0 letras-).

Rutas

A la hora de usar ficheros y directorios como parámetros de los comandos tenemos que tener claro lo que son las rutas y tendremos que ser capaces de usar tanto rutas absolutas como relativas según convenga.

Vimos las rutas al hablar de los sistemas de archivo pero puedes repasarlo aquí.

Comandos de la consola CMD

Ver la página de comandos de Windows.

Comandos PowerShell

Ver la página de comandos de Powershell.

Comandos de GNU/Linux

Ver la página de comandos de GNU/Linux.

Redireccionamiento de comandos

La comunicación de la terminal con el exterior se hace, por defecto, mediante 3 dispositivos:

Operadores de redireccionamiento

Cómo hemos comentado, la entrada y salida por defecto es el teclado y el monitor, por ejemplo si ejecutamos en Windows el comando DATE muestra la fecha actual por el monitor y espera que introduzcamos una nueva fecha por el teclado.

Pero es posible redireccionar la entrada y la salida para que se utilice otro dispositivo, un fichero o incluso otro comando. Los operadores que lo hacen posible son:

Ejemplos:

En Powershell podemos utilizar igual los operadores de redirección >, 2> y | (no < que no está implementado) pero además podemos redireccionar la salida con el comando Out-File que guarda la salida en el fichero que le indiquemos. Ejemplos:

Además podemos enviar la salida a un fichero y al monitor con el cmdlet Tee-Object. Ejemplos:

Dispositivos

Además de enviar la salida a un fichero (que es lo más habitual) podemos enviarla a un dispositivo del equipo, aunque no es muy común.

En Windows a los dispositivos estándar de entrada y salida se los conoce como consola (o abreviado CON). Los dispositivos que se utilizaban en la consola tradicional CMD son:

Podemos utilizar estos dispositivos en los comandos. Por ejemplo:

En GNU/Linux todos los dispositivos se tratan como ficheros y se encuentran dentro del directorio /dev. La comunicación del sistema con el exterior se hace, por defecto, mediante 3 dispositivos:

También hay un dispositivo especial que es como un agujero negro donde desaparece todo el que se le envía denominado null (/dev/null) y que se usa a veces en los comandos. Ejemplo:

Scripts

En ocasiones para hacer una tarea tenemos que ejecutar una serie de comandos y a veces esa tarea tiene que ejecutarse repetidamente.

Para automatizar ese tipo de tareas se crearon los ficheros de proceso por lotes o scripts, que son un fichero de texto que en cada línea tiene un comando. Cuando ejecutamos un fichero de proceso por lotes lo que pasa es que se ejecuta tras otro los comandos que contiene.

En Windows este tipo de fichero tienen extensión .bat si contiene comandos CMD o .ps1 si son comandos Powershell y se ejecutan tecleando su nombre en el prompt del sistema. En GNU/Linux su extensión es .sh y pueden ejecutarse poniendo su nombre y su ruta si tienen permisos de ejecución o anteponiendo al nombre el shell con el que queremos que se ejecuten (sh, bash, …). Por ejemplo para ejecutar el script ‘prueba’:

Vamos a ver algunos ejemplos simples de scripts CMD.

Ejemplo 1 - Haz un fichero de proceso por lotes que limpie la ventana y a continuación muestre la hora y fecha actuales y el contenido del directorio raíz del disco C:

El fichero se llamará info_raíz.bat y su contenido será:

@ECHO OFF
CLS
ECHO La hora actual es
TIME /t
ECHO El día actual es
DATE /t
ECHO El contenido del directorio raíz del disco C es
DIR C:\

La primera línea del ejemplo es para que no se muestre en la ventana cada comando que va a ejecutarse. Para ejecutar el fichero en la línea de comandos escribiremos info_raíz.bat.

El mismo script para Linux sería:

#!/bin/bash
clear
echo La fecha y hora actual es
date
echo El contenido del directorio raíz es
ls /

La primera línea indica que se espera que se ejecute con el shell bash.

Podemos pasarle parámetros a un fichero BAT igual que hacemos con los comandos normales. Para acceder desde el fichero .bat a cada parámetro utilizamos %1 para el primer parámetro, %2 para el segundo, etc. En un fichero .sh se hace con $1, $2, etc.

Ejemplo 2 - Haz un fichero de proceso por lotes que limpie la ventana y a continuación muestro la hora y fecha actuales y el contenido del directorio pasado como parámetro.

El fichero se llamará info_dir.bat y su contenido será:

@ECHO OFF
CLS
ECHO La hora actual es
TIME /t
ECHO El día actual es
DATE /t
ECHO El contenido del directorio %1 es
DIR %1

Para ejecutar el fichero en la línea de comandos escribiremos el nombre del fichero seguido del nombre de un directorio, por ejemplo info_dir.bat C:\Windows. Al ejecutarse el fichero la última línea se convertirá a DIR C:\Windows y se mostrará el contenido de ese directorio.

El mismo script para Linux sería:

#!/bin/bash
clear
echo La fecha y hora actual es
date
echo El contenido del directorio $1 es
ls $1

Scripts en GNU/Linux

Ver la página de scripts de GNU/Linux.