Pontos fortes do Shell Scripting em comparação com Python [fechado]

94

Tentei aprender script shell (bash) algumas vezes, mas fui afastado pela sintaxe. Então descobri o Python e fui capaz de fazer a maioria das coisas que um script de shell pode fazer no Python. Agora não tenho certeza se devo investir meu tempo no aprendizado de scripts shell. Então, eu quero perguntar:

Quais são os pontos fortes do script de shell que o tornam uma ferramenta indispensável em comparação com Python?

Não sou um administrador de sistemas por profissão, mas estou interessado em configurar sistemas Linux para usuários domésticos, portanto, acho que aprender script de shell pode ser necessário.

Amol Gawai
fonte

Respostas:

82
  • O script de shell tem notações mais simples para redirecionamento de E / S.
  • É mais simples criar pipelines a partir de programas existentes no shell.
  • O script de shell reutiliza programas inteiros.
  • Shell está disponível universalmente (em qualquer coisa como Unix) - Python não é necessariamente instalado.

É verdade que você pode fazer em Python tudo o que pode fazer no shell; também é verdade que há coisas que são fáceis no Python que são difíceis no shell (assim como há coisas que são fáceis no shell, mas difíceis no Python). Saber ambos será melhor a longo prazo.

Jonathan Leffler
fonte
16
1 e 2, pontos positivos. # 3 é uma fraqueza, pois leva a muitos overheads que o Python pode evitar. # 4 pode ser totalmente falso. Python agora faz parte da maioria das distros Linux.
S.Lott
1
@Svante: escreva um loop de shell simples para fazer várias operações usando comandos como "test" e "expr" e compare os tempos de execução com um script Python que usa o módulo "os". Comandos como test e expr geralmente envolvem a bifurcação de um subprocesso para fazer o trabalho real.
S.Lott
2
Vejo o ponto 3 como uma grande vantagem, não uma desvantagem. Por exemplo, considere redimensionar um diretório cheio de imagens com o programa de conversão.
Glenn
7
Também notável em relação ao # 4 é que o bashshell especificamente não está universalmente disponível em todas as distros Linux, em particular aquelas para sistemas embarcados e outras que executam o busyboxexecutável. Os scripts que têm como alvo o próprio shell Bourne, com o qual bashé compatível com versões anteriores, serão executados em todos os sistemas compatíveis com POSIX, no entanto, essa linguagem é muito mais restrita do que a implementada por bash.
intuído
5
@intuited: eval "$ (history 2 | head -1 | perl -pe 's / (? <= que é) mais provavelmente / pelo menos /')"; history -d $ (history 2 | head -1 | sed 's / ^ \ s * ([0-9] \ +) / \ 1 /')
intuído
54

"Quais são os pontos fortes do shell scripting que o tornam uma ferramenta indispensável em comparação ao Python?"

A concha não é indispensável. Por que você acha que existem tantos? bash, tcsh, csh, sh, etc., etc.,

Python é um shell. Não o que você usaria para executar todos os comandos, mas para scripts, é o ideal.

Python é mais ou menos uma parte padrão de todas as distros Linux.

Os shells mais tradicionais fazem muitas coisas.

  1. Eles têm uma interface de usuário útil para executar comandos. Isso inclui comandos de uma linha onde o shell pesquisa seu PATH, bifurca e executa o programa solicitado. Também inclui pipelines, sequências e programas simultâneos (usando ;, |e &), bem como alguns redirecionamentos (usando >e <).

  2. Eles têm uma pequena capacidade parecida com uma linguagem de programação para executar scripts. Esta linguagem é bastante difícil de usar e extremamente ineficiente. A maioria das declarações nesta linguagem requer a bifurcação de um ou mais processos adicionais, desperdiçando tempo e memória.

Executar programas a partir do shell, redirecionar stderr para um arquivo de log e esse tipo de coisa é bom. Faça isso na casca.

Quase todo o resto pode ser feito de forma mais eficiente e clara como um script Python.

Você precisa de ambos . No entanto, você nunca deve escrever um script com instruções if ou loops em uma linguagem shell tradicional.

S.Lott
fonte
1
@intuited. A) A proliferação de diferentes shells atesta o número de características que se agregam à "shell"; não é uma função essencial, mas é abrangente para recursos. B) O interpretador python é um shell unix adequado, ele usa # !. C) Uma ifinstrução de shell "simples" geralmente envolve a execução do testprograma. O shell é uma linguagem de programação ruim em todos os aspectos.
S.Lott
4
@S. Lott: Parece que alguma dissonância semântica está no circuito aqui. Minha definição de shell UNIX seria um intérprete cuja linguagem é principalmente voltada para controlar, em um alto nível, a operação de um sistema UNIX. Por essa definição, um shell de algum tipo é certamente essencial para a operação de um sistema UNIX, e Python não se qualifica. Como você definiria esse termo?
intuído
1
@ S.Lott: Não sou um grande fã da sintaxe usada no shell scripting tradicional, mas acho que é bastante utilizável e apropriada em muitas situações em que o objetivo principal é controlar os processos e o fluxo de sua saída. Isso geralmente requer a tomada de decisões e iteração. Os shells modernos ( bashpelo menos) têm embutidos para lidar com a tomada de decisão (por exemplo, testé um bashembutido, além de construções mais versáteis). Certamente tem seus pontos fracos, mas também seus pontos fortes. Também vale a pena aprender em detalhes porque é de um paradigma muito diferente de outros tipos de linguagem.
intuído
1
@intuited: "achar que é bastante utilizável" é uma saudação à sua habilidade, não à linguagem ordinária. Python pode ser mais utilizável por pessoas não tão habilidosas.
S.Lott de
3
@ S.Lott: Interessante, você tem uma filosofia muito diferente da minha. Acho que o design e as operações são basicamente galinhas e ovos. Isso quer dizer que um script de shell é um programa que executa programas. Muitos desses programas foram implementados inicialmente como scripts de shell cada vez mais complexos. Em algum ponto, valeu a pena, provavelmente tanto por uma questão de eficiência quanto por modularidade, que alguns deles fossem reescritos em C e, posteriormente, em Python. Por exemplo: em algum ponto cat "$1" | ssh "$2" "cat - >\"$1\""gerou scp. Eles sabiam a melhor forma de projetá-lo porque já o estavam usando.
intuído
31

O shell torna as ações comuns e simples realmente simples, à custa de tornar as coisas mais complexas muito mais complexas.

Normalmente, um pequeno script de shell será mais curto e mais simples do que o programa python correspondente, mas o programa python tenderá a aceitar modificações normalmente, enquanto o script de shell tenderá a se tornar cada vez menos sustentável à medida que o código é adicionado.

Isso tem a conseqüência de que, para obter a produtividade diária ideal, você precisa de script de shell, mas deve usá-lo principalmente para scripts descartáveis ​​e usar python em qualquer outro lugar.


fonte
14

Não há nada que você possa fazer com scripts de shell que não possa ser feito com python. A grande vantagem dos scripts de shell é que você usa os mesmos comandos que usa quando usa o shell, então se você for um usuário pesado do shell, o script de shell em algum momento se tornará uma maneira muito rápida e fácil de automatizar seu trabalho de shell .

Também acho mais fácil lidar com tubos de dados em scripts de shell do que em python, embora seja absolutamente viável em python.

E, finalmente, você não precisa ativar um intérprete adicional para executar os scripts de shell, o que oferece uma vantagem de uso de memória e velocidade muito pequena, mas às vezes perceptível.

Mas, novamente, os scripts Python são muito mais fáceis de manter, estou tentando migrar de scripts de shell grandes e feios para scripts Python exatamente por esse motivo. Também é mais fácil lidar com exceções e controle de qualidade com Python.

elzapp
fonte
9

não é necessário aprender script de shell, como indicam todas as respostas anteriores; mas aprender nunca é uma coisa ruim. é realmente uma questão de prioridades pessoais. é muito difícil outra pessoa lhe dizer o que vale e o que não vale o seu tempo.

a maioria dos programadores acha que aprender novas linguagens fica cada vez mais fácil. (o mesmo também se aplica às línguas naturais.) e quanto mais cedo você começar, melhor.

mais: ter aprendido um idioma permite que você extravagantemente dissipe suas limitações a partir de uma posição de total conhecimento e familiaridade. isso provavelmente não fará com que você transa, mas pode render uma cerveja de seus colegas!

Adrianrf
fonte
8

Eu concordo com a maioria das respostas anteriores. Eu considero os comandos do shell mais adequados para tarefas orientadas a sistemas de arquivos (copiar e mover arquivos, grep, etc). Shell é melhor, na minha opinião, se você tiver que ler e escrever no arquivo, já que um único >>file.txtredirecionamento é anexado ao arquivo instantaneamente, em vez de precisar, digamos file=open('file.txt','a'); file.write(), etc.

Atualmente, para meu uso pessoal, eu misturo os dois, criando um script python e chamando os.system ('command') ou os.popen ('command') toda vez que alguma ação é mais fácil no shell do que no python.

Heltonbiker
fonte
6

O shell está disponível em todos os lugares. Se você se limitar a um conjunto relativamente básico de funcionalidade portátil, seus scripts podem ser executados em telefones celulares, roteadores sem fio, DVRs, netbooks, estações de trabalho, grandes servidores de ferro e semelhantes. O Python não está necessariamente incluído fora da caixa em muitos sistemas e, dependendo do ambiente, pode ser difícil instalá-lo.

Aprender alguns scripts de shell também pode ajudá-lo a aprender alguns truques de linha de comando, já que a linha de comando é, bem, o shell. Também é bom pegar uma linha de comando bastante longa e complicada e convertê-la em um script mais geral depois que você perceber que precisará dele um pouco mais.

O shell também possui alguns recursos bastante poderosos; pipelines são uma construção de controle realmente interessante que é nativa apenas para o shell, pelo que eu sei.

Brian Campbell
fonte
5

Outra coisa a considerar ao escolher scripts de shell do Python é a versão do Python que será executada nas máquinas de destino. RHEL5 (para citar um) ainda existirá por muito tempo. RHEL5 está preso ao Python 2.4. Existem muitas bibliotecas legais que dependem da funcionalidade adicionada ao Python pós-2.4.

nscott
fonte