Prefacio: Me encanta bash y no tengo intención de comenzar ningún tipo de argumento o guerra santa, y espero que esta no sea una pregunta extremadamente ingenua.
Esta pregunta está algo relacionada con esta publicación en superusuario, pero no creo que el OP realmente supiera lo que estaba pidiendo. Yo uso bash en FreeBSD, linux, OS X y cygwin en Windows. También he tenido una amplia experiencia recientemente con PowerShell en Windows.
¿Hay un shell para * nix, ya disponible o en proceso, que sea compatible con bash pero que agregue una capa de secuencias de comandos orientadas a objetos en la mezcla? Lo único que sé acerca de eso es la consola de Python, pero por lo que puedo decir, no proporciona acceso al entorno de shell estándar. Por ejemplo, no puedo simplemente cd ~
y ls
luego chmod +x file
dentro de la consola de Python. Tendría que usar Python para realizar esas tareas en lugar de los binarios estándar de Unix, o llamar a los binarios usando el código Python.
¿Existe tal caparazón?
fuente
cd ~
seguidas dels
trabajos como en Bash. También puede asignar resultados a variables de Python (listas de líneas ... más o menos) con comandos comolisting = !ls
.Respuestas:
Puedo pensar en tres características deseables en un shell:
Los shells de Unix tienden a concentrarse en el aspecto interactivo y subcontratan la mayor parte del acceso al sistema y parte de la programación a herramientas externas, como:
ftp
para FTPmail
,Mail
,mailx
, Etc para el correo electrónico básicocron
para tareas programadasdbus-*
o qdbus ) para diversas tareas de información y configuración del sistema (incluidos entornos de escritorio modernos como KDE ≥4)Se pueden hacer muchas, muchas cosas invocando un comando con los argumentos correctos o la entrada canalizada. Este es un enfoque muy poderoso: es mejor tener una herramienta por tarea que lo haga bien que un solo programa que haga todo menos mal, pero tiene sus limitaciones.
Una limitación importante de los shells de Unix, y sospecho que esto es lo que busca con su requisito de "script orientado a objetos", es que no son buenos para retener información de un comando al siguiente, o combinar comandos de maneras más elegantes que una tubería En particular, la comunicación entre programas se basa en texto, por lo que las aplicaciones solo se pueden combinar si serializan sus datos de manera compatible. Esto es tanto una bendición como una maldición: el enfoque de todo es texto hace que sea fácil realizar tareas simples rápidamente, pero levanta la barrera para tareas más complejas.
La usabilidad interactiva también funciona en contra de la mantenibilidad del programa. Los programas interactivos deben ser breves, requieren pocas comillas, no molestarlo con declaraciones o tipeos variables, etc. Los programas mantenibles deben ser legibles (por lo que no tienen muchas abreviaturas), deben ser legibles (para que no tenga que preguntarse si una palabra simple es una cadena, un nombre de función, un nombre de variable, etc.), debe tener comprobaciones de coherencia, como declaraciones de variables y escritura, etc.
En resumen, un caparazón es un compromiso difícil de alcanzar. Ok, esto termina la sección de despotricar, a los ejemplos.
El Shell Perl (PSH) “combina la naturaleza interactiva de una cáscara de Unix con el poder de Perl”. Se pueden ingresar comandos simples (incluso tuberías) en sintaxis de shell; todo lo demás es Perl. El proyecto no ha estado en desarrollo durante mucho tiempo. Es utilizable, pero no ha llegado al punto en que consideraría usarlo sobre Perl puro (para secuencias de comandos) o shell puro (interactivamente o para secuencias de comandos).
IPython es una consola de Python interactiva mejorada, especialmente dirigida a la computación numérica y paralela. Este es un proyecto relativamente joven.
irb (ruby interactivo) es el equivalente de Ruby de la consola de Python.
scsh es una implementación de esquema (es decir, un lenguaje de programación decente) con el tipo de enlaces de sistema que se encuentran tradicionalmente en shells de Unix (cadenas, procesos, archivos). Sin embargo, no pretende ser utilizable como un shell interactivo.
zsh es un shell interactivo mejorado. Su punto fuerte es la interactividad (edición de línea de comandos, finalización, tareas comunes realizadas con una sintaxis concisa pero críptica). Sus características de programación no son tan buenas (a la par con ksh), pero viene con varias bibliotecas para control de terminales, expresiones regulares, redes, etc.
fish es un comienzo limpio en un caparazón de estilo unix. No tiene mejores funciones de programación o acceso al sistema. Debido a que rompe la compatibilidad con sh, tiene más espacio para desarrollar mejores características, pero eso no ha sucedido.
Anexo: otra parte de la caja de herramientas de Unix trata muchas cosas como archivos:
/sys
proporciona más control de hardware y sistema./proc
sistema de archivos.Quizás el futuro de los shells de Unix no sea un mejor acceso al sistema a través de comandos (y mejores estructuras de control para combinar comandos) sino un mejor acceso al sistema a través de sistemas de archivos (que se combinan de manera algo diferente; no creo que hayamos resuelto cuáles son los modismos clave (como el tubo de la carcasa) todavía).
fuente
No necesita mucho código bash para implementar clases u objetos en bash.
Digamos, 100 líneas.
Bash tiene matrices asociativas que se pueden usar para implementar un sistema de objetos simple con herencia, métodos y propiedades.
Entonces, podría definir una clase como esta:
La creación de una instancia de esta Cola podría hacerse así:
o
Como las clases se implementan con una matriz, class e inst son realmente sinónimos, algo así como en javascript.
Agregar elementos a esta cola podría hacerse así:
La eliminación de elementos en una variable X podría hacerse así:
Y la estructura de descarga de un objeto podría hacerse así:
Lo que devolvería algo como esto:
Las clases se crean usando una función de clase como esta:
NOTA: Al definir una nueva clase o instancia, puede anular cualquier valor o función de miembro.
Las matrices asociativas Bash tienen una peculiaridad que hace que esto funcione perfectamente: $ Q [0]} es idéntico a $ Q. Esto significa que podemos usar el nombre de matriz para llamar a una función de envío de método:
Una desventaja es que no puedo usar [0] para los datos, por lo que mis colas (en este caso) comienzan desde index = 1. Alternativamente, podría haber usado índices asociativos como "q + 0".
Para obtener y establecer miembros, puede hacer algo como esto:
Y para volcar una estructura de objeto, hice esto:
NOTA: Esto no es necesario para OOP en bash, pero es bueno ver cómo se hacen los objetos.
Mi diseño OOP no ha considerado objetos dentro de objetos, excepto para la clase heredada. Puede crearlos por separado o crear un constructor especial como class (). * obj_dump * necesitaría ser modificado para detectar clases internas para imprimirlas recursivamente.
Oh! y defino manualmente una clase ROOT para simplificar la función de clase :
Con algunas funciones de cola definí algunas clases como esta:
Creé algunas instancias de cola y las hizo funcionar:
fuente
bash
es para qué sirve. Me recuerda la respuesta de Stephane sobre por qué no usar bucles de shell para procesar texto, particularmente la sección titulada "conceptualmente" que detalla la diferencia de propósito entre lenguajes como C ybash
. unix.stackexchange.com/a/169765/135943ksh93t + está introduciendo algunos conceptos de OO mientras conserva la sintaxis de shell bourne / posix: http://blog.fpmurphy.com/2010/05/ksh93-using-types-to-create-object-orientated-scripts.html
fuente
IPython es sorprendentemente conveniente de usar.
Características estándar de la shell: control de trabajos, edición e historial de líneas de lectura, alias
cat
ls
cd
epwd
integración de buscapersonas, ejecutar cualquier comando del sistema con un prefijo!
o habilitación%rehashx
, salida de comando asignable a una variable de Python, valores de Python disponibles como variables de shell.Específico de Python: reutilización de resultados de los últimos comandos, acceso rápido a documentación y fuente, recarga de módulos, depurador. Un poco de soporte de clúster si te gusta eso.
Dicho esto, ejecutar tuberías complejas no se realiza en Python; también usará el shell posix, solo con un poco de pegamento para pasar valores de aquí para allá.
fuente
Hay Rush que usa ruby y Psh que se basa en perl.
fuente
jq
funciona bastante bien como una especie de capa orientada a objetos.fuente
Este es un poco más simple de usar y configurar, ha nombrado args, etc. https://github.com/uudruid74/bashTheObjects
Estoy actualizando mi respuesta con un ejemplo, que sigue uno de los ejemplos básicos dados para otra respuesta, pero con esta sintaxis. El programa de ejemplo es similar, pero no tiene que prefijar todas las variables con el nombre de clase (lo sabe como lo muestra el método kindof ) y creo que la sintaxis es mucho más simple.
Primero, un archivo de clase. Los valores predeterminados para las variables de instancia son opcionales y solo se usan si no pasa estos valores al constructor.
Ahora, por ejemplo, el uso:
NOTAS
La declaración de importación no es técnicamente necesaria, pero obliga a cargar la clase en el punto dado en lugar de esperar la primera noticia nueva , lo que puede ayudar a inicializar las cosas en el orden correcto. Tenga en cuenta la facilidad con la que puede establecer múltiples variables de instancia de una vez.
También hay niveles de depuración, constructores, destructores, subclases y un sistema de reflexión básico , y se muestra print / println para reemplazar echo (¿alguna vez intentas imprimir una variable que comienza con un guión?). El ejemplo en github lo muestra ejecutándose como un CGI que genera HTML a partir de clases.
La biblioteca en sí (oop.lib.sh) no es tan simple (más de 400 líneas, 11K), pero solo la incluye y la olvida.
fuente
Puede instalar PowerShell Core Edition en Linux ahora. Se ejecuta en el marco de .NET Core multiplataforma que Microsoft está desarrollando activamente.
fuente
Si alguien solo quiere lo básico de la programación orientada a objetos (propiedades y métodos), un marco realmente simple sería suficiente.
Supongamos que desea mostrar el texto "Hola mundo" utilizando objetos. Primero, crea una clase de objeto que tiene una propiedad para mostrar el texto y tiene algunos métodos para establecer este texto y mostrarlo. Para mostrar cómo varias instancias de una clase pueden funcionar juntas, he agregado dos métodos para mostrar el texto: uno con NewLine al final y otro sin eso.
Archivo de definición de clase: EchoClass.class
Tenga en cuenta la palabra "<<InstanceName>>". Esto será reemplazado más tarde para crear múltiples instancias de un objeto de clase. Antes de poder usar una instancia de un objeto, necesita una función que realmente lo cree. Para simplificar las cosas, será un script separado llamado: ObjectFramework.lib
Así que ahora tenemos un archivo de definición de clase y una función CreateObject que crea una copia de este archivo con el texto "<<InstanceName>>" reemplazado al nombre que queramos.
Usemos nuestro nuevo objeto en un script llamado: HelloWorld.sh (tenga en cuenta que HelloWorld.sh debería ser ejecutable. Los otros dos archivos no necesitan)
Al ejecutar el script HelloWorld.sh, muestra el texto "Hello World" (y agrega una nueva línea). Nadie quedará muy impresionado con este resultado, sin embargo, sabremos que esto no es tan simple como parece :)
¡Feliz codificación!
fuente
Este es un shell orientado a objetos basado en Python, pero tiene un cierre sintaxe de Golang: https://github.com/alexst07/shell-plus-plus
Por ejemplo, intente atrapar:
sobrecarga de clase y operador:
y puedes usar los comandos bash similares:
fuente
Ahora, ¿con qué objetos trabajas en un caparazón la mayor parte del tiempo? Son archivos / directorios, procesos y su interacción. Entonces debería gustar
f1.edit
o algo asícurrentFile=f1.c ; .edit ; .compile ; .run
. Od1.search(filename='*.c' string='int \*')
. Op1.stop
,p1.bg
. Esa es mi comprensión de un ooshell.fuente
acabo de intentar introducir conceptos oo a bash en base a la referencia http://hipersayanx.blogspot.in/2012/12/object-oriented-programming-in-bash.html
fuente
Perdón por la breve respuesta, pero aquí va.
hipersayanx ha creado un artículo Programación orientada a objetos en Bash . Básicamente alta secuestrada
$FUNCNAME
,function
,compgen
, yexport
para crear lo más cercano a la POO se puede obtener en bash.Lo bueno es que funciona bien y solo se necesitan unas pocas líneas de calderería para construir una clase.
Las partes básicas necesarias son:
Uso:
Ahora, lo he usado yo mismo en mi proyecto AuditOps y hipersayanx tiene más detalles sobre cómo funciona esto realmente en su sitio. La advertencia de tarifa, aunque esto es muy bashism, no funcionará con nada anterior a bash 4.0 y puede provocar un dolor de cabeza en la depuración. Si bien personalmente me gustaría ver la mayoría de las placas de calderas renovadas como una clase en sí misma.
Siempre es más sabio usar un lenguaje de secuencia de comandos OOP serio como perl, ruby y python cuando se adapta mejor a su proyecto. Sin embargo, en mi opción honesta, vale la pena el tiempo y el esfuerzo al mantener scripts bash modulares para utilizar este método de OOP en bash.
fuente
Estoy desarrollando en GitHub una función que funciona igual que un objeto HashMap , shell_map .
Para crear " instancias de HashMap ", esta función puede crear copias de sí mismo con diferentes nombres. Cada nueva copia de función tendrá una variable $ FUNCNAME diferente. $ FUNCNAME se usa para crear un espacio de nombres para cada instancia de Map.
Las claves del mapa son variables globales, en la forma $ FUNCNAME_DATA_ $ KEY, donde $ KEY es la clave agregada al Mapa. Estas variables son variables dinámicas .
A continuación pondré una versión simplificada para que puedas usarla como ejemplo.
Uso:
fuente
carp "Some error message"; return
en su lugar.[ -z "$KEY" ] && { carp "some message"; return;}
no es necesario un subshell. Pero en realidad eso parece un candidato real para unaif ... elif ... elif ... else ... fi
construcción, que a menudo no es la mejor opción, pero probablemente lo sea, aquí. :) (O tal vez un cambio de mayúsculas y minúsculas.)Plumbum es un lenguaje de shell similar a Python. Empaqueta shell como sintaxis con Python haciendo que la experiencia esté orientada a objetos.
fuente