
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 ( ,,, sh
etc. ) ya te permiten hacer:bash
ksh
for repo in repo1 repo2 repo3 ; do git clone $host/$repo ; done
(Tenga en cuenta la necesidad de punto y coma antes de do
y done
). Además, en bash
y otros shells, si $repo
solo 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.