El shell rc es un intérprete de comandos simple e innovador creado para la familia de sistemas operativos Plan 9. Actualmente es parte de plan9portque es un paquete de software Plan 9 que está disponible para Linux.
Rc tiene como objetivo mejorar el shell UNIX predeterminado e introduce una sintaxis más limpia para escribir scripts. También está construido para ser tan simple de entender como sea posible. Esto hace que rc sea un buen programa para alguien que quiera aprender cómo funciona un shell.
¿Qué es Plan 9?
En un sentido básico, Plano 9 es el sucesor del sistema operativo UNIX. Fue desarrollado por Bell Labs como un proyecto experimental desde principios de la década de 1980 hasta 2015. Desde entonces, un grupo de voluntarios ha estado manteniendo el sistema operativo y todavía ve actualizaciones ocasionales hasta el día de hoy.
Plan 9 tiene como objetivo producir un sistema simple y accesible tanto para desarrolladores como para usuarios. Lo hace implementando y mejorando el concepto básico de UNIX. Como tal, Plan 9 incluye muchos comandos similares a UNIX y otros similares a UNIX, como cp
, mv
y rm
.
Además, también agrega una serie de nuevas utilidades y funciones que son exclusivas del sistema operativo. Por ejemplo, sam es un poderoso editor de texto que puede controlar completamente usando expresiones regulares.
Una de las características más innovadoras de Plan 9 es la carcasa rc. Es un intérprete de comandos similar a Bash y le permite crear scripts que luego puede usar para automatizar su máquina. rc también tiene como objetivo simplificar la forma en que crea estos scripts eliminando todas las funciones innecesarias y redundantes.
Instalación de la carcasa Rc
Instalar el shell rc en Linux es relativamente sencillo.
- Copie el repositorio Git de las herramientas de Plan 9 en su máquina. Puede hacerlo instalando Git y ejecutando los siguientes comandos:
git clone /home/$USER/plan9port cd plan9port
- A continuación, ejecute el script de instalación que viene con el repositorio. Este es un script simple que compila un generador de Plan 9 que, a su vez, compila el resto de las utilidades. Para hacer esto, debe ejecutar lo siguiente:
./INSTALL
- Una vez hecho esto, ahora puede usar las utilidades de Plan 9 yendo al directorio bin del repositorio. Por ejemplo, escribiremos
./bin/acme
para ejecutar un editor de texto gráfico.
- Una cosa importante a tener en cuenta es que estos comandos solo funcionarán mientras esté en el directorio «bin» de plan9port. Para usarlos en otros lugares, debe agregar este directorio en particular a su variable «RUTA». Para hacerlo, debe abrir el archivo «.bash_profile» en su directorio de inicio:
nano /home/$USER/.bash_profile
- Agregue la siguiente cadena de texto al final de su variable «RUTA»:
:/home/$USER/plan9port/bin/
Guarde y salga del archivo y reinicie rc shell.
Uso y escritura de scripts Rc básicos
Una vez hecho esto, ahora puede comenzar a crear secuencias de comandos en rc. Para acceder a este shell, todo lo que necesita hacer es ejecutar el siguiente comando:
9 rc
Hacer eso cambiará el indicador de su terminal a «%». Esto indica que ahora está dentro del shell rc. Desde aquí, aún puede acceder a todos sus archivos, así como a los comandos tradicionales de Linux. Por ejemplo, escribiremos ls
para obtener una lista del directorio actual.
Variables y operadores de archivos
Uno de los usos más comunes de un lenguaje de shell es almacenar valores arbitrarios y manipular archivos. En este sentido, rc shell se comporta exactamente como Bash.
- Escribiremos lo siguiente para crear una variable con el nombre “prueba” y asignarle la palabra “hola”:
test=hello
- A partir de ahí, escribiremos el siguiente comando para agregar la variable de prueba al archivo «world.txt»:
echo $test >> world.txt
- Por otro lado, también es posible indicar al operador de lectura que use el contenido de un archivo como entrada para un programa:
cat < world.txt
Uso de UNIX Pipes en Rc Shell
Otra función común en los lenguajes de shell es la capacidad de crear conductos UNIX. Este es un tipo especial de operador de archivo en el que puede pasar la salida de un programa a la entrada de un programa diferente.
Similar a las funciones anteriores, rc shell sigue en gran medida la sintaxis tradicional de Bash al crear tuberías UNIX.
- Ejecutaremos el siguiente comando para pasar el contenido del archivo «world.txt» a un buscapersonas del sistema:
cat world.txt | less
- Debemos señalar aquí que las tuberías UNIX en rc no son lineales. Esto significa que es posible pasar la salida de dos programas activos en la entrada de un solo programa. Por ejemplo, podemos ejecutar el siguiente comando para comparar la salida de dos programas:
cmp <{echo hello} <{echo helloo}
Encadenamiento de comandos en Rc Shell
Además de usar tuberías UNIX, también es posible encadenar diferentes comandos en rc shell. Esto le permite ejecutar programas en secuencia sin necesidad de escribirlos en líneas separadas. Echa un vistazo a este comando que te permite ejecutar less
despues de correr echo
:
echo hello-world >> hello.txt; less hello.txt
Además, rc también le permite verificar el código de estado de un programa antes de ir a un comando adyacente. Esto puede ser útil si su programa depende del éxito o fracaso de otros programas.
Para ello, rc proporciona dos operadores: &&
» y ||
. Estos son caracteres especiales que puede usar para reemplazar el símbolo de punto y coma.
- Él
&&
El operador le dice a rc que encadene y ejecute programas siempre que el comando en el lado izquierdo se ejecute correctamente. Esto es útil en situaciones en las que necesita que toda la cadena funcione correctamente. - Él
||
El operador le dice a rc que encadene y ejecute programas si el comando del lado izquierdo no se ejecuta. A diferencia del operador anterior, esto es increíblemente útil si está tratando de solucionar problemas en sus scripts y programas.
Sabiendo eso, puede usar estos operadores para crear comandos que pueden poner en cola y verificar programas. Por ejemplo, le indicaremos a rc que solo ejecute touch
si mkdir
se ejecuta con éxito:
mkdir ./hello && touch ./hello/world
Uso de cadenas y listas en Rc Shell
Una de las mayores diferencias entre Bash y rc shell es el enfoque de este último en simplificar el uso de texto sin formato. En el shell tradicional, el texto y las cadenas suelen ser difíciles de declarar en funciones y variables.
Este problema se debe en parte al hecho de que hay dos formas de declarar una cadena en Bash. Es posible incluir texto entre comillas simples y dobles para tratar una palabra como una cadena.
Como tal, rc tiene como objetivo reducir esta complejidad utilizando solo comillas simples al declarar cadenas. Hacer esto le permite usar caracteres especiales y de control sin ningún problema.
Al usar este comando, convertiremos un corchete en una cadena sin ningún carácter de escape:
# rc hello='[world]' # bash hello='[world]'
Además, rc también le permite manipular estas variables de cadena y compilarlas directamente como una lista. Esto puede ser especialmente útil si desea crear un script que almacene variables en una matriz simple.
Para hacer esto, todo lo que necesita hacer es encerrar un grupo de cadenas entre paréntesis. Como tal, escribiremos lo siguiente para crear una variable con 5 elementos dentro:
shop=(eggs milk cheese rice beef)
Sabiendo eso, puede usar una variedad de comandos para extraer datos de una matriz. Por ejemplo, este comando extraerá los primeros tres elementos de una matriz:
echo $shop(1 2 3)
Control de flujo básico en Rc Shell
Además de ser un shell simple, rc también es un lenguaje de programación completo. Esto significa que es capaz no solo de manipulación básica de cadenas, sino también de ramificación lógica similar a Python.
Rc le permite crear fácilmente declaraciones si-entonces, bucles for y la capacidad de definir funciones complejas. Esto puede ser increíblemente útil si recién está comenzando con la programación.
Uso de declaraciones condicionales
Una de las características más básicas de los lenguajes de programación es la capacidad de crear declaraciones condicionales. Estas son estructuras que le dicen a un programa qué hacer dependiendo de la circunstancia en la que se encuentre. Por ejemplo, puede decirle a un programa que solo se ejecute si tiene un valor de 1.
Puede escribir una declaración condicional para rc en una sola línea:
if ( condition ) program
- El campo «condición» es una lista de comandos que rc intentará ejecutar. La forma en que funciona es que cualquier programa que se ejecuta con éxito proporciona un valor de «verdadero».
- El campo «programa», por otro lado, depende del valor «verdadero» del campo de condición para ejecutar cualquier comando que le dé.
A diferencia de Bash, este enfoque le permite usar casi cualquier tipo de programa para la declaración condicional de un script. Por ejemplo, puede decirle a rc que solo ejecute esta declaración si existe un archivo hello.world en el directorio actual:
if ( test -r hello.world ) echo "there is a hello world!"
Creación de bucles for simples
Además de escribir declaraciones condicionales, también es posible usar rc para crear secuencias de comandos repetitivas a través de bucles. Un bucle es una estructura que le permite repetir un comando en particular un número determinado de veces.
De manera similar a las declaraciones condicionales, también puede escribir la sintaxis de un ciclo en una sola línea:
for ( i in step ) program
- El campo «paso» puede ser una variable o un programa que rc pasará uno por uno. Por ejemplo, escribir una lista aquí le indicará a rc que revise cada elemento de la lista.
- El campo «programa» es la línea de código que desea que rc ejecute cada vez que pasa por el campo de paso.
Creando Funciones en Rc
Por último, también es posible crear una función general en rc. Similar a otros lenguajes de programación, esta es una estructura que puede definir para realizar una tarea personalizada.
Por ejemplo, lo siguiente creará una función que usa sentencias condicionales y bucles for:
fn hello { for (i in ./hello/) if(test -r ./hello/$i) echo "There is a file here!" }
Si bien esto puede parecer complejo, escribir una función es increíblemente simple. En esencia, la sintaxis básica de una función rc se ve así:
fn name { function }
- El campo «nombre» le dice a rc la etiqueta de una función en particular. Esto puede ser especialmente útil si desea reutilizar la misma función para un comando posterior.
- El campo «función», por otro lado, contiene todas las variables y comandos que desea que ejecute.
Preguntas frecuentes
¿Es posible saber el número de elementos en una lista en Rc?
¡Sí! Es posible verificar la cantidad total de variables en una lista rc. De manera similar a la obtención de elementos de lista, puede hacerlo agregando un símbolo de comillas dobles («) antes del nombre de su lista. Por ejemplo, podemos teclear echo $"shop
para imprimir el número total de elementos que almacenamos en la variable tienda.
¿Es posible crear bucles infinitos en Rc?
¡Sí! Es posible crear bucles en rc shell que no terminen. Si bien los ejemplos anteriores muestran bucles finitos, crear bucles infinitos también es igual de simple. Para hacer esto, solo necesita eliminar cualquier condición en el campo de paso. Sin embargo, una cosa importante a tener en cuenta es que aún necesita colocar un paréntesis en el campo de paso para un ciclo infinito. Esto se debe a que el shell rc está diseñado para reconocer solo funciones con una sintaxis y estructura particulares. Por ejemplo, el comando for(i) echo hello
le dirá a rc que imprima la palabra «hola» indefinidamente.
¿Es posible pasar errores en Rc similares a> 2 en Bash?
¡Sí! Por defecto, rc proporciona una forma de separar cualquier salida de diagnóstico de un programa. Esto puede ser útil si está tratando de solucionar un problema con un script o programa que está ejecutando. Con esto en mente, puede separar este tipo de salida usando el “>[2=1]” operador de archivos. Por ejemplo, podemos imprimir cualquier error en nuestro script ejecutando el siguiente comando: ./script.rc >[2=1] ./error.log
.
Créditos de la imagen: Unsplash Todas las capturas de pantalla por Ramces Red
Danos tu opinión