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

15

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

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

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

bashdisfruta de una amplia adopción. Pero muchas distribuciones también han instalado pythonintérpretes.

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

Lai Yu-Hsuan
fuente
3
Si trabajas mucho con sistemas Unix, deberías aprender bash, así como los otros shells populares de Unix.
Bernard

Respuestas:

30

Los shells tienen características especializadas para trabajar con archivos y obtener datos de un programa a otro (suponiendo que los datos sean texto). Para esas tareas, los scripts de shell pueden ser menos engorrosos que un lenguaje de scripts como Python.

El scripting de Shell también tiene la ventaja de que los comandos que usa son básicamente los mismos comandos que usaría desde la línea de comandos, por lo que si puede hacer algo en el shell, está a medio camino de scripting la misma operación.

Aquí, por ejemplo, hay un script 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])

Notarás:

  • El script bash es un tercio del Python si cuenta líneas (excluyendo la línea shebang), incluso menos por recuento de caracteres
  • El script Python requiere la importación de tres bibliotecas, mientras que todo lo que necesita para esta tarea está disponible de forma nativa en bash
  • El script Python requiere un bucle explícito para mover los archivos, mientras que eso es parte de la semántica del mvcomando en bash
  • El script bash puede ejecutarse más rápido: probablemente lo invocará desde bash, y puede usarlo sourcepara ejecutarlo en la misma instancia del shell
  • glob.iglob("./*.png") es un bocado solo para decir *.png

Si quisieras escribir una operación básica de tubería en Python, te sorprendería la verbosidad. (Por supuesto, algunas cosas, como canalizar grep, se pueden reemplazar por 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 verificara cuánto tiempo cada uno de los nombres de archivo estaba en un directorio particular. Si eran más largos que los admitidos por un sistema operativo 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 hexadecimal md5 del nombre de archivo largo y agregando los primeros cuatro caracteres de ese nombre acortado (los nombres aún podrían colisionar, pero era muy incierto, así que simplemente verifiqué esa condición y rescaté si ocurriera) .

Hice esto en bash porque era parte de nuestro sistema de compilación que ya estaba escrito en bash. Fue exactamente tan difícil acertar como probablemente esté pensando. Hubiera tomado mucho menos tiempo escribir en Python y probablemente también hubiera 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.

un poco
fuente
No puede hacer lo mismo en perl # / usr / bin / perl mv *.png $1(los comentarios no conservan el formato), pero con perl también puede usar funciones de lenguaje de nivel superior.
Poma
19

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

Cualquier instalación * nix dada se realiza con algún conjunto de paquetes opcionales que se pueden cargar o no, y no todos los sistemas tendrán Python o 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 hasta escritorios de programadores, escritorios de cliente ligero de secretaría y dispositivos integrados, en cualquier sistema que admita un sistema de archivos grabable y una línea de comando bash.

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

Erik Johnson
fuente
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; solo pensamiento aquí, sin ningún orden en particular:

  1. Python & Co. están diseñados para ser buenos en secuencias de comandos. Bash & Co. están diseñados para ser solo buenos en scripts, sin ningún compromiso. IOW: Python está diseñado para ser bueno tanto en secuencias de comandos como sin secuencias de comandos, Bash solo se preocupa por las secuencias de comandos.

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

    • Ruby: 123(número), Bash:123
    • Ruby: '123'(cadena), Bash:123
    • Ruby: /123/(expresión regular), 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
  3. Python & Co. están diseñados para escalar hasta a 10.000, 100.000, tal vez incluso 1000000 programas de línea, Bash & Co. están diseñados para escalar hacia abajo a 10 caracteres programas.

  4. En Bash & Co., los 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., debe envolverlos en un Objeto Python primero.

  5. La programación de shell es básicamente programación de flujo de datos. Nadie se da cuenta de eso, ni siquiera las personas que escriben shells, pero resulta que los shells son bastante buenos para eso, y los lenguajes de uso 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.

Tengo la sensación de que tratar de abordar estos puntos mediante la fijación de características o 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 la misma. Existe RuSH (Shell de Ruby), que intenta implementar un shell en Ruby, hay apuro, que es un DSL interno para la programación de shell en Ruby, hay Hotwire, que es un shell de Python, pero en mi opinión ninguno de esos se acerca. para competir con Bash, Zsh, peces y amigos.

Jörg W Mittag
fuente
Enlace roto: ¿Dónde está esta pregunta (y respuesta) a la que se refiere ahora? ¿O fue todo lo que fue útil copiado aquí?
Wolf
1
@Wolf: Aparentemente, fue eliminado por estar fuera de tema, después de casi tres años. Eso es lamentable.
Jörg W Mittag
1
Aquí hay una versión archivada de esa pregunta: web.archive.org/web/20140528035940/http://stackoverflow.com/…
waldyrious
1

Yo diría que un script de shell tiene la ventaja en situaciones en las que solo desea 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 usar un lenguaje de programación pesado.

Por otro lado, si su tarea de programación necesita más estructuras de control (si / luego / más), estructuras iterativas (bucle), E / S de bases de datos y archivos, etc., entonces probablemente sea más adecuado para un equipo más capaz lenguaje de programación que un script de shell.

Creo que una buena regla general es:

automatingSimpleTask ? shellScript() : programmingLanguage();
CFL_Jeff
fuente
2
¿No debería ser shellScript() if automatingSimpleTask else programmingLanguage() jajaja?
gahooa
1
@gahooa jaja muestra en qué lado de la valla estoy!
CFL_Jeff
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, por ejemplo, fork (). 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 un mínimo esfuerzo. El flujo de datos es muy claro usando tuberías también.

phkahler
fuente
0

Si es totalmente libre de elegir el lenguaje de programación que usa para ciertas tareas, probablemente podría evitar casi por completo aprender bash y realizar todas las tareas de programación de scripts con Perl, Python o Ruby. Esto a veces puede conducir 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 tiene razón, esos lenguajes de script modernos le brindan más posibilidades para escribir un código más fácil de mantener (también le brindan más posibilidades de escribir código ofuscado, pero esa es su elección).

Por otro lado, 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 secuencias de comandos que nombró.

Doc Brown
fuente
0

El scripting de shell 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 u 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 comandos : si conoce bien los scripts de shell, puede usar esas habilidades para hacer cosas complejas en scripts ad-hoc directamente en la línea de comandos. Utilizo esta habilidad diariamente como administrador de sistemas.

Programas más fáciles de escribir que llaman a otros programas: si lo que está tratando de hacer 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, generalmente lo escribiré usando scripting de shell. Si hay alguna manipulación compleja o complejo o análisis con el que lidiar, lo haré usando python o perl.

tylerl
fuente
-1

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

Debajo de todos esos corchetes y puntos y comas incómodos, JavaScript siempre ha tenido un magnífico modelo de objeto en su corazón. CoffeeScript es un intento de exponer las partes buenas de JavaScript de una manera simple.

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

Bueno ... aquí viene la respuesta 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 ... te puedo decir:

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

¡Y no es así de fantástico! ? bucles y variables? ¡Guauu!

Python y Ruby, también pueden hacer estas cosas. Y, son (creo) más legibles y mantenibles.

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 orientado a objetos guarda MUCHO código, pero ... ¡la gente dice que bashscript también es OO! ¡GUAU 2! Ese es mi punto aquí. Caminante a:

la ventaja de ejecutar un script

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

( bashdamnthing = xdotool )

H_7
fuente
¿Qué pasa aquí? Es como una respuesta de Doge ..
naught101