(Não tenho certeza se é uma pergunta apropriada aqui)
Os scripts de shell, como os escritos bash
, podem fazer muitas coisas. Eles podem chamar programas Unix, canalizar sua saída, redirecionar E / S de / para arquivos, controlar o fluxo, verificar se existe um arquivo etc.
Mas uma linguagem de programação moderna, por exemplo, python
e ruby
, também pode fazer essas coisas. E eles são (eu acho) mais legíveis e fáceis de manter.
bash
goza de ampla adoção. Mas muitas distribuições instalaram o python
intérprete também.
Então, qual é a vantagem de fazer shell de um script? Se eu pudesse escrever python
, ruby
ou perl
, vale a pena aprender bash
?
programming-languages
shell
Lai Yu-Hsuan
fonte
fonte
Respostas:
Os shells possuem recursos especializados para trabalhar com arquivos e obter dados de um programa para outro (assumindo que os dados sejam texto). Para essas tarefas, os scripts de shell podem ser menos pesados do que uma linguagem de script como o Python.
Os scripts de shell também têm a vantagem de que os comandos que você usa são basicamente os mesmos que você usaria na linha de comando - portanto, se você pode fazer algo no shell, está na metade do caminho para criar scripts para a mesma operação.
Aqui, por exemplo, está um script bash que move todos os arquivos PNG do diretório atual para um diretório especificado.
Aqui está uma versão do Python.
Você notará:
mv
comando no bashsource
-lo na mesma instância do shellglob.iglob("./*.png")
é um bocado só para dizer*.png
Se você quisesse escrever uma operação básica de pipe em Python, ficaria surpreso com a verbosidade. (Obviamente, algumas coisas, como passar por
grep
, podem ser substituídas pelo código Python, em vez de usar um programa externo, portanto, muitas vezes você não precisa canalizar tanto.)Como um contra-exemplo, uma vez eu tive que escrever uma rotina que verificava quanto tempo cada um dos nomes de arquivos estava em um diretório específico. Se tivessem mais tempo do que o suporte de um sistema operacional específico, teriam que ser reduzidos. Isso poderia resultar em nomes de arquivos duplicados, que eu precisava corrigir, e, como seriam vinculados a partir de uma página da Web, os nomes abreviados precisariam permanecer estáveis, ou seja, deveriam ser gerados de forma que o mesmo nome de arquivo longo sempre resultasse em o mesmo nome de arquivo reduzido. Fiz isso gerando um md5 hexadecimal do nome do arquivo longo e anexando os quatro primeiros caracteres ao nome abreviado (os nomes ainda podem colidir, mas era muito pouco provável, então apenas verifiquei essa condição e paguei a taxa se isso acontecesse) .
Eu fiz isso no bash porque fazia parte do nosso sistema de compilação que já estava escrito no bash. Foi exatamente tão difícil de acertar como você provavelmente está pensando. Levaria muito menos tempo para escrever em Python e provavelmente teria sido mais claro também.
Em resumo: diferentes idiomas são projetados para diferentes tipos de tarefas; escolha o idioma disponível para você que melhor se adequa à tarefa em questão.
fonte
mv *.png $1
(os comentários não mantêm a formatação), mas com o perl você também pode usar recursos de linguagem de nível superior.As respostas existentes também são válidas, mas há uma razão que ninguém mencionou ainda: porque estará lá.
Qualquer instalação * nix é feita com um conjunto de pacotes opcionais que podem ou não ser carregados, e nem todos os sistemas terão Python, Perl ou Ruby. Mas se é esperado que o sistema tenha alguma capacidade interativa, ele terá um shell. Isso significa que os scripts shell funcionarão em sistemas de servidores a desktops de programadores, desktops de thin client de secretariado a dispositivos incorporados, em qualquer sistema que suporte um sistema de arquivos gravável e uma linha de comando do bash.
Para alguém que só trabalha em um ambiente de servidor consistente, isso pode ser considerado um dado adquirido e não é tão importante. Para alguém que trabalha em um ambiente mais variado, isso não deve ser esquecido.
fonte
Uma parte significativa da sua pergunta é respondida aqui:
Aqui está um trecho da minha resposta a essa pergunta :
fonte
Eu diria que um script de shell tem a vantagem em situações em que você apenas deseja criar uma tarefa automatizada super simples. Por exemplo, se você quiser escrever um script que faça backup de um diretório de um servidor para outro todos os dias às 5:00, seria um exagero usar uma linguagem de programação pesada.
Por outro lado, se sua tarefa de programação precisar mais de estruturas de controle (if / then / else), estruturas iterativas (loop), E / S de banco de dados e arquivo, etc., provavelmente será mais adequada para uma capacidade mais linguagem de programação que um script de shell.
Eu acho que uma boa regra geral é:
fonte
shellScript() if automatingSimpleTask else programmingLanguage()
lol.Embora você possa iniciar programas a partir de um programa python / ruby / qualquer que seja, é diferente no shell. Você pode precisar usar uma API para iniciar algo - fork () por exemplo. Em um script de shell, os programas se comportam mais como funções em uma linguagem de programação convencional e podem ser executados, canalizados, etc. com o mínimo de esforço. O fluxo de dados é muito claro também usando tubos.
fonte
Se você é totalmente livre para escolher a linguagem de programação usada para determinadas tarefas, provavelmente pode evitar completamente o aprendizado do bash e executar todas as tarefas de programação de scripts com Perl, Python ou Ruby. Às vezes, isso pode levar a uma solução mais detalhada, especialmente no caso em que você só precisa de um script que chame uma sequência de outras ferramentas Unix, mas, em casos mais complexos, você está certo, essas linguagens de script modernas oferecem a você mais possibilidades para escrever um código de melhor manutenção (eles também oferecem mais possibilidades de escrever código ofuscado, mas a escolha é sua).
Por outro lado, geralmente não somos livres para escolher o idioma que mais gostamos, porque temos que trabalhar com código legado ou código escrito por alguém que conheceu o bash, mas não conhecia uma das linguagens de script que você nomeou.
fonte
O script de shell é uma linguagem de programação interpretada. Aqui estão algumas razões pelas quais eu escolhi escrever scripts no bash em vez de perl, python ou alguma outra linguagem de script:
Funciona em qualquer lugar : intérpretes mais complexos nem sempre estão disponíveis, como durante a inicialização do sistema ou em sistemas embarcados. O Bash está disponível mesmo no busybox.
Funciona na linha de comando : se você é versado em scripts de shell, pode usar essas habilidades para executar tarefas complexas em scripts ad-hoc diretamente na linha de comando. Eu uso essa habilidade diariamente como administrador de sistemas.
É mais fácil escrever programas que chamam outros programas: se o que você está tentando fazer é encadear vários programas existentes de maneiras interessantes, pode ser mais fácil fazer isso em um shell script do que em uma linguagem de nível superior.
Se o programa tiver 30 linhas ou menos, normalmente o escreverei usando scripts de shell. Se houver alguma manipulação complexa ou complexa ou análise para lidar, farei isso usando python ou perl.
fonte
Você deve dar uma olhada no coffeescript. Suas palavras:
A regra de ouro do CoffeeScript é: "É apenas JavaScript".
Bem ... aqui vem a resposta super iniciante.
Como iniciante no aprendizado automático nos últimos 6 meses, e experimentando um pouco de C, C ++, Javascript e mais Bashscript nos últimos dias ... posso lhe dizer:
e não é tão simples assim fantástico! ? loops e variáveis? Uau!
Por favor, me diga onde você vê isso? Escrevi bashscript no gedit mesmo no geany e posso formatar (tabs?) E li meu código na velocidade da luz usando o bashscript na comparação em outros idiomas.
Esses idiomas têm outras ferramentas para manter a ordem? Eu sei que orientado a objetos economiza MUITO código, mas ... as pessoas dizem que o bashscript também é OO! WOW 2! Esse é o meu ponto aqui. Indo a:
está dentro desta pergunta: como fazer o que essa merda pode fazer em perl, phyton ou ruby? É fácil?
( bashdamnthing = xdotool )
fonte