Puntos fuertes de las secuencias de comandos de Shell en comparación con Python [cerrado]

94

Intenté aprender a programar en shell (bash) varias veces, pero la sintaxis me alejó. Luego encontré Python y pude hacer la mayoría de las cosas que un script de shell puede hacer en Python. Ahora no estoy seguro de si debería invertir más tiempo en aprender a utilizar secuencias de comandos de shell. Entonces quiero preguntar:

¿Cuáles son las fortalezas de las secuencias de comandos de shell que la convierten en una herramienta indispensable en comparación con Python?

No soy un administrador de sistemas de profesión, pero estoy interesado en configurar sistemas Linux para usuarios domésticos, por lo tanto, creo que aprender a crear scripts de shell puede ser necesario.

Amol Gawai
fuente

Respuestas:

82
  • Los scripts de Shell tienen notaciones más simples para la redirección de E / S.
  • Es más sencillo crear canalizaciones a partir de programas existentes en shell.
  • Las secuencias de comandos de Shell reutilizan programas completos.
  • Shell está disponible universalmente (en cualquier dispositivo como Unix); Python no está necesariamente instalado.

Es cierto que en Python puede hacer todo lo que puede hacer en shell; También es cierto que hay cosas que son fáciles en Python que son difíciles en shell (al igual que hay cosas que son fáciles en shell pero difíciles en Python). Conocer ambos será lo mejor a largo plazo.

Jonathan Leffler
fuente
16
1 y 2, buenos puntos. El número 3 es una debilidad, ya que genera muchos gastos generales que Python puede evitar. El número 4 podría ser en gran parte falso. Python es parte de la mayoría de las distribuciones de Linux ahora.
S.Lott
1
@Svante: escriba un bucle de shell simple para realizar una serie de operaciones utilizando comandos como "test" y "expr" y compare los tiempos de ejecución con un script de Python que utilice el módulo "os". Los comandos como test y expr a menudo implican bifurcar un subproceso para hacer el trabajo real.
S.Lott
2
Veo el punto 3 como una gran ventaja, no una desventaja. Por ejemplo, considere cambiar el tamaño de un directorio lleno de imágenes con el programa de conversión.
Glenn
7
También es notable con respecto al n. ° 4 que el bashshell específicamente no está disponible universalmente en todas las distribuciones de Linux, en particular las de sistemas integrados y otras que ejecutan el busyboxejecutable. Los scripts que se dirigen al propio shell Bourne, con el cual bashes compatible con versiones anteriores, se ejecutarán en todos los sistemas compatibles con POSIX, sin embargo, ese lenguaje es mucho más restringido que el implementado por bash.
intuido
5
@intuited: eval "$ (historial 2 | head -1 | perl -pe 's / (? <= que es) más probablemente / al menos /')"; history -d $ (history 2 | head -1 | sed 's / ^ \ s * ([0-9] \ +) / \ 1 /')
intuido
54

"¿Cuáles son los puntos fuertes de las secuencias de comandos de shell que lo convierten en una herramienta indispensable en comparación con Python?"

La cáscara no es indispensable. ¿Por qué crees que hay tantos? bash, tcsh, csh, sh, etc., etc.,

Python es un caparazón. No es el que usaría para ejecutar todos los comandos, pero para las secuencias de comandos, es ideal.

Python es una parte más o menos estándar de todas las distribuciones de Linux.

Las conchas más tradicionales hacen demasiadas cosas.

  1. Tienen una práctica interfaz de usuario para ejecutar comandos. Esto incluye comandos de una línea donde el shell busca su PATH, bifurca y ejecuta el programa solicitado. También incluye pipelines, secuencias y programas concurrentes (usando; , |y &), así como algunos de redirección (usando >y <).

  2. Tienen una capacidad parecida a la de un lenguaje de programación muy pequeño para ejecutar scripts. Este lenguaje es bastante difícil de usar y extremadamente ineficaz. La mayoría de las declaraciones en este lenguaje requieren la bifurcación de uno o más procesos adicionales, lo que desperdicia tiempo y memoria.

Ejecutar programas desde el shell, redirigir stderr a un archivo de registro y ese tipo de cosas es bueno. Haz eso en el caparazón.

Casi todo lo demás se puede hacer de manera más eficiente y clara como una secuencia de comandos de Python.

Necesitas ambos . Sin embargo, nunca debe escribir un script con sentencias if o bucles en un lenguaje shell tradicional.

S.Lott
fuente
1
@intuited. A) La proliferación de diferentes capas atestigua el número de características que se acumulan en la "capa"; no es un papel esencial, pero es todo para las funciones. B) El intérprete de Python es un shell de Unix adecuado, usa # !. C) Una ifdeclaración de shell "simple" a menudo implica ejecutar el testprograma. El shell es un lenguaje de programación horrible en todos los aspectos.
S.Lott
4
@S. Lott: Parece que hay alguna disonancia semántica en los circuitos aquí. Mi definición de un shell de UNIX sería un intérprete cuyo lenguaje está principalmente orientado a controlar, en un alto nivel, el funcionamiento de un sistema UNIX. Según esta definición, un shell de algún tipo es ciertamente esencial para el funcionamiento de un sistema UNIX, y Python no califica. ¿Cómo definiría ese término?
intuido
1
@ S.Lott: No soy un gran admirador de la sintaxis que se usa en los scripts de shell tradicionales, pero la encuentro bastante útil y apropiada en muchas situaciones donde el objetivo principal es controlar los procesos y el flujo de su salida. Esto a menudo requiere tomar decisiones e iterar. Los proyectiles modernos ( bashal menos) tienen elementos integrados para manejar la toma de decisiones (por ejemplo, testes un elemento bashintegrado, además de construcciones más versátiles). Ciertamente tiene sus debilidades, pero también sus fortalezas. También vale la pena aprenderlo en detalle porque es de un paradigma muy diferente al de otros tipos de lenguajes.
intuido
1
@intuited: "encontrarlo bastante útil" es un saludo a tu habilidad, no al lenguaje de mala calidad. Python puede ser más útil para personas con menos experiencia.
S.Lott
3
@ S.Lott: Interesante, tienes una filosofía muy diferente a la mía. Creo que el diseño y las operaciones son básicamente pollos y huevos. Es decir, un script de shell es un programa que ejecuta programas. Muchos de esos programas se implementaron inicialmente como scripts de shell cada vez más complejos. En algún momento valió la pena, probablemente tanto por la eficiencia como por la modularidad, que algunos de ellos se reescribieran en C, y luego en Python. Por ejemplo: en algún momento cat "$1" | ssh "$2" "cat - >\"$1\""engendró scp. Sabían cómo diseñarlo mejor porque ya lo estaban usando.
intuido
31

El shell hace que las acciones comunes y simples sean realmente simples, a expensas de que las cosas más complejas sean mucho más complejas.

Por lo general, un script de shell pequeño será más corto y más simple que el programa de Python correspondiente, pero el programa de Python tenderá a aceptar modificaciones con elegancia, mientras que el script de shell tenderá a ser cada vez menos fácil de mantener a medida que se agregue el código.

Esto tiene la consecuencia de que para una productividad óptima del día a día necesita scripts de shell, pero debe usarlo principalmente para scripts desechables y usar Python en cualquier otro lugar.


fuente
14

No hay nada que pueda hacer con los scripts de shell que no pueda hacer con Python. La gran ventaja de los scripts de shell es que usa los mismos comandos que usa cuando usa el shell, por lo que si es un gran usuario de shell, los scripts de shell en algún momento se convertirán en una forma muy rápida y fácil de automatizar su trabajo de shell. .

También me resulta más fácil tratar con tuberías de datos en scripts de shell que en Python, aunque es absolutamente factible desde Python.

Y, finalmente, no tiene que activar un intérprete adicional para ejecutar los scripts de shell, lo que le brinda una ventaja muy pequeña, pero a veces tal vez notable, de velocidad y uso de memoria.

Pero, de nuevo, los scripts de Python son mucho más fáciles de mantener, estoy tratando de migrar de los scripts de shell grandes y feos a los scripts de Python por esa misma razón. También es más fácil manejar excepciones y control de calidad con Python.

elzapp
fuente
9

no es necesario aprender a programar en shell, como indican todas las respuestas anteriores; pero aprender nunca es malo. es realmente una cuestión de prioridades personales. es muy difícil para otra persona decirle qué vale y qué no vale su tiempo.

la mayoría de los programadores encuentran que aprender nuevos lenguajes es cada vez más fácil. (Lo mismo ocurre en gran medida con los lenguajes naturales). Y cuanto antes empiece, mejor.

más: haber aprendido un idioma le permite disipar extravagantemente sus limitaciones desde una posición de conocimiento y familiaridad completos. esto probablemente no te hará echar un polvo, ¡pero podría hacerte ganar una cerveza de tus compañeros!

adrianrf
fuente
8

Estoy de acuerdo con la mayoría de las respuestas anteriores. Considero que los comandos de shell son los más adecuados para realizar tareas orientadas al sistema de archivos (copiar y mover archivos, grep, etc.). Shell es mejor, en mi opinión, si tiene que leer y escribir en el archivo, ya que una sola >>file.txtredirección se agrega al archivo instantáneamente, en lugar de necesitar, digamos,file=open('file.txt','a'); file.write() , etc.

Actualmente, para mi uso personal, mezclo ambos, creando un script de Python y llamando a os.system ('comando') u os.popen ('comando') cada vez que alguna acción es más fácil en shell que en Python.

heltonbiker
fuente
6

La cáscara está disponible en todas partes. Si se ciñe a un conjunto relativamente básico de funciones portátiles, sus scripts pueden ejecutarse en teléfonos móviles, enrutadores inalámbricos, DVR, netbooks, estaciones de trabajo, grandes servidores de hierro y similares. Python no se incluye necesariamente de fábrica en muchos sistemas y, según el entorno, puede ser difícil instalarlo.

Aprender algunas secuencias de comandos de shell también puede ayudarlo a aprender algunos trucos de la línea de comandos, ya que la línea de comandos es, bueno, el shell. También es bueno para tomar una línea de comando bastante larga y complicada, y convertirla en una secuencia de comandos más general después de darse cuenta de que la necesitará un poco más.

El shell también tiene algunas características bastante poderosas; Los pipelines son una construcción de control realmente interesante que es nativa solo del shell, hasta donde yo sé.

Brian Campbell
fuente
5

Otra cosa a considerar al elegir los scripts de shell de Python es la versión de Python que se ejecutará en las máquinas de destino. RHEL5 (por nombrar uno) estará disponible durante mucho tiempo. RHEL5 está bloqueado con Python 2.4. Hay muchas bibliotecas interesantes que dependen de la funcionalidad agregada a Python post-2.4.

nscott
fuente