¿Cuál es la ventaja del script de shell sobre los lenguajes de programación interpretados? [cerrado]

13

(No estoy seguro de si es una pregunta apropiada aquí)

Los scripts de shell, como los escritos en bash , pueden hacer muchas cosas. Pueden llamar a programas de Unix, canalizar su salida, redirigir la E / S de / a los archivos, controlar el flujo, verificar si existe un archivo, etc.

Pero un lenguaje de programación moderno, por ejemplo, python y ruby , también puede hacer estas cosas. Y, son (creo) más legibles y mantenibles.

bash disfruta de una amplia adopción. Pero muchas distribuciones también han instalado el intérprete de python .

Entonces, ¿cuál es la ventaja de shell un script? Si pudiera escribir python , ruby o perl , ¿vale la pena aprender bash ?

    
pregunta Lai Yu-Hsuan 23.03.2012 - 18:16

8 respuestas

29

Shells tiene características especializadas para trabajar con archivos y obtener datos de un programa a otro (asumiendo que los datos son texto). Para esas tareas, los scripts de shell pueden ser menos engorrosos que un lenguaje de scripts como Python.

Los scripts de shell también tienen la ventaja de que los comandos que usas son básicamente los mismos comandos que usarías desde la línea de comandos, por lo que si puedes hacer algo en el shell, estás a más de la mitad del proceso de scripting en la misma operación. .

Aquí, por ejemplo, hay un script de bash que mueve todos los archivos PNG del directorio actual a un directorio específico.

#!/usr/bin/sh
mv *.png $1

Aquí hay una versión de Python.

#!/usr/bin/python
import sys, shutil, glob
for filename in glob.iglob("./*.png"):
    shutil.move(filename, sys.argv[1])

Te darás cuenta:

  • El script de bash es un tercero, siempre que Python, si cuenta las líneas (excluyendo la línea shebang), incluso menos por el recuento de caracteres
  • El script de Python requiere que se importen tres bibliotecas, mientras que todo lo que necesita para esta tarea está disponible de forma nativa en bash
  • El script de Python requiere un bucle explícito para mover los archivos, mientras que eso forma parte de la semántica del comando mv en bash
  • El script de bash puede ejecutarse más rápido: probablemente lo invocarás desde bash, y puedes usar source para ejecutarlo en la misma instancia del shell
  • glob.iglob("./*.png") es una gran bocanada solo para decir *.png

Si desea escribir una operación de canalización básica en Python, se sorprendería ante la verbosidad. (Por supuesto, algunas cosas, como canalizar a través de grep , pueden reemplazarse por el código Python en lugar de usar un programa externo, por lo que a menudo no es necesario canalizar tanto).

Como contraejemplo, una vez tuve que escribir una rutina que verificaba cuánto tiempo tenían cada uno de los nombres de archivo en un directorio en particular. Si eran más largos de lo que soportaba un sistema operativo en particular, tenían que acortarse. Esto podría dar como resultado nombres de archivo duplicados, que necesitaba rectificar, y dado que estarían vinculados desde una página web, los nombres abreviados debían ser estables, es decir, deberían generarse de tal manera que el mismo nombre de archivo largo siempre resultara en el mismo nombre de archivo acortado. Hice esto generando un hexágono md5 del nombre de archivo largo y agregando los primeros cuatro caracteres al nombre abreviado (los nombres aún podrían colisionar, pero fue muy simple, así que simplemente revisé esa condición y dejé de hacerlo si ocurriera) . También tuvo que registrar la operación de cambio de nombre para poder realizar una búsqueda y reemplazo por lotes en los archivos para corregir los vínculos entre ellos (escribí un archivo de comando sed y se lo pasé a sed para cada archivo).

Hice esto en bash porque era parte de nuestro sistema de compilación que ya estaba escrito en bash. Fue exactamente tan difícil de entender como probablemente estás pensando. Habría tardado mucho menos tiempo para escribir en Python y probablemente también habría sido más claro.

En resumen: diferentes idiomas están diseñados para diferentes tipos de tareas; elija el idioma disponible para usted que mejor se adapte a la tarea en cuestión.

    
respondido por el kindall 23.03.2012 - 18:38
18

Las respuestas existentes también son válidas, pero hay una razón por la que nadie ha mencionado aún: porque ESTARÁ allí.

Cualquier instalación * nix dada se realiza con algún conjunto de paquetes opcionales que pueden o no cargarse, y no todos los sistemas tendrán Python, Perl o Ruby. Pero si se espera que el sistema tenga alguna capacidad interactiva, tendrá un shell. Esto significa que los scripts de shell funcionarán en sistemas desde servidores a escritorios de programadores a escritorios de clientes ligeros de secretaría a dispositivos integrados, en cualquier sistema que admita un sistema de archivos de escritura y una línea de comandos de bash.

Para alguien que solo trabaja en un entorno de servidor consistente, esto es algo que puede darse por sentado, y no es tan importante. Para alguien que trabaja en un entorno más variado, esto no debe pasarse por alto.

    
respondido por el Erik Johnson 23.03.2012 - 18:52
9

Aquí se responde una parte importante de su pregunta:

  

¿Por qué los lenguajes de script (por ejemplo, Perl, Python, Ruby) no son adecuados como lenguajes de shell?

Aquí hay un extracto de mi respuesta a esa pregunta :

  

Hay un par de diferencias en las que puedo pensar; Simplemente pensaba en este punto, sin ningún orden en particular:

     
  1. Python & Co. están diseñados para ser buenos en scripting. Bash & Co. está diseñado para ser solo bueno en las secuencias de comandos, sin ningún compromiso. IOW: Python está diseñado para ser bueno tanto en scripting como en non-scripting, a Bash solo le interesan los scripting.

  2.   
  3. Bash & Co. no están tipificados, Python & Co. están fuertemente tipados, lo que significa que el número 123 , la cadena 123 y el archivo 123 son bastante diferentes. Sin embargo, no están tipificados estáticamente , lo que significa que necesitan tener diferentes literales para mantenerlos separados. Ejemplo:

         
    • Ruby: 123 (número), Bash: 123
    •   
    • Ruby: '123' (cadena), Bash: 123
    •   
    • Ruby: /123/ (regexp), Bash: 123
    •   
    • Ruby: File.open('123') (archivo), Bash: 123
    •   
    • Ruby: IO.open('123') (descriptor de archivo), Bash: 123
    •   
    • Ruby: URI.parse('123') (URI), Bash: 123
    •   
    • Ruby: '123' (comando), Bash: 123
    •   
  4.   
  5. Python & Co. está diseñado para ampliar up a 10000, 100000, tal vez incluso a 1000000 programas de línea, Bash & Co. está diseñado para reducir abajo a 10 programas de carácter .

  6.   
  7. En Bash & Co., archivos, directorios, descriptores de archivos, procesos son todos objetos de primera clase, en Python, solo los objetos de Python son de primera clase, si desea manipular archivos, directorios, etc., primero tiene que envolverlos en un objeto de Python. .

  8.   
  9. La programación de shell es básicamente la programación de flujo de datos. Nadie se da cuenta de eso, ni siquiera la gente que escribe shells, pero resulta que las shells son bastante buenas para eso, y los lenguajes de propósito general no tanto. En el mundo de la programación de propósito general, el flujo de datos parece ser visto principalmente como un modelo de concurrencia, no tanto como un paradigma de programación.

  10.   

Tengo la sensación de que tratar de abordar estos puntos atornillando las funciones o los DSL a un lenguaje de programación de propósito general no funciona. Al menos, todavía tengo que ver una implementación convincente de ello. Hay RuSH (Ruby shell), que intenta implementar un shell en Ruby, hay prisa, que es un DSL interno para la programación de shell en Ruby, hay Hotwire, que es un shell de Python, pero IMO ninguno de ellos se acerca. a competir con Bash, Zsh, peces y amigos.

    
respondido por el Jörg W Mittag 23.03.2012 - 22:49
1

Yo diría que un script de shell tiene la ventaja en situaciones en las que solo deseas preparar una tarea automatizada súper simple. Por ejemplo, si desea escribir un script que haga una copia de seguridad de un directorio de un servidor a otro todos los días a las 5:00, sería excesivo utilizar un lenguaje de programación de uso intensivo.

Por otra parte, si su tarea de programación necesita más estructuras de control (if / then / else), estructuras iterativas (looping), database & E / S de archivos, etc., entonces probablemente sea más adecuado para un lenguaje de programación más capaz que un script de shell.

Creo que una buena regla general es:

automatingSimpleTask ? shellScript() : programmingLanguage();
    
respondido por el CFL_Jeff 23.03.2012 - 18:25
1

Si bien puede iniciar programas desde un programa python / ruby / lo que sea, es diferente en el shell. Es posible que deba usar una API para iniciar algo: fork () por ejemplo. En un script de shell, los programas se comportan más como funciones en un lenguaje de programación convencional y pueden ejecutarse, canalizarse, etc. con el mínimo esfuerzo. El flujo de datos es muy claro usando tuberías también.

    
respondido por el phkahler 23.03.2012 - 18:31
0

Si tiene total libertad para elegir el lenguaje de programación que usa para ciertas tareas, probablemente podría evitar casi por completo el aprendizaje de bash y realizar todas las tareas de programación de scripts con Perl, Python o Ruby. Esto a veces puede llevar a una solución más detallada, especialmente en el caso de que solo necesite un script que llame a una secuencia de otras herramientas de Unix, pero en casos más complejos, esos lenguajes de script modernos le ofrecen más posibilidades de escribir mejor código mantenible. (También le brindan más posibilidades de escribir código ofuscado, pero esa es su elección).

Por otra parte, a menudo no somos libres de elegir el idioma que más nos gusta, porque tenemos que trabajar con el código heredado o el código escrito por alguien que sabía bash pero no conocía uno de los lenguajes de scripting que mencionó.

    
respondido por el Doc Brown 23.03.2012 - 18:43
0

Shell scripting es un lenguaje de programación interpretado. Aquí hay algunas razones por las que elegí escribir scripts en bash en lugar de perl o python o algún otro lenguaje de scripting:

Funciona en todas partes : los intérpretes más complejos pueden no estar siempre disponibles, como durante el inicio del sistema o en sistemas integrados. Bash está disponible incluso en busybox.

Funciona en la línea de comando : si está bien versado en shell-scripting, puede usar esas habilidades para hacer cosas complejas en scripts ad-hoc directamente en la línea de comando. Uso esta habilidad diariamente como administrador de sistemas.

Es más fácil escribir programas que llaman a otros programas: Si lo que intentas es encadenar varios programas existentes de manera interesante, puede ser más sencillo hacerlo en un script de shell que con un lenguaje de nivel superior.

Si el programa tiene 30 líneas o menos, normalmente lo escribiré usando shell scripting. Si hay alguna manipulación compleja o un análisis o análisis con el que lidiar, lo haré usando python o perl.

    
respondido por el tylerl 24.03.2012 - 01:52
-1

Deberías echarle un vistazo a coffeescript. Sus palabras:

  

Debajo de todos esos frenillosos y puntos y comas incómodos, JavaScript tiene   Siempre tuvo un modelo de objeto precioso en su corazón. CoffeeScript es un   intentar exponer las partes buenas de JavaScript de una manera sencilla.

La regla de oro de CoffeeScript es: "Es solo JavaScript".

Bueno ... aquí viene la respuesta del súper principiante.

Como principiante de autoaprendizaje durante los últimos 6 meses, y probando un poco de C, C ++, Javascript y más Bashscript en los últimos días ... puedo decirles:

  

Los scripts de shell, como los escritos en bash, pueden hacer muchas cosas. Ellos   puede llamar a programas de Unix, canalizar su salida, redirigir la E / S de / a los archivos,   controle el flujo, verifique si existe un archivo, etc.

¿Y no es este simple fantástico! ? bucles y variables? wow!

  

python y ruby, también pueden hacer estas cosas. Y, son (creo)   más legible y mantenible.

Por favor, dime dónde ves esto? Escribí bashscript en gedit incluso en geany y puedo formatear, (¿pestañas?) Y leí mi código a la velocidad de la luz usando bashscript en comparación con otros idiomas.

¿Estos idiomas tienen otras herramientas para mantener el orden? Sé que el código está orientado a objetos, MUCHO código, pero ... ¡la gente dice que bashscript es OO también! ¡WOW 2! Ese es mi punto aquí. Yendo a:

  

la ventaja de shell un script

está dentro de esta pregunta: cómo hacer lo que bashdamnthing puede hacer en perl o phyton o ruby? ¿Es fácil?

( bashdamnthing = xdotool )

    
respondido por el H_7 24.03.2012 - 01:47

Lea otras preguntas en las etiquetas