Alternativas de script a los scripts de shell Bash


16

Acabo de migrar a una estación de trabajo UNIX. Mi memoria de los scripts de shell Bash se ha desvanecido desde la escuela y encuentro que la sintaxis es muy confusa. Me pregunto qué otros lenguajes de secuencias de comandos se utilizan para automatizar tareas. Los dos más populares de los que he oído hablar son Perl y Python.

  1. ¿Qué lenguaje de script es el más utilizado por las tiendas del mundo real?
  2. ¿Qué lenguaje de script se parece más a la sintaxis C / C ++?
  3. ¿Hay otro lenguaje de secuencias de comandos que no conozco?

Gracias por tu ayuda,

Scott


2
Probablemente debería ser una wiki comunitaria.
EBGreen

2
De hecho, uso PHP ahora para la mayoría de las tareas del sistema. Prepararé una respuesta adecuada con esto pronto. Tiene muchas bibliotecas integradas, lo cual es útil.
Kyle Hodgson

Los lenguajes destinados a Shell hacen algo que otros lenguajes podrían no hacer; Que es administrar y mantener bajo control todos los procesos secundarios que se generan de forma recursiva. El blog que anuncia Phusion Passenger explica por qué en detalle: phusion.github.io/baseimage-docker En resumen, sus scripts escritos en lang-x probablemente no manejan las rutinas de apagado correctamente. Lo cual está perfectamente bien siempre que los ejecute como hijos de un proceso de shell real. Descargo de responsabilidad, no soy un experto. Esta información es, a mi entender, lo que puede ser defectuoso.
ThorSummoner

Respuestas:


12

Hasta cierto punto es una cuestión de preferencia personal. Perl y Python definitivamente están a la altura en términos de popularidad.

Sin embargo, para responder dos de sus tres preguntas:

  1. Supongo que bash es el más utilizado, probablemente seguido de perl. Sin embargo, solo adivinando, no sé si alguien ha hecho una encuesta. :)
  2. Hay miles de millones de lenguajes de secuencias de comandos por ahí. :)

Sin embargo, mi recomendación es Python. Es fácil de leer y escribir, inmensamente poderoso, y hay toneladas de recursos útiles en la web para aprenderlo, sin mencionar el código que puede copiar y reutilizar.


1
Secundo que. Encuentro que Python es fácil de aprender y capaz de hacer cualquier cosa que le arroje, ya que ha estado en buenos y viejos días OS / 2 con REXX.
slovon

3
+1 para python ... el poder de C en un lenguaje de script. Puede hacer que sus scripts sean tan simples o complejos como desee;)
KFro

1
en sistemas que no son NT, el módulo de Python shhace que el uso de Python como lenguaje de script de shell sea accesible; Sin embargo, si se encuentra con casos extremos (como el multiprocesamiento), tendrá que aprender el módulo de subproceso que hasta el día de hoy me parece demasiado difícil de usar.
ThorSummoner

5

Perl y Python son obviamente las respuestas; pero cada uno de ellos se usa para completar diferentes tareas:

  1. Bash: sin duda, el más fácil de aprender. Con los scripts de Bash, ejecuta comandos y manipula la salida.
  2. Python: el segundo más fácil de aprender. Python es mucho más útil que Bash, ya que puede usar Python para escribir programas completos, y la comunidad lo respalda bien. Python también es extremadamente legible y fácil de editar meses después.
  3. Perl: el mejor de los tres (para secuencias de comandos), pero fácilmente la curva de aprendizaje más empinada. Tiene muy buen soporte de expresiones regulares (que es la razón principal por la que todavía se usa hoy en día), y probablemente se encontrará con muchos scripts de Perl con el tiempo. El principal problema con Perl es la legibilidad del código: meses después de escribir el código, no podrá darse cuenta de lo que hace. Así que será mejor que comentes mucho.
  4. Awk / Sed: ambos muy útiles, pero ambos muy difíciles de aprender. Sugeriría abordar estos últimos, a menos que seas bueno en los patrones.

En cuanto a cuál aprender en este momento (dado que presumiblemente no conoces ninguno de ellos), aprendería Python. Es lo más simple y útil de saber.

Y en cuanto a las respuestas a sus preguntas:

¿Qué lenguaje de script es el más utilizado por las tiendas del mundo real?

Todos ellos, pero me imagino que Perl tiene una pequeña ventaja aquí (ya que ha estado en uso en la administración del sistema durante mucho más tiempo).

¿Qué lenguaje de script se parece más a la sintaxis C / C ++?

Perl

¿Hay otro lenguaje de secuencias de comandos que no conozco?

Ruby, Tcsh / Csh, http://en.wikipedia.org/wiki/Interpreted_language


2
Si dedicas algo de tiempo a Perl, puedes escribir Perl perfectamente legible. Las personas que escriben código de espagueti son demasiado rápidas para culpar a Perl por sus fallas.
Cian

1
Solo estoy hablando en base a experiencias como administrador de sistemas; He tenido que mantener el código que otras personas han escrito que ha sido casi imposible de leer. Por lo general, termino simplemente reescribiendo el código en Python.
Michael Pobega el

3

awk para trabajos pequeños, python para más que simples.

Python (si no usa API específicas y otras cosas dependientes de la plataforma) tiene una rica "biblioteca estándar" que está disponible en todas las plataformas donde obtiene la versión de Python en uso. Esto es muy bueno, ya que puede reutilizar sus scripts fácilmente y significa que su conocimiento es una buena inversión, incluso si cambia su plataforma.

En nuestra empresa, usamos Python para todos los scripts, monitoreo, ... y Java para la aplicación, y estamos bien en un entorno heterogéneo.


1

Yo diría que perl y python son probablemente las dos mejores alternativas. Puedes hacer mucho con sed y awk también.


1

Sh (cáscara de bourne), grep, awk y sed siempre es algo bueno para volver a enfrentarse. Perl es excelente si desea una gran cantidad de expresiones de texto y la mantenibilidad no es tan importante (sin decir que no es posible). Pitón; si la legibilidad es importante para usted. Mi preferencia es Python, pero todas estas herramientas son buenas para la mayoría de las cosas que le arrojas. Es posible que desee reconsiderar su requisito de sintaxis de c / c ++, mantenerse atascado en él no lo ayudará a largo plazo.


Gracias martin Me di cuenta (de las muestras en la web), que Perl tiene un parecido notable con PHP (aunque estoy seguro de que era Perl antes de PHP, históricamente). ¿Es esta una declaración justa?
Scott Davies, el

PHP 1.0 era un script perl, por lo que no es casualidad :)
Bill Weiss

1

Si está buscando aprender algo desde cero, probablemente sea mejor (re) aprender bash.

Más allá de eso, perl y python son populares en estos días; Soy parcial con Perl, pero mi estilo de scripts de Perl no ha cambiado mucho desde que Perl 4 salió.

No conozco ningún lenguaje de script "similar a la sintaxis c".


1

Perl, sin duda, aunque solo sea por el increíble recurso de CPAN ( http://search.cpan.org/ ). El beneficio de usar un lenguaje de secuencias de comandos con una comunidad que contribuye de manera tan masiva es que es poco probable que alguna vez necesite inventar algo usted mismo.

Perl también tiene el beneficio de ser tan complejo como sea necesario para la situación actual. Puede tratarlo como un lenguaje de scripting simple para una administración rápida o scripts de un solo propósito, pero puede usar conceptos orientados a objetos o sistemas de metaobjetos extensos cuando desee crear aplicaciones más grandes y fáciles de mantener (como demonios, servidores, clientes).

Las diferencias entre los lenguajes de secuencias de comandos por sí solas no son lo suficientemente graves como para elegir un ganador claro, pero debe considerar principalmente lo fácil que será para usted encontrar información sobre los temas que le interesan.

La sintaxis de Perl también puede estar sorprendentemente cerca de C, siempre que pueda evitar la falta de tipeo y los sigilos; El uso avanzado de perl vendría naturalmente a medida que eventualmente aprenda las fortalezas del idioma.

Y para los detractores en el frente de la legibilidad: puede escribir código difícil de leer en cualquier idioma. Si vuelve a mirar su código de hace 4 meses y no puede entenderlo, está haciendo algo mal.

ps Esta publicación se llenó con enlaces a varios módulos amigables para la administración en CPAN, pero aparentemente los usuarios nuevos solo pueden publicar un enlace, así que use ese enlace de CPAN para buscar cosas como 'CVS' 'SVN' 'Cron' y 'Moose' (un extenso sistema de objetos)


1
  • Rubí
  • Pitón
  • Go: un lenguaje multiplataforma, las secuencias de comandos se mencionan como uno de los puntos fuertes de Go .
  • Node.js: ver Grunt.js, Gulp.js. Muchos proyectos ahora están usando Node.js como una herramienta de automatización de shell.
  • Perl

1

[para consejos generales sobre secuencias de comandos, vea las otras respuestas]

Esta respuesta trata sobre el uso de programas de línea de comandos y también grandes cadenas de ellos.

Para ejecutar cadenas de programas CLI, y quizás muchas cadenas en secuencia, bash es la más fácil. Perl puede hacer lo mismo, pero el lenguaje es mucho más difícil de aprender y es mucho más complejo, y como muchos han señalado, es fácil escribir Perl inteligible.

Si está iterando sobre archivos y parámetros, bash es más fácil de comenzar porque puede crear prototipos en el shell, luego copiar en un script y agregar algunas matrices y bucles con una sobrecarga mínima.

Ejemplos de lo que quiero decir:

$ cat input.dat | numerical_model source_data ${SRC} grid_size ${GRID_SIZE} param1 ${P1} param2 ${P2} | tee ${OUTPUT} | plotter title ${TITLE} ylabel ${YLABEL} xlabel ${XLABEL} > ${OUTPUT_FIG}
$ cat ${OUTPUT} | stats_cmd bin_size ${BINSIZE} dist_type ${DIST_TYPE} | tee ${OUTPUT_STATS} | plotter plot_type ${PLOT_TYPE} title ${TITLE_STATS} > ${OUTPUT_FIG_STATS}

En bash, es fácil envolverlo en unos pocos bucles sobre algunos de esos parámetros. sin embargo , el código se vuelve difícil de leer una vez que el script tiene más de unas pocas decenas de líneas. --- imagine 30 conjuntos de comandos (unas pocas líneas cada uno) para treinta tramas de datos diferentes ---

Perl y Python podrían ser mejores para scripts grandes porque tienen una sintaxis más limpia para bucles y variables, pero los comandos bash deben generarse como cadenas, ejecutarse como subprocesos y capturar stdin, stdout. Se puede hacer, pero no puede reemplazar completamente el entorno de shell nativo.

Si los proyectiles tuvieran un mejor idioma, todo esto se evitaría.


0
  1. más utilizado: Perl, principalmente por razones históricas. Python está ampliamente disponible en todas las distribuciones de Linux y BSD (incluso está instalado en Mac OSX), y es mucho más agradable de aprender / programar. Por supuesto, una vez que obtiene la sintaxis, Bash es más simple para casi cualquier cosa que pueda hacer en la línea de comandos. Después de todo, es la línea de comando.

    • Sintaxis C: hay csh , pero puede instalar fácilmente TCC y usar C real como lenguaje de script, compilado desde la fuente en menos tiempo que el inicio de otros lenguajes.

    • otros lenguajes de script: ¡muchos! Lua , Ruby , JavaScript ...


0

Debería usar una combinación de todos aquellos donde sea apropiado. Realmente no me gusta Perl (legibilidad), pero es bueno para muchas cosas. Python, por otro lado, era algo nuevo para mí en términos de administración del sistema, hasta que tuve que administrar (y todavía tengo que) algunas máquinas KVM. Comenzar, detener, guardar, cargar, migrar todas esas máquinas a través del script se hizo realidad después de 1 hora de jugar con los enlaces de Python de libvirt.

Por último, pero no menos importante, no usaría perl o python si tuviera que, por ejemplo, volcar todas las bases de datos de un servidor mysql todas las noches (cada base de datos en su propio archivo de volcado), tar y rsync a otro servidor. Por qué ? Porque es más rápido y fácil escribirlo en bash :)

Al final, debe usar el idioma que mejor se adapte a su tarea actual y no usar solo un lenguaje de scripting dado solo porque le gusta más.


0

Me gusta el rubí Es simple y fácil de programar. Hay un excelente libro sobre administración de sistemas con ruby .

Ruby se utiliza en varios sistemas de gestión de configuración (capistrano, chef, puppet) y en la última versión de metasploit.

Puede usar rush , un reemplazo para el shell Unix con sintaxis ruby ​​y hacer cosas como esta:

local = Rush::Box.new('localhost') 
remote = Rush::Box.new('my.remote.server.com')     
local_dir = local['/Users/adam/myproj/']
remote_dir = remote['/home/myproj/app/']

local_dir.copy_to remote_dir
remote_dir['**/.svn/'].each { |d| d.destroy }

Gracias chmeee No tenía idea de que podría usar Ruby para administrador de sistemas, siempre pensé que estaba centrado en la web. Estoy buscando algo en uso en la mayoría de las organizaciones. ¿Es justo decir que Ruby para sysadmin todavía es demasiado sangriento?
Scott Davies, el

1
Shell / Perl son los únicos dos idiomas que puedes encontrar instalados de manera confiable en todas partes. Python es probablemente el siguiente más común, con ruby ​​corriendo un cuarto muy distante (en realidad, probablemente quinto, detrás de awk).
Cian

@ScottDavies PHP y ASP.net son los únicos lenguajes centrados en la web que conozco; incluso Javascript diseñado para ejecutarse exclusivamente en la web ha madurado más allá de ser la falta de validación de formularios. Sin embargo, puede enviar html con cualquier idioma, incluso bash aparentemente.
ThorSummoner

0

Ejemplo de ruby ​​one-liners:

> echo 'Shell is the best!' | ruby -pe 'gsub("Shell", "Ruby")' 

Ruby is the best!

> printf "foo\nbar\nbaz\n" |  ruby -ne 'BEGIN { i = 1 }; puts "#{i} #{$_}"; i += 1'

1 foo
2 bar
3 baz

Yo usaría rubí.

Compare con sh, es moderno y poderoso.

Compare con python, es coherencia, una edición, un administrador de paquetes. Y no me gusta la sintaxis de sangría.

Compare con Perl, un poco de la vieja escuela y la sintaxis es demasiado compleja para mí.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.