Reactionary Software / Necesario - por fschmidt

Mejor Shell

Bash es el shell que recomiendo. Pero está lejos de ser ideal. Es viejo y torpe y es críptico para escribir scripts de shell. Pero dado que la cultura moderna es incapaz de hacer algo bueno, deberías quedarte con Bash. Pero en este post describiré mi shell de fantasía que no será implementado.

Una cosa que Bash hace bien es la simplicidad conceptual. Y una parte clave de eso es ser completamente sin tipos. No hay necesidad de tipos como booleanos, números, mapas, listas, etc. Solo flujos de bytes y cadenas, nada más. Tcl es otro lenguaje con simplicidad sin tipos. Pero la implementación de Tcl evolucionó de primero implementar todo como cadenas, y luego tener un sistema de tipos interno oculto. Un shell ideal seguiría este ejemplo.

Debería haber 2 tipos: datos y función. Los datos serían como en Bash - conceptualmente un flujo de bytes o cadena. Las funciones deberían ser como funciones de Elvish.

La captura de salida debería ser sintácticamente como Elvish como en (echo hi), no como Bash como en $(echo hi). Las declaraciones como if, while, etc. deberían implementarse como comandos integrados que toman argumentos condicionales y argumentos de función como en Elvish. Los argumentos condicionales deberían evaluar a las cadenas "true" o "false". Cualquier otro valor es un error. Las expresiones numéricas deberían usar la misma sintaxis de comando/prefijo que todo lo demás, como en Elvish.

Una peculiaridad desagradable de Bash es que con whatever $(echo hello world), whatever recibe 2 argumentos "hello" y "world". Para 1 argumento, debes hacer whatever "$(echo hello world)". Elvish hace esto bien y no requiere comillas. Mi shell es igual, y whatever (echo hello world) pasaría 1 argumento "hello world".

No hay necesidad de <, >, o & de Bash. En lugar de whatever <file haz cat file | whatever. En lugar de whatever >file haz whatever | to file. En lugar de whatever & haz background {whatever}. Esto es conceptualmente más simple.

Las variables tampoco merecen tratamientos especiales en un lenguaje de shell. En lugar de NAME=Bob; echo $NAME haz set NAME Bob; echo (get NAME). No me digas que esto es demasiado verboso. Un lenguaje de shell no es para escribir grandes programas. Y mi manera es conceptualmente más simple. También es más flexible, permitiendo simular arrays y mapas así:

set i 1 set a[(get i)] first echo (get a[(get i)])

Sí, esto es verboso. Como dijo Alan Kay "Las cosas simples deberían ser simples; las cosas complejas deberían ser posibles.". Este ejemplo es una cosa compleja para un shell.

Podría seguir, pero entiendes la idea. Solo muestra esta página a cualquier miembro de la cultura moderna y ve cuánto la odian. Eso sería prueba de que esta es una buena idea. Si tienes una idea que sería aún más odiada que la mía, entonces sería una mejor idea. De todos modos, nadie va a implementar nada de esto. Pero esta idea es al menos un ejemplo de diseño reaccionario.