Uso de la línea de comandos
Intérprete de comandos
1. Rol
Los diseñadores de Ubuntu han realizado esfuerzos considerables para que el uso de Linux sea lo más fácil posible. La complejidad de la administración en la versión Desktop queda ocultada por una interfaz agradable y solo hay que utilizar sus programas sin tener que realizar manipulaciones complejas.
Sin embargo, no es posible proclamarse administrador de Linux (o Ubuntu) sin saber cómo usar la línea de comandos a través del intérprete de comandos. Ya ha visto que el servidor de Ubuntu no tiene una interfaz gráfica, así que el paso por la consola es obligatorio.
La consola está accesible desde cualquier terminal usando las teclas [F3] a [F6].
Presione, por ejemplo, [Ctrl][Alt][F3]. La sesión gráfica desaparece. Se le presenta una ventana de inicio de sesión en modo consola.
Esta le permitirá encontrarse en un ambiente similar al de la versión Server.
Use [Alt][F2] para volver a la terminal en la que se cargó el entorno gráfico o [Alt][F1] para volver a la terminal de inicio de sesión en modo gráfico.
También es posible emular una consola desde el menú Mostrar aplicaciones, haciendo clic en Utilidades - Terminal. Esto es lo que se abrirá:
El usuario tiene, entonces, acceso al intérprete de comandos, que permite ejecutar instrucciones a través del teclado o por medio de un guion devolviendo los resultados. Al intérprete también se le llama shell.
Hay varias shells, cada una con sus propias especificidades, pero Ubuntu elije la shell más común en Linux, la bash (Bourne Again SHell).
La lista de shells presentes en su instalación de Linux está incluida en el archivo /etc/shells. Para verificar qué shell está usando, escriba echo $SHELL y pulse [Intro].
2. El shell y el administrador
El propósito de este capítulo no es el de enseñarle a dominar el shell y su programación (existen, para ello, otros libros disponibles en Ediciones ENI con este objetivo), sino proporcionarle el mínimo de fundamentos y comandos para permitirle explotar su sistema Ubuntu correctamente.
En la práctica, un administrador necesita saber cómo utilizar el shell y, en particular, crear scripts para facilitar su trabajo y evitar las tareas repetitivas....
El editor vi
El editor predefinido de Linux/UNIX se llama vi (visual editor). No es el más ergonómico, pero, a diferencia de nano, está disponible en todos los Linux/UNIX. Es posible instalar una versión mejorada de vi, vim, mediante el comando sudo apt install vim.
vi [opciones] Archivo [Archivo2 ...]
vi no tiene menús, ni interfaz gráfica de usuario, y no es intuitivo. Hay que saber de memoria los métodos abreviados. Pero, una vez dominado, vi demuestra ser rápido y práctico, al punto de que los usuarios se vuelven más eficaces que con los editores de texto.
A continuación, encontrará los comandos de base de vi, que son suficientes en el 99 % de los casos.
1. Funcionamiento
Hay tres modos de funcionamiento:
-
Modo comando: los caracteres introducidos representan comandos. Se accede a ellos pulsando [Esc]. Cada tecla o combinación de teclas desencadena una acción (borrar líneas, insertar, mover, copiar, pegar, etc.).
-
Modo edición: es la entrada de texto clásica.
-
Modo línea de comandos: una línea en la parte inferior de la pantalla permite introducir comandos especiales, confirmados con la tecla [Intro]. Se accede a ella presionando la tecla [:] en el modo comando.
Cuando lanza vi, se sitúa de forma predefinida en modo comando. Para empezar a escribir texto, se debe escribir el comando añadir ([a]) o insertar ([i]): [Esc]+[i] permite introducir texto. Para salir, pase al modo línea de comandos: [Esc]+[:], [q] + [Intro].
En cualquiera de los casos y sin importar lo que pase, si se encuentra perdido, pulse la tecla [Esc] para volver siempre al modo comando.
2. Comandos de base
a. Editar
Las siguientes acciones están en modo comando. Deben precederse por una pulsación de la tecla [Esc]:
Comando |
Acción |
a |
Añadir después del carácter actual (add). |
A |
Añadir texto al final de la línea. |
i |
Insertar delante del carácter actual, como en un procesador de textos (insert). |
I |
Insertar texto al principio de la línea. |
o |
Agregar una línea debajo de la línea activa. |
O |
Insertar una línea por encima de la línea actual. |
b. Salir y guardar
Como recordatorio, los : significan que el comando se escribe en la línea de comando: [Esc]+[:]; introduzca el comando y luego [Intro].
Comando |
Acción... |
Gestión de archivos
1. Sistema de archivos FHS
Un sistema de archivos, llamado comúnmente filesystem o FS, define la organización de datos sobre un soporte de almacenamiento; es decir, cómo gestiona el sistema operativo la organización de archivos.
Linux es un sistema de explotación enteramente orientado a archivos. Todo (o casi todo) se representa por un archivo, tanto los datos como los periféricos o incluso los medios de comunicación (sockets, named pipes, etc.). El sistema de archivos es el corazón de todo sistema Linux/UNIX.
El sistema de archivos de Linux es jerárquico. Describe una arborescencia de directorios y subdirectorios, partiendo de un elemento base llamado raíz o root directory. La jerarquía se llama FHS (Filesystem Hierarchy Standard) e incluye los siguientes directorios:
Rutas |
Contenido |
/ |
Directorio raíz, base del sistema de archivos. |
/bin |
Archivos binarios ejecutables. |
/boot |
Archivos que se requieren para iniciar. |
/cdrom |
Directorio de montaje predefinido para los CD y DVD. |
/dev |
Archivos especiales para los periféricos. |
/etc |
Archivos de configuración del sistema y de diversas aplicaciones. |
/home |
Carpetas personales de los usuarios. |
/lib |
Bibliotecas del sistema. |
/lib64 |
Ídem, pero en 64 bits. |
/lost+found |
Directorio que contiene los archivos huérfanos o dañados que se encuentran después de una verificación del sistema de archivos. Su presencia indica que el directorio actual es la raíz de un sistema de archivos. |
/media |
Directorio de montaje de periféricos temporales (llave USB, CD, disco externo, etc.). |
/mnt |
Directorio de montaje más bien usado para las pruebas del administrador o montajes manuales. |
/opt |
Aplicaciones o bibliotecas adicionales que deberán colocarse en una estructura de árbol específica. |
/proc |
Sistema de archivos virtual que proporciona una interfaz hacia las funciones y parámetros del núcleo. |
/root |
Carpeta del administrador. |
/sbin |
Archivos binarios ejecutables dedicados al administrador. |
/srv |
Datos de los servicios ofrecidos por el sistema. |
/sys |
Sistema de archivos virtual, similar a /proc, pero dedicado principalmente a los periféricos del tipo de bloques. |
/tmp |
Archivos temporales. |
/usr |
Archivos binarios, bibliotecas, fuentes, documentación, etc., que el usuario puede utilizar. |
/var |
Archivos y carpetas de contenidos... |
Buscar
1. Buscar archivos
El comando find permite buscar archivos dentro de una arborescencia del sistema de archivos utilizando criterios y da la posibilidad de actuar sobre los resultados devueltos.
find ruta criterios opciones
El comando find es recursivo; solo hay que especificar un directorio base para que toda la arborescencia sea recorrida a partir de ese directorio. Si bien la sintaxis muy completa, solo se explican aquí algunas nociones básicas. Consulte el manual del comando para más información.
a. Criterios de búsqueda
Los parámetros permiten definir los criterios de búsqueda. Estos criterios, si son varios, se combinan entre sí mediante una conjunción Y (criterio1 Y criterio2).
Criterio |
Búsqueda |
-name, -iname |
Buscar los archivos indicados, según el modelo. -iname no distingue entre minúsculas y mayúsculas. |
-type |
Por tipo de archivo (f: ordinario, d: directorio, etc.). |
-user, -group |
Por usuario o grupo. |
-size |
Por tamaño. El sufijo puede ser b (bloque de 512 bytes), c (bytes) o k (kB). El valor puede ser predefinido: + (más de) o - (menos de). |
-empty |
Archivos vacíos. |
-atime, -mtime, -ctime |
Por fecha de acceso, modificación o cambio, expresada en días, eventualmente precedida por + o -. |
Ejemplo de búsqueda de archivos que terminan en mkv, de más de 4 GB y a los que no se ha accedido durante seis meses:
$ find / -iname...
Redirecciones
1. Canales
Todo flujo de datos que entre o salga de un comando pasa a través de un canal. Es posible desviar el flujo de datos a otro destino (un archivo, por ejemplo) o desde otra fuente. Un sistema UNIX ofrece tres canales predefinidos, llamados canales estándar:
-
Canal 0 o STDIN: la entrada, predefinido como el teclado.
-
Canal 1 o STDOUT: la salida estándar, predefinido como la terminal.
-
Canal 2 o STDERR: la salida de errores, predefinido como la terminal.
2. De salida
El carácter > se utiliza para redirigir la salida estándar (la que normalmente va a la terminal). A continuación, se indica el nombre del archivo donde se colocará el resultado del comando.
$ ls -l > resultado.txt
$ cat resultado.txt
total 1
-rw-r--r-- 1 Administ ssh_user 0 Jul 4 12:04 TOTO
-rw-r--r-- 1 Administ ssh_user 0 Jul 25 15:13 resultado.txt
-rw-r--r-- 1 Administ ssh_user 171 Jul 25 15:13 test.txt
El shell crea primero el archivo y luego ejecuta el comando. Si el archivo no existe, se creará. Si existe, su contenido se sobrescribirá, aunque el comando tecleado sea incorrecto.
Para añadir datos al final del archivo sin sobrescribir su contenido, se utiliza la doble redirección...
Algunos filtros y utilitarios
Un comando filtro es un programa que lee y escribe los datos a través de los canales, modificando la salida.
1. Las tuberías o pipes
Las tuberías o pipes permiten redirigir el canal de un comando directamente al canal de entrada de otro. El carácter que permite esto es |, accesible usando [Alt Gr][1] en los teclados en español.
$ ls -l|wc
57 519 3602
El último comando puede ser en sí mismo objeto de una redirección de salida.
$ ls -l | wc > resultado.txt
2. Buscar líneas
Se trata de extraer líneas de un flujo según diversos criterios. Para ello utilizará el comando grep.
grep [Opciones] modelo [Archivo1...]
El modelo consiste en criterios de búsqueda de tipo texto con posibles secuencias de sustitución. El siguiente comando busca las líneas que contienen «root» en el archivo de los usuarios:
$ grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
He aquí algunas opciones interesantes.
-
-v efectúa la búsqueda inversa: muestra todas las líneas que no corresponden con los criterios.
-
-c solo regresa el número de líneas encontradas, sin mostrarlas.
-
-i no distingue entre mayúsculas y minúsculas.
-
-n indica el número de línea para cada línea encontrada.
Si el criterio comienza con ^, la línea debe iniciar con el criterio.
Si el criterio termina con $, la línea debe finalizar con el criterio.
3. Cortar campos
El comando cut permite seleccionar las columnas y campos de un archivo.
La sintaxis es la siguiente:
cut -cColumnas [fic1...]
o:
cut -dc -fCampos [fic1...]
El siguiente comando proporciona los caracteres de la primera a la quinta columna de un archivo:
$ cut -c1-5 lista
Produ
ratón
disco
panta
tecla
El siguiente recorta los campos separados por :; aquí despliega los directorios personales de los usuarios:
$ cut -d: -f6 /etc/passwd
/root
/bin
/sbin
/var/adm
/var/spool/lpd
4. Contar líneas
El comando wc cuenta líneas, palabras y bytes.
wc [-l] [-c] [-w] [-m] fic1
Opción |
Rol |
-l |
Cuenta el número de líneas. |
-w |
Cuenta el número de palabras. |
-c |
Cuenta el número de bytes. |
-m |
Cuenta el número de caracteres. |
$ wc lista ...
Variables
1. Nomenclatura
El nombre de una variable obedece a ciertas reglas:
-
Puede estar compuesto de letras mayúsculas o minúsculas; números y guiones bajos.
-
El primer carácter no puede ser un número.
-
El tamaño de un nombre es, en principio, ilimitado (tampoco se debe abusar).
2. Declaración y afectación
Una variable se declara tan pronto como se le asigna un valor. La asignación se hace con el signo =, sin espacio ni antes ni después del signo.
var=Hola
3. Acceso y despliegue
Se accede al contenido de una variable colocando el signo $ delante del nombre de la variable:
$ camino=/tmp/eni
$ ls $camino
Atención, porque el espacio tiene un significado especial. El siguiente ejemplo muestra el problema:
$ c=Hola mis amigos
orden “mis” no encontrada
$ echo $c
Hola
Para usar caracteres especiales, hay que bloquearlos uno a uno o ponerlos entre comillas o apóstrofos.
c=Hola\ mis\ amigos # Solución pesada
c="Hola mis amigos" # Solución correcta
c='Hola mis amigos' # Solución correcta
4. Corchetes
Los corchetes {} permiten identificar el nombre de una variable. Imagine la variable de archivo que contiene el nombre del archivo ’lista’. Quiere copiar lista1 bajo el nombre de lista2 usando con una variable:
$ archivo=lista
$ cp $archivo1 $archivo2
cp: falta un archivo como argumento
Pruebe 'cp --help'...
Efectuar pruebas
El comando test permite realizar pruebas de condiciones. El resultado se puede recuperar por medio de la variable $? (código de retorno). Si este resultado es 0, entonces la condición es posible.
El comando test puede remplazarse por medio de corchetes [...] o [[...]]. Se debe respetar un espacio antes y después de los paréntesis. La diferencia entre los corchetes simples y dobles radica en que: los corchetes simples son un atajo hacia la prueba, mientras que los dobles representan la prueba interna del shell. Utilice corchetes dobles, que en principio son más rápidos.
1. Sobre las cadenas
-
[[ -z "valor" ]]: regresa 0 si el valor está vacío.
-
[[ -n "valor" ]]: regresa 0 si el valor no está vacío.
-
[[ "valor1" = "valor2" ]]: 0 si las dos cadenas son iguales.
-
[[ "valor1" != "valor2" ]]: 0 si las dos cadenas son diferentes.
2. Sobre los valores numéricos
Los operadores son los siguientes:
Opción |
Rol |
-eq |
Equal: Igual |
-ne |
Not Equal: Diferente |
-lt |
Less than: Inferior |
-gt |
Greater than: Superior |
-le |
Less ou equal: Inferior o igual |
-ge |
Greater or equal: Superior o igual |
He aquí un ejemplo de test:
$ a=10
$ b=20
$ [[ "$a" -ne "$b" ]]; echo $?
0
3. Sobre los archivos
Todos los operadores sobre los archivos son unarios. La siguiente tabla agrupa algunos operadores...
Procesos
La gestión de los procesos se examinará de forma detallada en el capítulo Tareas de administración. Sin embargo, por ahora, necesita comprender su funcionamiento: cómo ejecutarlos, listarlos y detenerlos.
1. Ejecutar programas
Se inicia un programa escribiendo su nombre. Notará rápidamente que «no se rinde» (el indicador permanece bloqueado) hasta que termina o se interrumpe con [Ctrl][c].
El sistema es, por lo tanto, multitarea y un cierto número procesos ya se están ejecutando en la máquina. Cuando se introduce un comando, el shell crea un nuevo proceso para ejecutarlo; pero nada lo obliga a esperar al mensaje del proceso terminado para devolverle el control: solo hay que agregar Y «&» al final de la línea. Esto se conoce como «ejecutar en segundo plano».
Por ejemplo, para guardar en un archivo el resultado de un ls recursivo desde la raíz, es necesario ejecutarlo en segundo plano debido a la duración del procesamiento (¡lista el contenido de todos los directorios del sistema de archivos!). Este es el comando que se ha de usar:
$ ls -R / > ls.txt 2/dev/null &
[1] 21976
Justo después de la línea de datos, aparece un número; es el PID del nuevo proceso lanzado.
Algunas observaciones sobre el uso de la ejecución en segundo plano:
-
El proceso ejecutado no debe esperar más información, ya que de lo contrario existe el riesgo de confusión entre este comando y el prompt del shell.
-
El proceso lanzado no debe mostrar ningún resultado en la pantalla, ya que se corre el riesgo de que lo que se muestra entre en conflicto con lo que el shell despliega (por ejemplo, una línea que aparece en medio de la entrada de datos).
-
Finalmente, cuando sale del shell, también...
Diversos
1. Cálculos
El bash propone una forma simple de cálculo de números enteros, colocando la operación entre $((...)):
$ a=1
$ a=$((a+1))
$ echo $a
2
$ b=2
$ a=$((a*b))
$ echo $a
4
No es necesario especificar el $ de los nombres de las variables entre doble paréntesis.
2. Longitud de una cadena
Es posible obtener la longitud de una cadena con el carácter # entre llaves.
$ a=Jules
$ echo "Longitud de $a: ${#a}"
Longitud de Jules: 5
3. Sustitución de comandos
El mecanismo de sustitución permite colocar el resultado de comandos simples o complejos en una variable. Coloque los comandos que se han de ejecutar entre acentos graves `:
$ mi_unix=`uname`
$ echo ${mi_unix}
Linux
$ maquina=`uname -a | cut -d" " -f5`
echo $maquina
SMP
Los acentos graves no son siempre ideales para estas operaciones. De hecho, si hay varios niveles, hay que bloquear los que se encuentran en el interior de los primeros. Además, bash permite usar la sintaxis $(…), que no presenta ese problema.
$ mi_unix=$(uname)
$ echo ${mi_unix}
Linux
$ maquina=$(uname -a | cut -d" " -f5)
echo $maquina
SMP
Puesta en práctica
1. Enunciado
Verifique en qué directorio está situado.
Vaya a su directorio personal.
Cree una carpeta llamada «Ejercicios» y desplácese a esa carpeta.
Cree un directorio «cursos» con los subdirectorios «francés», «informática» e «historia».
En cada subdirectorio, cree los archivos vacíos «curso1», «curso2» y «curso3».
Renombre el directorio «historia» a «historiaygeo» y el directorio «cursos» a «cursos2020».
Al mismo nivel que el directorio «cursos2020», cree un directorio «cursos2021». Copie la arborescencia «cursos2020» a «cursos2021».
Cree un enlace hacia «cursos2020/francés/curso1» en el directorio «curso2021/francés» remplazando el archivo existente.
Modifique el contenido del archivo «cursos2020/francés/curso1» y compruebe, abriendo el enlace creado anteriormente, que el contenido ha sido modificado.
Borre el directorio «cursos2020» y su contenido con un solo comando.
Compruebe que el archivo «curso1» todavía existe.
Cree un archivo con el contenido del historial.
Edite este archivo con vi.
Copie las primeras 10 líneas...