¿Existe algún shell Unix funcional?

¿Existe algún shell Unix funcional?

Soy (realmente) novato en la programación funcional (de hecho, solo tuve contacto con ella usando Python), pero parece ser un buen enfoque para algunas tareas que requieren muchas listas en un entorno de shell.

Me encantaría hacer algo como esto:

$ [ git clone $host/$repo for repo in repo1 repo2 repo3 ]

¿Existe algún shell Unix con este tipo de funciones? O tal vez alguna característica que permita un fácil acceso al shell (comandos, env/vars, readline, etc...) desde Python (la idea es usar el intérprete interactivo de Python como reemplazo de bash).

EDITAR:

Quizás un ejemplo comparativo lo aclararía. Digamos que tengo una lista compuesta pordirectorio/archivo:

$ FILES=( build/project.rpm build/project.src.rpm )

Y quiero hacer una tarea realmente simple: copiar todos los archivos adist/E instálelo en el sistema (es parte de un proceso de compilación):

Usando fiesta:

$ cp ${archivos[*]} dist/
$ cd dist && rpm -Uvh $(para f en ${files[*]}; hacer nombre base $f; hecho))

Usando un enfoque de "shell pitónico" (precaución: este es un código imaginario):

$ cp [ os.path.join('dist', os.path.basename(file)) para archivo en ARCHIVOS ] 'dist'

Puedes ver la diferencia ? DE ESO es de lo que estoy hablando. ¿Cómo es posible que todavía no se pueda salir de un shell con este tipo de cosas integradas? Es una verdadera molestia manejar listas en Shell, incluso siendo una tarea tan común: lista de archivos, lista de PID, lista de todo.

Y un punto muy, muy importante: usar sintaxis/herramientas/características que todo el mundo ya conoce: sh y python.

IPython parece estar en una buena dirección, pero está inflado: si el nombre var comienza con '$', hace esto, si '$$' hace aquello. Su sintaxis no es "natural", por lo que hay muchas reglas y "soluciones alternativas" ( [ ln.upper() for ln in !ls ] --> error de sintaxis)

Respuesta1

Hay unaEstructura del esquemaprobablemente esté muy cerca de lo que estás buscando. Yo no lo he usado.

ACTUALIZAR :

Lo instalé y lo probé yo mismo. Parece que scsh es más un intérprete de esquemas interactivo y un lenguaje de programación que un shell interactivo realmente útil. No puedes simplemente escribir

echo hello

la sintaxis parece ser

(run (echo hello))

Y me tomó varios minutos buscar en Google para encontrarlo. El primer ejemploaquíes:

gunzip < paper.tex.gz | detex | spell | lpr -Ppulp &

que se traduce en:

(& (| (gunzip) (detex) (spell) (lpr -Ppulp)) (< paper.tex.gz))

pero eso no te dice cómo ejecutar unsimplecomando de shell.

Esta entrada de preguntas frecuentesdice:

4.6 ¿Puedo usar scsh como shell interactivo?

Bueno, técnicamente puedes: simplemente ejecuta el comando "scsh" e ingresarás a una sesión de Scheme 48 con todas las funciones scsh disponibles. Sin embargo, esto definitivamente no es adecuado para el trabajo interactivo: no hay edición de línea de comandos, ni historial de línea de comandos, ni finalización de nombres de archivos/funciones, ni sintaxis concisa, etc.

Para aliviar estos problemas, Martin Gasbichler y Eric Knauel han escrito Commander S, que se ejecuta sobre scsh y proporciona un entorno interactivo cómodo. Una de sus características novedosas es que puede comprender la salida de muchos comandos de Unix y permite al usuario explorarlos y manipularlos de maneras útiles. Puede encontrar más información sobre Commander S en el artículo que lo describe: http://www.deinprogramm.de/scheme-2005/05-knauel/05-knauel.pdf Las instrucciones sobre cómo obtener e instalar Commander S están disponibles en el sitio web de scsh:http://www.scsh.net/resources/commander-s.html

Entonces tal vez esa sea la verdadera respuesta.

Respuesta2

En la categoría de responder directamente a la pregunta, está lacaparazón ESque pretende ser un reemplazo funcional para Bash y Zsh, etc.

En segundo lugar, en la categoría de ayudarle a escribir un shell estándar más funcional, considere aprender la técnica del pipemill:

who | while read username 
do
  cat <<EOF | grep $username
nic
mark
norman
keith
EOF
done | while read username
do
  echo "you have an answer on superuser.com" | mail -s "well done" $username
done

El primer bucle while es funcional keep(pasa solo los valores no nulos que salen del bucle) y el segundo es each(mapa solo para efectos secundarios).

Este es un tremendo impulso para fp en shells.

Es posible expresar muchas cosas en un estilo más fp en un shell, pero no es tan fácil como podría ser. Parece que no hay mucho interés en hacer mejores conchas, a pesar de que todos las usamos mucho.

Respuesta3

Los shells estándar estilo Bourne ( ,,, shetc. ) ya te permiten hacer:bashksh

for repo in repo1 repo2 repo3 ; do git clone $host/$repo ; done

(Tenga en cuenta la necesidad de punto y coma antes de doy done). Además, en bashy otros shells, si $reposolo aparece una vez en el comando, puede escribir:

git clone $host/{repo1,repo2,repo3}

Respuesta4

Scheme Shell, scsh, es realmente bueno.

Como señala Keith Thompson, no es útil como caparazón interactivo (aunque Commander S parece un experimento interesante). En cambio, es un excelente lenguaje de programación para contextos donde es útil tener todos los enlaces POSIX, eso incluye casos en los que desea llamar a otras aplicaciones Unix. Un script de shell de más de unas pocas docenas de líneassiempresiéntete como un truco, no importa lo bien que escribas sh; por el contrario, no hay nada que le impida escribir programas importantes utilizando scsh.

scsh no es muy compacto (la brevedad es tanto la fortaleza como la debilidad de los lenguajes de la familia sh), pero es poderoso.

Debido a que es útil y práctico para tareas pequeñas y grandes, scsh es incidentalmente una buena manera de familiarizarse con un Scheme (aunque, si ese fuera su objetivo, también podría ir directamente a Racket, en estos días).

Las ventajas de los lenguajes funcionales no son sólo para tareas que requieren un uso intensivo de listas (aunque debido a su historia, tienden a favorecer las listas como estructura de datos): es una forma realmente sólida de escribir programas, una vez que bebes la kool adecuada. ayuda.

No hay ningún sentido significativo en el que los shells de estilo sh sean funcionales, y Python sólo es funcional en el sentido marginal de que tiene una función lambda.

información relacionada