lenguaje_del_interprete_de_comandos

¡Esta es una revisión vieja del documento!


Tutorial: Lenguaje del Intérprete de Comandos

La shell interpreta las órdenes que ingresas a nuestro sistema de cómputo y te devuelve los resultados en tu terminal remota.

Si bien dispones de varias shells para elegir, todos las shells Unix suelen derivar del intérprete C shell. Esto implica que algunas características de uso son comunes entre todas ellas, y puede ser muy útil aprenderlas para lograr resultados más útiles.

¡Aprende algunas características en común de los intérpretes de comandos!

La shell recibe los caracteres (letras y símbolos). Sin embargo, alguno de estos caracteres son “especiales”, conocidos como meta-caracteres. Te ofrecerán posibilidades de realizar tareas especiales al ser interpretados de diferentes maneras. Estos caracteres son los siguientes,

  • * ? [ ] se interpretan como “comodines”, y se pueden operar como “atajos” en los nombres de fichero o directorio.
  • & Este carácter envía la ejecución del comandos en segundo plano, y mientras la shell ejecuta dicha órden, tu terminal quedará libre para que puedas continuar realizando otras operaciones.
  • ; Este carácter permite ingresar varios comandos seguidos, y hacerlo en una sola orden. Cada comando debe estar intercedido por un ;. Cuando presiones la tecla Intro cada comando que compone la orden resultará introducido secuencialmente (desde comienzo de la línea hasta el final).
  • \ El caracter de barra invertida permite desactivar la interpretación de los meta-caracteres tales como *, [], &, y ;.
  • "" '…' Los entrecomillados y los interdiéresis desactivan tanto el significado delimitador del espacio entre ellos, así como la interpretación de los caracteres especiales. Sin embargo, las comillas permiten que los caracteres $ y \ retengan su significado especial.
Los caracteres $ y \ se discutirán más adelante y son importante para los programas interpretados.

*

El caracter asterisco * representa todos los ficheros en el directorio actual.

Por ejemplo, podrías utilizar el comando echo - capaz de presentar una cadena de texto en la terminal - y combinarlo con el * para lograr el resultado deseado. Por ejemplo, introduce en tu terminal:

echo *

…y recibirás como eco de respuesta una lista con todos los ficheros del directorio actual.

Por favor, ten especial cuidado al emplear el metacaracter * pues significa “todo lo contenido”. Por ejemplo, si indicas:

ls *.txt

…listará todos los ficheros en el directorio actual que tengan cualquier nombre y la extensión .txt.

Podrías indicar que devuelva una liste de todos los ficheros que contienen una letra s en su nombre de archivo, de esta manera:

ls *s*

Si introduces:

ls reporte*

Podría sería interpretado como “lista todos los ficheros contenidos en el directorio actual, con cualquier letra a continuación de reporte inclusive”. Esto incluiría, por ejemplo:

reporte
reporte1
reporte1a
reporte2b.0.txt
reporte_final_editado.txt
reporte_viejo.bak

?

El signo de interrogación cerrado ? sirve para indicar cualquier único carácter.

Por ejemplo, podrías ordenar:

ls capitulo?

…y te podría devolver:

capitulo1
capitulo2
capitulo3
capitulo4
capitulo5
capitulo6
capitulo7
capitulo8
capitulo9

…pero no listará el capitulo10.

Afortunadamente podrás listar capitulo10 hasta el capitulo99. simplemente ingresando doble signo interrogación ??. Si indincas ??? podrías encontrar tres caracteres.

ls capitulo??

[]

Los corchetes [] permiten delimitar un rango de caracteres determinado. Por ejemplo, si introduces la siguiente delimitación dada:

ls [gpr]ata

…podría recibir en tu terminal el siguiente listado de ficheros:

gata
pata
rata

También podrías indicar rangos entrecorchetados. Esto es muy útil. Por ejemplo, podrías indicar:

cat capitulo[2-4]

…y con ello lograrías presentar en tu terminal los contenidos de los ficheros capitulo2, capitulo3 y capitulo4.

No sólo los números pueden usarse como rango, ya que también podrás delimitar letras. [a-z] responderá a minúsculas, mientras que [A-Z] lo hará con mayúsculas. El resultado suele mostrarse en orden alfabético.

Algunos comandos ejecutados en el shell podrían tardar mucho tiempo en ejecutarse. Podría ser conveniente que dejes esos comandos en segundo plano y liberes tu terminal de modo que puedas continuar ingresando otras órdenes al intérprete.

El carácter et o “ampersand”, el &, se agrega al final de un comando, para provocar su ejecución en segundo plano.

Esto se hace ingresando:

comando &

Por ejemplo, el comando grep se utiliza para realizar búsquedas de cadenas de texto. Podrías usarlo para buscar en segundo plano todas las existencias de la cadena Mengana en todos los ficheros del directorio, de la siguiente manera:

grep Mengana * &

La terminal devolverá un nombre de proceso, el cual estará activo mientras se trabaja. Este número de proceso es esencial para poder eliminarlo.

La ejecución secuencial te permitirá programar tareas complejas e introducirlas de una sola vez.

El carácter punto y coma ; permite ejecutar secuencialmente más de un comando, que podrás emplearlo en tanto los ingreses en una sola línea, de la siguiente manera:

comando1; comando2; comando3;

Por ejemplo, imaginemos necesitar leer tu finger de usuario, desplazarte a tu directorio de usuario, presentar en terminal dicho directorio, y a continuación solicitar un listado del mismo. Para hacer todo ello en una acción concatenada, operarías secuencialmente, de la siguiente manera:

finger $USER; cd; pwd; ls $HOME

El uso de metacaracteres dobles denota diferentes funciones condicionales.

Utiliza && (que es intepretado como “si y solo sí”) para ejecutar el comando1 y si condicionalmente tiene éxito, ejecutar el comando2

comando1 && comando2

…y utiliza || (que es interpretado como “únicamente si no”) para ejecutar un comando1 y si condicionalmente fracasa, ejecutar un comando2:

comando1 || comando2 

El metacaracter de redirección signo mayor que > permite redirigir el resultado (salida) a una localización distinta a la terminal. Podrás redirigir la salida hacia un fichero (si existiese tal fichero previamente, lo reemplazará). Por ejemplo:

who > ~/reporte_logueo.txt
(date ; who) > reporte_logueo.txt

Esto ejecutará el comando date (fecha), luego el comando who, y sus resultados secuencial será escrito en el fichero ~/reporte.logueo.txt.

Si en lugar de usar > utilizas >>, el significado cambia de “sobreescribir en” a “agregar a”.

Revisa el resultado y borra el fichero con:

cat ~/reporte_logueo.txt ; rm  ~/reporte_logueo.txt

Las diéresis abierta ` puede utilizarse para referir un comando. Si se deseara crear una lista de logueos con la fecha, podrías programarla usando todas estas funcionalidades del intérprete de comandos. Por ejemplo, estudia esta secuencia de comandos:

(echo Se loguearon en `date` >> ~/reporte_logueo.txt) ; who >> ~/reporte_logueo.txt

\

La barra invertida \ desactiva la interpretación del meta-caaracter indicado a inmediata continuación.

Supongamos la creación de un fichero de texto llamado estrellas.txt

echo '"El juego de las *"' > estrellas.txt

Desactivar los caracteres especiales entrecomillando

  • '' Si usas diéresis todos los metacaracteres contenidos entre ellas no serán interpretados.
  • "" Si usas comillas todos los metacaracteres contenidos entre ellas no serán interpretados, exceptuando $, \ y '.

Los meta-caracteres no serán interpretados cuando aparecen entrecomillados. La diéresis simple desactiva todos los meta-caracteres, mientras que las comillas lo hacen con todos con excepción de $, \ y '.

Estos delimitadores separan argumentos, y le dicen al intérprete cuando termina un argumento y cuando inicia otro.

Los espacios tiene un significado especial, ya que delimita argumentos en un comando.

Este uso de lenguaje genérico sirve para la mayoría de los intérpretes de comandos. Cada uno de ellos cuenta - sin embargo, con distintas disidencias o particularidades.

Puedes continuar con la Tutorial de Programación en Bash

Fish Shell cuenta con ciertas diferencias.

  • lenguaje_del_interprete_de_comandos.1660074824.txt.gz
  • Última modificación: 2022/08/09 19:53
  • por peron