Bash básico
La "shell" o "línea de comandos"
Lo que comúnmente se conoce como línea de comandos, terminal o consola, son programas que permiten llamar a otros programas para acceder a los servicios del sistema operativo a estos programas que permiten llamar a otros programas e interpretar programas (comandos) se los conoce como shell. Estos programas poseen una interfaz para un usario y además los hay de dos tipos las shell en modo texto, y las gráficas, estas últimas se conocen como entornos gráficos de escritorio
En la mayor parte de las distibuciones GNU/Linux la shell por defecto es bash. Todo el curso se basará en este interprete de línea de comandos.
¿Qué es bash?
Bash es la shell o interfaz de línea de comandos del sistema operativo GNU y se usa en la mayoría de las distribuciones de GNU con Linux, esta basado en la shell de Unix y es compatible con POSIX (Interfaz portable de sistema operativo), fue escrita para el proyecto GNU y es software liberado bajo la licencia GPL, entonces es software libre.
La forma de usar bash es introducir comandos o combinaciones de ellos para hacer tareas, bash posee funcionalidades que facilitan la introducción de comandos, algunos se describirán más adelante.
¿Por qué aprender a usar un "Intérprete de línea de comandos" ?
Dado que el sistema operativo GNU/Linux tiene en su filosofía la idea de "usar un programa con cualquier propósito y sin restricciones", la shell bash permite hacerlo.
Para un usuario "estándar" las tareas más comunes son administrar archivos, leer/editar documentos, trabajos multimedia, navegar por internet, etc. Es muy probable que no haya necesidad de usar bash o cualquier línea de comandos para hacer estos trabajos ya que las interfaces gráficas (shells gráficas) permiten hacerlo de manera simple e intuitiva.
En cambio, si se quiere hacer mucho más que tareas comunes conviene aprender a usar bash. Esto no significa que mediante bash no se pueda realizar tareas comunes. Si abrimos bash y comenzamos a usarla fácilmente podremos administrar archivos, reproducir contenido multimedia, navegar por internet, escribir y leer archivos, etc y también podremos hacer muchas cosas más. Por ejemplo compilar programas, programar tareas, administrar redes de computadoras, administrar completamente el sistema y otras tareas que bajo interfaces gráficas no siempre están disponibles o no están bien dsarrolladas.
En otras palabras, aprender a usar un intérprete de línea de comandos como bash es aprender a usar una herramienta muy poderosa que es a menudo necesaria para realizar ciertas tareas o realizarlas de manera más efectiva.
¿Qué es un comando?
Un comando es un programa, pero generalmente es un programa escrito para actuar en modo texto por tanto carece de interfaz gráfica de usuario, eso no significa que un comando sea un programa menor o que no posea interfaz alguna.
La entrada/salida estándar
Uno de los fuertes de la filosofía del sistema operativo UNIX es:
Siempre que sea posible, Resolver tareas complejas combinando múltiples herramientas simples.
El sistema operativo GNU tomo este principio e implementó también esta característica añadiendo lo que se denominan streams que son series de datos que pueden ser manipuladas.
La entrada estándar
Es el stream de entrada, también conocido como stdin y es la fuente de datos de entrada estándar, usualmente son datos que vienen directamente del teclado de la computadora.
La salida estándar
La mayor parte de los programas en modo texto, envían sus resultados al stream denominado la salida estándar (stdout) que generalmente es mostrada en la pantalla. Entonces, la mayor parte de los resultados de un programa se mostrarán vía la salida estándar y luego esta se muestra en la pantalla.
Standard error
Este stream de salida se dedica a almacenar resultados importantes de los programas como errores, y usualmente también se muestra en la pantalla.
Operadores de redireccionamiento
Es posible redireccionar la entrada/salida estándar usando símbolos especiales para ello, la función de estos operadores se especifíca a continuación:
Operador | Acción |
---|---|
> | Crea un nuevo archivo que contiene el resultado de la salida estándar y si el archivo especificado ya existe se reemplaza. |
>> | Adiciona el contenido de la salida estándar a el archivo específicado y si el archivo no existe se crea. |
2> | Al igual que > crea un archivo, pero usa standard error. |
2>> | Al igual que >> añade contenido a un archivo, pero este proviene de standard error |
&> | Crea un archivo nuevo que contiene el resultado de la salida estándar y standard error, si ya existe es reemplazado. |
< | Envía el contenido de una archivo específico para ser usado como entrada estándar |
<< | Envía el texto introducido a continuación para ser usado como entrada estándar |
<> | Permite que el archivo a continuación se use como entrada y salida estandar |
El redireccionamiento es muy útil para una mejor interacción con la consola, por ejemplo podríamos fácilmente capturar el resultado de cierto comando en archivos o ir registrando el resultado de uno o varios en un sólo archivo.
ls -l > lista_archivos
Que grabará en el archivo lista_archivos> una lista larga de los ficheros en el directorio actual. Esto por que ls tiene la función de listar ficheros y su salida es enviada al archivo nuevo.
lsusb >> disps_usb.txt
Así capturamos la salida estándar de lsusb que lista los dispositivos usb y añade ese contenido al archivo disp_usb.txt. El ejemplo contrario sería:
less < disp_usb.txt
Que enviará al programa less el contenido del archivo disp_usb.txt. less es un visor de archivos con gran cantidad de opciones para salir de less se presiona la tecla q.
Tuberías de datos
En general los programas pueden operar a partir de la salida de otros y para esta tarea existe un símbolo especial que permite "intercomunicar" programas fácilmente. Este es el símbolo | también conocido como "tubería".
Las tuberías se usan para enviar la salida de un programa a la entrada de otro como en:
comando1 | comando2
Que envía la salida del comando1 a la entrada del comando2. Las tuberías pueden usarse en secuencias arbitrarias como:
cmd1 | cmd2 | cmd3 | cmd4 | ..."
Un ejemplo concreto es:
ls | grep ".txt"
Primero se ejecuta ls que listará ficheros y la salida de ls se enviará al comando grep (grep es un programa para filtrar resultados) que filtra la salida y muestra sólo las líneas que contienen .txt. Otro ejemplo puede ser:
ls -lR | grep ".txt" | less
Entonces, ls -lR mostrará ficheros recursivamente y con detalles, el resultado se enviará a grep que una vez más filtrará los resultados y sólo mostrará las líneas que contengan .txt, este resultado se enviará a less y less mostrará ese resultado de manera que sea legible en pantalla y pueda navegarse en varias pantallas de ser el resultado muy grande.
Autocompletado y ayuda en bash
El directorio de trabajo
Cuando abrimos una terminal bash esta apunta a determinado directorio que se denomina el direcotrio de trabajo. Usualmente podemos ver el directorio de trabajo actual escrito justo antes del prompt por ejemplo:
arnold@arnold:~$
arnold@arnold indica el nombre del equipo y seguido de @ más el nombre de usuario. Después viene el símbolo : y el símbolo ~ que es el quivalente al directorio /home/arnold que es el directorio home o "directorio personal" del usuario arnold.
El comando cd es el que se usa para cambiar de directorio por ejemplo:
cd /etc/
Que cambiará el directorio de trabajo de esta terminal al directorio /etc/ e inmediatemente después se mostrará:
arnold@arnold:/etc$
para introducir comandos.
Para evitar confusiones, existe pwd que muestra el direcotrio de trabajo de la terminal actual, entonces basta con escribir pwd para saber sobre que directorio se trabaj actualmente.
Autocompletado
Bash contiene una utilidad predictiva que autocompleta lo que se introduce vía teclado, el autocompletado se logra presionando la tecla tab y a medida que introducimos texto trata de introducir opciones válidas para agilizar la introducción de órdenes.
Por ejemplo, si introducimos el texto gre y presionamos tab al menos dos veces, bash mostrará en la pantalla las posibles opciones para gre. Estas opciones son comandos cuyo nombre contiene la cadena gre y bash las muestra en orden alfabético, como por ejemplo grenum, grep, gresource.
Si no existiera otra opción disponible al presionar tab se autocompletará la única opción y si no se autocompleta entonces significa que bash no puede detectar una opción válida.
El autocompletado es muy útil y no sólo funciona con comandos, por ejemplo si escribimos less y luego presionamos tab (2 veces). Mostrará todas los posibles argumentos válidos para less dentro el directorio actual. Esto es, argumentos posibles, cuando existe una gran cantidad de posibilidades en la pantalla se preguntará si se desea mostrar las n posiblidades respondiendo con y para si o n para no.
Invocando ayuda
Si no se sabe que hace determinado programa o comando, existe el programa whatis que muestra en una línea lo que hace el programa por ejemplo escribiendo:
whatis ls
Obtendremos la respuesta:
ls (1) - list directory contents
Que es una breve explicaión de lo que hace ls.
man
La orden man viene de "Manual" y muestra un manual de un determinado elemento que puede ser un programa, por ejemplo:
man cat
Es el manual del programa cat y para salir de él se hace con la tecla q. Las hojas man tiene sus utilidades como buscar texto y esta diseñado para leer manuales de texto, dentro de man al presionar h se muestra una ayuda básica y para el manual completo de man:
man man
Privilegios
No cualquier usuario puede ejecutar cualquier tarea, los usuarios administradores como el usuario root tiene todo el control sobre la máquina y los usuarios estándar no pueden realizar cambios significativos por que el sistema operativo no lo permite.
Para saber que tipo de usuario ejecuta la terminal actual basta con ver el prompt estándar y si su símbolo es $ significa que las tareas que se ejecutan en la terminal acutal son realizadas por un usuario estándar.
En cambio el símbolo # dice que la terminal la maneja un superusuario o administrador y puede hacer cualquier cambio.
La utilidad sudo permite realizar tareas como otro usuario, por ejemplo al escribir:
sudo comando
Y a continuación escribir la contraseña de superusuario, el comando se ejecutará con esos privilegios, un ejemplo es:
sudo ls /root/
Que luego de introducir la contraseña de administrador mostrará el contenido de la carpeta /root/, si se fuera un usuario estándar y no se escribe sudo se mostrará un error indicando que no se tiene los permisos para ver esa carpeta ya que pertenece al superusuario.
Entonces desde ahora para simbolizar los trabajos que pueden hacerse por un usuario estándar se colocará el símbolo $ como en:
$ comando
Y para tareas que sólo un superusuario puede hacer se colocará #:
# comando
Pero esto no significa que $ o # deben ser incluidos en el comando, sólo representan el nivel de privilegios necesarios para cierta tarea.