Una de las características más poderosas de Unix y Linux es que al usar herramientas de línea de comandos tradicionales, todo es un flujo de bytes. De acuerdo, el software moderno ha ofuscado esto un poco, pero en la línea de comandos todo es texto con algunas convenciones vagas sobre lo que separa campos y registros. Esto le permite hacer cosas como tomar una lista de directorios, ordenarla, eliminar duplicados y compararla con otra lista de directorios. Pero, ¿y si el shell comprende más tipos de datos que flujos? Podría argumentar que mejoraría algunas cosas y empeoraría otras, pero no tiene que adivinar, puede instalar cosh, un shell que proporciona herramientas para producir y trabajar con tipos de datos estructurados.
El sistema está escrito con Rust, por lo que necesitará la configuración de Rust para compilarlo. Para la mayoría de las distribuciones, es solo la instalación de un paquete (rust-all en distribuciones tipo Ubuntu, por ejemplo). Una vez que lo ponga en funcionamiento, tendrá que aprender algunas cosas nuevas en comparación con otros shells que haya usado.
Ejemplos
Una buena manera de familiarizarse rápidamente con las idiosincrasias del shell es compararlo con la sintaxis normal del shell. La página de Github tiene algunos buenos ejemplos:
- Encuentre los archivos que coincidan con la ruta y busque datos en ellos:
sh: encontrar . -iname ‘*prueba*’ -print0 | xargs -0 datos grep
aporrear: lsr; [test m] grep [f<; [data m] grep]mapa
- Encuentre el tamaño total de todos los archivos en el directorio actual:
sh: ls | estadísticas xargs -c %s | awk ‘{s+=$1} FIN {imprimir s}’ –
aporrear: ls; [is-dir; not] grep [stat; size get] mapa; cantidad
- Obtenga la segunda y la tercera columna de cada fila del archivo CSV:
sh: corte -d, -f2,3 datos de prueba/csv
aporrear: datos de prueba/csv f<; [chomp; , split; (1 2) get] mapa
- Ordenar archivos por tiempo de modificación:
sh: ls-tr
aporrear: ls; [[stat; mtime get] 2 aplican; <=>]sortp
Como puede ver, a veces los comandos son un poco más largos, pero probablemente menos para recordar y un poco más autodocumentados.
¿Pero por qué?
La idea clave es que este shell comprende múltiples tipos de datos. En particular, puede trabajar con mapas hash, conjuntos y listas. Los elementos básicos incluyen valores booleanos, enteros (32 bits o tamaño arbitrario), flotantes y cadenas.
Un indicador de entrada es más como una línea de comando para un lenguaje de programación. De hecho, los desarrolladores de Forth apreciarán las capacidades de RPN:
/tmp/cosh$ 5 3 /
1
/tmp/cosh$ 5.0 3 /
1.6666666666666667
/tmp/cosh$
Almacenar en variables también es similar a Forth, usando ! y @ con la etiqueta de estilo RPN. De hecho, todo parece Adelante de swap
y drop
de una manera si controla las condiciones. Sin embargo, la pila no existe entre líneas. Entonces, los ejemplos anteriores no dejan el resultado en el montón.
La documentación de Github es buena, pero deberá resolver algunas cosas. Por ejemplo, la función de cadena ++ está documentada, pero el ejemplo usa la palabra agregar, que no parece funcionar.
/tmp/cosh$ hacka day ++ hackaday /tmp/cosh$ hacka day append hacka day append
Comandos y expresiones regulares
La mayoría de los comandos de shell también existen en cosh, pero no necesariamente como herramientas externas. Algunos también tienen seudónimos. Por ejemplo, puede usar mv, pero también puede usar renombrar. Todo, por supuesto, utiliza el formato RPN para los argumentos.
Si desea un comando externo, debe agregarle un signo de dólar o, en un shell interactivo, puede usar un espacio si lo desea. Por ejemplo, si ejecuta ls, obtendrá la versión cosh de ls. Si ejecuta $ls, ese es el comando ls real que espera. Si pones el nombre externo entre paréntesis, lo que se devuelve es un generador que te permite caminar por la salida.
¿Qué es un shell sin expresiones regulares? Con cosh, tiene una expresión “m” que le dice si tiene una coincidencia, o una condición “c” que devuelve capturas de la expresión. También hay expresiones “s” para buscar y reemplazar. También puede agregar banderas para habilitar diferentes opciones como la insensibilidad a mayúsculas y minúsculas.
Parte de la grabación me confundió. Uno pensaría que daría una lista de cosas para hacer coincidir entre paréntesis, pero no lo hizo o no pude encontrar la sintaxis correcta para hacerlo. Por ejemplo:
/tmp/cosh$ name=al "name=(.*)$" c ( 0: name=al ) /tmp/cosh$ name=al,name=jim "name=([a-zA-z]+)/g" c ( 0: name=al 1: name=jim )
La documentación muestra algunos ejemplos de que esto tampoco funciona del todo bien. Por ejemplo, intente esto de la documentación:
/tmp/cosh$ asdf "(..)" c
Para obtener el resultado que muestra el documento, necesita el indicador /g en la expresión regular. De lo contrario, solo aparece la primera coincidencia.
análisis
Una gran característica de cosh es que puede analizar json y XML. También puede escribir archivos en ese formato. Nos encantaría ver un analizador CSV adecuado, aunque es un poco más fácil de manejar directamente con primitivas cosh que con un archivo XML.
Por ejemplo, si desea los campos 3 y 4 de un archivo CSV, puede leerlo y usar las funciones dividir y obtener en el mapa:
/tmp/cosh$ test.csv f<; [chomp; , split; (3 4) get] map
Por supuesto, no manejará cosas como los valores enumerados, pero eso también suele ser un problema en otros scripts de shell simples.
Trabajar con json es fácil. Por ejemplo, si desea buscar campos que coincidan con una expresión regular, puede hacer esto:
file.json f<; from-json; keys; [.{4} m] grep; v[gen ( 0: asdf 1: qwer 2: tyui 3: zxcv )] # from the official examples
¿Ganador?
¿Vamos a empezar a usar cosh todos los días? Honestamente, probablemente no. Pero es interesante. Tal vez lo guardamos en nuestro bolsillo trasero para escribir scripts que necesitan procesar json o XML.
Nos gusta la sintaxis Forth, pero no a todos les gustará. También nos gusta escribir datos. Pero como caparazón de propósito general, parece dejar mucho que desear.
Por supuesto, lo que realmente nos gusta es que Linux te da opciones. Si te gusta la cosh, déjate llevar. ¿No te gusta? Elija otro caparazón o, si se siente valiente, escriba el suyo propio. El mundo es tu ostra.
No pudimos evitar pensar en el shell Crush similar a una base de datos mientras jugábamos con cosh. Luego está el cat9, que es un caparazón realmente extraño. También hay algunas conchas alternativas más convencionales como zsh y fish.