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:
El funcionamiento de la consola es el siguiente:
En GNU/Linux tenemos la posibilidad de ejecutar dos tipos de terminales:
En Windows tenemos 2 tipos de terminal diferente:
cmd.exe
.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:
sudo
al comando lo que hace que se ejecute como si lo ejecutara el usuario root, o bien ejecutarlos siendo el usuario rootEl 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.
En Windows el prompt es el símbolo >
y muestra el directorio actual: C:\Users\batoi
, es decir, el directorio personal del usuario “batoi”.
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.
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).
Si los parámetros son nombres de ficheros podemos utilizar caracteres comodines. Los comodines son:
*
(asterisco): sustituye a cero o más caracteres?
(interrogación): sustituye a un carácterVamos 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-).
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í.
Ver la página de comandos de Windows.
Ver la página de comandos de Powershell.
Ver la página de comandos de GNU/Linux.
La comunicación de la terminal con el exterior se hace, por defecto, mediante 3 dispositivos:
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:
<
: redirecciona la entrada al fichero o dispositivo indicado (poco usual)>
: redirecciona la salida al fichero o dispositivo indicado. Si es un fichero lo creará (y si ya existe lo truncará, es decir, eliminará su contenido)>>
: redirecciona la salida a un fichero y, si ya existe, lo añade al final2>
: redirecciona la salida de error a un fichero o dispositivo&>
: redirecciona tanto la salida estándar como la salida de error a un fichero o dispositivo|
: envía la salida del comando a su izquierda como entrada del comando a su derecha. Se utiliza habitualmente con los filtros (more, find, sort).Ejemplos:
dir C:\Usuarios\juan > ficheros_de_juan
: La lista de ficheros del directorio indicado la guarda en un fichero llamado ficheros_de_juan. Si el fichero existe lo truncarádir C:\Usuarios\juan >> ficheros_de_juan
: La lista de ficheros del directorio indicado la añade al fichero llamado ficheros_de_juan. Si ya existe el fichero añadirá la lista al finalsort alumnos.txt > alumnos_ordenados.txt
: Ordena el contenido del fichero alumnos.txt y envía el resultado al fichero alumnos_ordenados.txtdir | more
: Muestra el contenido del directorio actual pantalla a pantallafind "Alcoi" alumnos.txt | sort >> alumnos_ordenado.txt
: Filtra en el fichero alumnos.txt las líneas que contengan la palabra “Alcoi”, envía esas líneas al comando sort que las ordena y el resultado (los alumnos que son de Alcoi, ordenados) se añade al fichero alumnos_ordenado.txtEn 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:
Get-ChildItem C:\Usuarios\juan | Out-File ficheros_de_juan
: La lista de ficheros del directorio indicado la guarda en un fichero llamado ficheros_de_juan. Si el fichero existe lo truncaráGet-ChildItem C:\Usuarios\juan | Out-File -Append ficheros_de_juan
: La lista de ficheros del directorio indicado la añade al fichero llamado ficheros_de_juan. Si ya existe el fichero añadirá la lista al finalAdemás podemos enviar la salida a un fichero y al monitor con el cmdlet Tee-Object
. Ejemplos:
Get-ChildItem C:\Usuarios\juan | Tee-Object ficheros_de_juan
: La lista de ficheros del directorio indicado la muestra en el monitor y además la guarda en un fichero llamado ficheros_de_juan. Si el fichero existe lo truncaráGet-ChildItem C:\Usuarios\juan | Tee-Object -Append ficheros_de_juan
: La lista de ficheros del directorio indicado la muestra en el monitor y además la añade al fichero llamado ficheros_de_juan. Si ya existe el fichero añadirá la lista al finalAdemá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:
copy prueba.txt PRN
: Copia el fichero prueba.txt del directorio actual al dispositivo PRN, o sea, lo envía a la impresora conectada en el primer puerto paralelo. Es otra forma de imprimir un fichero (seria equivalente al comando PRINT prueba.txt
)copy prueba.txt .. 2> NUL
: Copia el fichero prueba.txt del directorio actual al directorio padre del actual y, si se produce algún error, en vez de mostrarlo por el monitor lo envía a NUL (es decir desaparece)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:
cp prueba.txt .. 2> /dev/null
: Copia el fichero prueba.txt del directorio actual al directorio padre del actual y, si se produce algún error, en vez de mostrarlo por el monitor lo envía a /dev/null (es decir desaparece)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’:
prueba.bat
prueba.ps1
./prueba.sh # Si tiene permisos de ejecución
sh prueba.sh
bash prueba.sh
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
Ver la página de scripts de GNU/Linux.