(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, 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 python
intérpretes.
Entonces, ¿cuál es la ventaja de ejecutar un script? Si pudiera escribir python
, ruby
o perl
¿vale la pena aprender bash
?
programming-languages
shell
Lai Yu-Hsuan
fuente
fuente
Respuestas:
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.
Aquí hay una versión de Python.
Notarás:
mv
comando en bashsource
para ejecutarlo en la misma instancia del shellglob.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.
fuente
mv *.png $1
(los comentarios no conservan el formato), pero con perl también puede usar funciones de lenguaje de nivel superior.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.
fuente
Aquí se responde una parte importante de su pregunta:
Aquí hay un extracto de mi respuesta a esa pregunta :
fuente
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:
fuente
shellScript() if automatingSimpleTask else programmingLanguage()
jajaja?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.
fuente
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ó.
fuente
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.
fuente
Deberías echar un vistazo a coffeescript. Sus palabras:
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:
¡Y no es así de fantástico! ? bucles y variables? ¡Guauu!
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:
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 )
fuente