python perl bash scripting comparison

python - ¿Hay algún uso para los scripts de Bash?



perl scripting (18)

Además de lo que otros han dicho, me gustaría señalar cuál es, en mi opinión, la razón principal para aprender Bash: es el intérprete de comandos (casi) estándar de Linux.

Otros lenguajes de scripting son seguramente útiles, y quizás mucho más poderosos, pero con lo que te enfrentarás cuando tengas una terminal frente a ti es ... Bash.

Ser capaz de gestionar E / S, canalizaciones y procesos, asignar y usar variables, y hacer al menos algunos bucles y evaluar la condición es una necesidad, si desea administrar un sistema Linux.

Acabo de terminar mi segundo año como estudiante de CS de la universidad, por lo que falta mi conocimiento del "mundo real". Aprendí Java en mi primer año, seguí con Java y recogí C y el guión simple de Bash, el segundo. Este verano estoy tratando de aprender Perl (Dios me ayude). He incursionado un poco en Python en el pasado.

Mi pregunta es, ahora que tenemos lenguajes de escritura muy legibles y muy legibles como Python, Ruby, Perl, etc., ¿por qué alguien escribe scripts de Bash? ¿Se me escapa algo? Sé que mi linux box tiene perl y python. ¿No son lo suficientemente ubicuos? ¿Hay algo realmente más fácil de hacer en Bash que en otros hll?


Bash (y el original Bourne sh y miles de derivados) es, desde una perspectiva, un lenguaje increíblemente de alto nivel. Donde muchos lenguajes usan primitivas simples, las primitivas de shell son programas completos.

Que no sea el mejor idioma para expresar tus tareas, no significa que esté muerto, muriéndose o incluso moribundo.


Bash es increíblemente útil en la administración de sistemas, la implementación de aplicaciones web, el procesamiento de datos, las copias de seguridad sutomated, incluso la administración día a día para nombrar solo algunos de ellos. Creo que es demasiado pronto para juzgar a un "veterano soldado de TI" como BASH.

EDITAR en Google:

También me gustaría mencionar que TextMate un exitoso programa OS-X tiene una gran cantidad de maquinaria Bash dentro.


Bash no es solo un lenguaje de scripting, sino que es un shell.

Lenguajes y shells de control de trabajos
Artículo principal: script de Shell

Una gran clase de lenguajes de scripting surgió de la automatización del control de trabajos, que se relaciona con el inicio y el control del comportamiento de los programas del sistema. (En este sentido, uno podría pensar en las shells como descendientes de JCL de IBM, o Job Control Language, que se utilizó para este propósito). Muchos de los intérpretes de estos idiomas funcionan como intérpretes de línea de comandos, como el shell de Unix o MS-DOS COMMAND.COM. Otros, como AppleScript, ofrecen el uso de comandos similares al inglés para crear scripts. Esto, combinado con los marcos Cocoa de Mac OS X, permite al usuario construir aplicaciones enteras utilizando objetos AppleScript y Cocoa.

Python, Ruby y Perl son geniales, pero son herramientas más generales; en ciertos casos (dispositivos incorporados u otros sistemas minimalistas) pueden considerarse bloat o en otras situaciones pueden representar un riesgo para la seguridad (para entornos en los que desea una seguridad muy alta y trata de eliminar cualquier paquete innecesario).

En algunos casos, los scripts de shell funcionarán mucho mejor debido a una integración más cercana con el sistema operativo.

Además, bash es una producción probada para una gran cantidad de tareas administrativas y es fácil encontrar scripts que cubran escenarios muy complicados (excepciones) y los manejen con elegancia.


Bueno, al escribir con bash, puede usar directamente todas las herramientas posibles que tiene en la línea de comandos para su secuencia de comandos. Con cualquier otro idioma, primero tendría que ejecutar ese comando y obtener algún resultado, etc. Un script simple que (por ejemplo) obtiene una lista de procesos, se ejecuta a través de grep y obtiene algún resultado sería mucho más complicado en otros idiomas. Como tal, bash sigue siendo una buena herramienta para escribir cosas rápidas.


Como se mencionó, las herramientas de GNU son geniales y son más fáciles de usar dentro del caparazón. Es especialmente bueno si sus datos ya están en forma lineal o tabular de texto sin formato. Solo a modo de ejemplo, el otro día pude construir una secuencia de comandos para crear una nube de palabras XHTML de cualquier archivo de texto en 8 líneas de Bourne Shell, que es incluso menos potente (pero más compatible) que Bash.


Creo que un argumento fuerte de que python no es tan natural como bash para muchas tareas es el simple hecho de que nadie usa el intérprete de Python como su caparazón. Claramente esto es posible:

python> import os, subprocess python> os.chdir(os.path.expanduser("~/work")) python> subprocess.call(["vim","README"])

Claramente, usar Python para un shell es absurdo. Bash fue diseñado para ejecutar otros programas. Python fue diseñado para hacer cálculos. Si bien, la mayoría de las cosas se pueden hacer en cualquier idioma, siempre habrá tareas que se pueden hacer más fácilmente en bash que en python y viceversa.


En mi experiencia, Perl cumple algo así como el 99% de cualquier necesidad que pueda requerir un script de shell. Como beneficio adicional, es posible escribir código que se ejecuta en Windows sin Cygwin. Si no quiero instalar Perl en una caja de Windows a la que quiero apuntar, puedo usar PAR :: Packer o PerlApp para producir un archivo ejecutable. Python, Ruby y otros también deberían funcionar igual de bien.

Sin embargo, las secuencias de comandos de shell no son tan complicadas, al menos las cosas que deberías tener en un shell no son tan complicadas. Puede hacer lo que necesita hacer con un nivel de conocimiento bastante superficial.

Aprenda a leer y establecer variables. Cómo crear y llamar funciones Cómo obtener otros archivos Aprenda cómo funciona el control de flujo.

Y lo más importante, aprenda a leer la página man de shell. Esto puede sonar divertido, pero estoy 100% serio. No se preocupe por meter en el cerebro cada detalle de las secuencias de comandos shell, en su lugar, aprenda a encontrar lo que necesita saber en la página del manual de forma rápida y eficiente. Si te encuentras usando scripts de shell a menudo, la información pertinente se quedará naturalmente en tu cerebro.

Entonces, sí, vale la pena aprender shell básico.


Entre otras cosas, bash es útil cuando la mayoría de lo que haces es comunicar y canalizar entre varios programas (muchos de los cuales también son estándar). Y hay muchos entornos donde bash (o al menos un shell POSIX ) está disponible pero Perl y Python no.

Y, por supuesto, debe distinguir entre bash interactivo y bash con guiones. Ubuntu recientemente cambió su shell predeterminado con scripts ( #!/bin/sh ) para dash porque era mucho más rápido. Sin embargo, bash tiene funciones interactivas útiles que dash no ( zsh es aún mejor, en mi humilde opinión).

Ver también ¿Vale la pena aprender BASH cuando conozco a Perl?


La verdadera diferencia entre bash y python es que python es un lenguaje de scripting de propósito general, mientras que bash es simplemente una forma de ejecutar una miríada de programas pequeños (a menudo muy rápidos) en una serie. Python puede hacer esto, pero no está optimizado para eso. Los programas (sort, find, uniq, scp) pueden realizar tareas muy complejas de forma muy simple, y bash permite que estas tareas interactúen de forma muy simple con la canalización, el flujo de entrada y salida de archivos o dispositivos, etc.

Si bien Python puede ejecutar los mismos programas, se lo forzará a hacer bash scripting en el script de python para lograr lo mismo, y luego se quedará atrapado tanto con python como con bash. Ambos están bien por sí mismos, pero una combinación de estos no mejora nada en mi humilde opinión.


Lo que no entiendo es por qué la gente dice bash cuando se refieren a cualquier bourne-shell compatible con bourne-shell shell.

Al escribir scripts de shell: siempre intente usar constructos que también funcionen en intérpretes de shell bourne más antiguos. Le ahorrará muchos problemas algún día.

Y sí, hoy en día se usan mucho los guiones de shell, ya que el intérprete de comandos siempre existe en todos los Unixes, fuera de la caja, contrariamente a perl, python, csh, zsh, ksh (¿posiblemente?), Y así sucesivamente. La mayoría de las veces solo agregan conveniencia adicional o sintaxis diferente para construcciones como bucles y pruebas. Algunos han mejorado las funciones de redirección.

La mayoría de las veces, diría que la cáscara de Bourne ordinaria funciona igual de bien.

Peligro típico: if ! test $x -eq $y if ! test $x -eq $y funciona como se esperaba en bash que tiene un operador incorporado "si" más ingenioso, pero el "correcto" if test ! $x -eq $y if test ! $x -eq $y debería funcionar en todos los entornos.


Los scripts de Bash le permiten automatizar las tareas de la línea de comando utilizando el mismo lenguaje que usaría si escribe los comandos manualmente.

Ejemplo Trivial para listar $ PATH

Intento

#!/bin/sh echo $PATH

Pitón

import os print os.getenv("path")


Más fácil, probablemente no. De hecho, prefiero perl para bash scripting en muchos casos. Sin embargo, Bash tiene una ventaja, especialmente en sistemas Linux: está garantizado su instalación. Y si no lo es, su padre (sh) compatible en gran medida será, porque casi todos los scripts del sistema están escritos para sh. Incluso Perl no es tan omnipresente, y está en todas partes.


Muchos scripts de inicio se escriben tradicionalmente como scripts de shell y no parece haber una tendencia a alejarse de ellos.

Los scripts de Shell son perfectamente adecuados para iniciar otros procesos y pegar sus entradas / salidas juntas. Esa es un área donde los otros lenguajes de scripting no son tan poderosos.

Aparte de eso: incluso si idiomas como Perl, Python y Ruby se vuelven cada vez más omnipresentes, el único lenguaje que estás prácticamente garantizado en cada sistema unix es el bourne shell (aunque no necesariamente en forma de bash ).


Para muchas tareas, bash puede ser muy, muy conciso. Codifique para buscar una cadena en todos los archivos del directorio actual e imprima esas líneas:

En bash:

grep -ir "search_term" .

En Python:

for file in os.listdir(''.''): file_content = open(file).readlines().split(''/n'') for line in file_content: if line.count("search_term") > 0: print file, ": ", line


Puede obtener una verdadera bournesh en la carne fresca (en Mac OS X, por ejemplo, / bin / sh no es una verdadera bournesh).

¿Cómo identificar un shell Bourne tradicional? ... Una simple comprobación de una característica característica a menudo no documentada: puede utilizar el circunflejo ^ (caret) como reemplazo de | (tubo).

ver: http://www.in-ulm.de/~mascheck/bourne/


Si haces muchas cosas de GUI, probablemente solo te encuentres con bash cada vez que realices algún tipo de personalización en tu propia máquina. Varios hacks y esas cosas. Si usas la línea de comando para hacer cosas, bash es simplemente indispensable. De hecho, ser bueno en la línea de comando requiere bash o alguna otra familiaridad shell.

Tengo kilómetros de haber aprendido a Bash cuando quería navegar rápidamente por mi disco duro. Escribí una interfaz de navegación / menú que me permite transmitir a diferentes carpetas y archivos de forma rápida y fácil. Escribirlo en bash fue simple y fácil. Y hay muchas cosas de fácil acceso y gratuitas que te mostrarán cómo hacerlo.

Además, aprender Bash es excelente para entender cómo funciona realmente Unix y algunos de los elementos principales, y qué tan lejos hemos llegado con herramientas como Python.


Soy un chico perl, pero el número de funciones bash (o ksh) que uso y creo diariamente es bastante significativo. Para todo lo relacionado, escribiré un script de Perl, pero para navegar por la estructura de directorios, y específicamente para manipular variables de entorno, bash / ksh / ... son indispensables.

Una vez más, especialmente para las variables de entorno, nada supera al shell, y bastantes programas usan variables de entorno. En Perl, tengo que escribir un alias o función bash que llame a la secuencia de comandos Perl, que escribe una secuencia temporal de bash, que luego se obtiene después de que Perl sale para realizar el cambio en el mismo entorno desde el que estoy iniciando.

He hecho esto, especialmente para trabajos pesados ​​en variables de ruta. Pero no hay forma de hacerlo solo con Perl (o python o ruby ​​... o código C para el caso).