A linguagem de script mais universal para o Linux é?

25

Estamos escrevendo scripts para sistemas Linux, tem havido algum debate sobre qual seria a linguagem de script mais universal do Linux a ser usada. Bash, SH, Posix? O que?

    
por Gilles 26.09.2012 / 00:51

8 respostas

39

Existem dois ambientes de programação disponíveis em todos os sistemas operacionais unix, que são Turing-completos e que podem chamar outros programas: awk e sh , a família de shell Bourne / POSIX. O AWK é orientado para o processamento de texto (complementa utilitários mais especializados), enquanto sh é orientado a ser uma linguagem de cola para unir programas. Sh é a linguagem de script universal no Linux e em todo o mundo unix.

O padrão POSIX define os recursos obrigatórios do próprio sh e dos utilitários associados. A maioria dos sistemas semelhantes a unix está em conformidade com o POSIX 1003.1-2004 (também conhecido como Single Unix v3, também conhecido como o Open Group Base Specification, edição 6). ); a versão mais recente desse padrão é POSIX 1003.1-2008 (também conhecido como Single Unix v4, também conhecido como o Open Group Base Specification Issue 7 ).

Todo sistema Linux e unix ou similar ao Unix possui um shell estilo Bourne no caminho /bin/sh , e qualquer sistema não antigo possui um shell compatível com POSIX (exceto o bug ocasional). Todo sistema moderno semelhante a um unix (incluindo o Linux) suporta shebangs , para que ele execute scripts automaticamente em /bin/sh se a primeira linha for #!/bin/sh . Existem sistemas POSIX em que sh está localizado em outro local (normalmente camadas de emulação em SOs que você não imaginaria como sendo realmente do tipo Unix).

Os sistemas Linux incorporados podem ter um sistema reduzido BusyBox que não implementa todos os recursos do POSIX. O BusyBox tem um grande número de opções em tempo de compilação para acomodar sistemas de pequena dimensão, por isso é difícil saber antecipadamente o que esperar, você tem que adaptar seus scripts a um dispositivo específico. BusyBox é a implementação mais comum de pequenas dimensões de vários utilitários; outro que você pode encontrar é o ambiente de shell extremamente reduzido no Android (versões posteriores são menos anêmicas).

Sistemas Linux não embarcados quase sempre têm traço ou bash como /bin/sh . Dash é um shell pequeno e rápido que implementa pouco mais que recursos POSIX. O Bash é um shell maior com mais recursos.

Os sistemas Linux não embarcados quase sempre têm o Bash instalado como /bin/bash . Portanto, para portabilidade em sistemas Linux não embarcados, você pode assumir que o bash está disponível. Entre os recursos adicionais úteis do bash são arrays, a capacidade de lidar com arquivos de ponto convenientemente, a variável pipestatus para obter o status de retorno de todos os comandos em um pipeline, operadores de comparação adicionais para tempos de arquivo e (em versões recentes) correspondência de expressão regular.

Uma das características da programação shell é que você não está apenas usando o programa sh , você também está usando um número de utilities . A maioria dos utilitários de manipulação de arquivos e processamento de texto no Linux são os GNU coreutils (em sistemas embarcados , eles são geralmente da BusyBox).

Se você precisa de portabilidade além do Linux, sua melhor aposta é manter o POSIX. Outras variantes do unix podem não ter o bash instalado (o bash faz parte da instalação padrão no OSX, mas um pacote opcional no * BSD e na maioria dos unices comerciais). Quase todas as outras variantes unix além do Linux e OSX (ou seja, * BSD e unices comerciais) têm alguma versão do shell Korn , em menos pdksh . Muitas das extensões convenientes do bash são do ksh, então pode ser útil escrever scripts que possam ser executados em ambos, mas detectar onde o bash ou o ksh está localizado em um sistema desconhecido pode ser um pouco trabalhoso.

O shell não pode fazer tudo. Se você precisa de uma linguagem mais sofisticada, as duas opções mais comuns são Perl e Python (qualquer outra coisa está muito atrasada como uma linguagem de script unix). O Perl é a linguagem de script tradicional, e poucos sistemas Linux não incorporados o possuem, mas o Python está ganhando terreno (impulsionado em parte por ser a linguagem de script recomendada para o Ubuntu). No mundo não Linux, o Perl faz parte da instalação básica no OSX e no OpenBSD; É opcional, mas muito comumente instalado no FreeBSD, e opcional, mas frequentemente instalado no NetBSD.

    
por 26.09.2012 / 03:03
11

Na ordem de disponibilidade:

  1. sh, mas mantenha as instalações especificadas por POSIX.
  2. bash, mas não se esqueça de especificá-lo explicitamente no shebang, ou você pode entrar em colapso.
  3. Python. Quase todo mundo usa isso.
  4. Perl. Mas você pode escrevê-lo.

Depois disso, ninguém realmente se importa, já que não há muito que você não possa fazer apenas com isso.

    
por 26.09.2012 / 01:02
4

Normalmente, eu diria sh .... mas desde que você especificou o Linux, eu direi bash - é garantido que ele está em todos os sistemas Linux (bem, excluindo os obscuros pedantes fetichizar o minimalismo :).

Se você não precisa se preocupar com a portabilidade de não-Linux (e se você não precisa rodar em pequenas distribuições ou em dispositivos Linux embarcados como roteadores de caixa de plástico), então você pode também fazer uso do melhorias significativas que ele oferece em relação ao sh . Caso contrário, use sh .

Após bash (e sh ), a próxima linguagem de script mais "universal" para Linux seria algum dialeto de awk - geralmente mawk ou gawk . Se você mantiver o awk simples e evitar gawkisms, seu script deve rodar bem em quase qualquer sistema Linux (pode estar faltando em pequenas distros ou dispositivos embarcados). A maioria dos sistemas Linux terá mawk e gawk disponíveis, mas em algumas distros (debian, por exemplo) mawk é instalado por padrão e você tem que instalar gawk se você quiser.

O próximo passo será perl . AFAIK, a linguagem perl base é instalada por padrão em todas as distribuições Linux comuns, o que faz dela uma boa escolha. Ainda mais felizmente, há muito pouca incompatibilidade de versão com liberações perl5 (embora perl 5.12 ou poderia ter sido 5.14 finalmente conseguiu remover alguns recursos obscuros que haviam sido preteridos por cerca de 15 anos ... um amplo aviso para não usá-los) a menos que seu estilo de codificação seja realmente estranho e você queira ignorar mais de uma década de avisos "não faça isso", seus scripts perl serão executados muito bem em praticamente qualquer lugar. A linguagem é robusta e poderosa e pode fazer tudo que awk e sed podem fazer e muito mais. Com um pouco de esforço, ele pode fazer as coisas que sh é tradicionalmente bom também (por exemplo, executando comandos externos e usando / distribuindo a saída). As bibliotecas padrão do perl são bastante abrangentes também - abrangendo mais do que apenas o básico.

A única pegadinha com o perl é que há também uma enorme biblioteca de módulos do CPAN para fazer praticamente qualquer coisa que você possa imaginar (e muito mais que talvez nunca aconteça a você) - e nem todos estarão disponíveis em todos os sistema com perl. Eles geralmente são de alta qualidade, por isso é fácil adquirir o hábito de usá-los - mas se você fizer uso deles, terá que ter certeza de que eles estão instalados. Muitos módulos CPAN são pré-empacotados para Linux, e o restante é facilmente instalado com a ferramenta cpan (ou dh-make-perl no debian / ubuntu / etc para transformar um módulo CPAN em um pacote .deb)

Eu gostaria de poder dizer python em seguida, mas eu realmente não posso. Há muito o que gostar sobre o Python, mas ele não é incluído por padrão em muitos sistemas Linux e, francamente, sua compatibilidade com versões (tanto para o próprio Python quanto para suas bibliotecas supostamente "padrão") é uma completa desorganização. Algumas distros fazem um excelente esforço para resolver a bagunça e outras não. Nenhum deles é ajudado pelo fato de que python é basicamente uma linguagem escrita para programadores por programadores (ao contrário de sysadmins) e eles não parecem achar que o sistema seu código será instalado é de forma alguma importante .... o código deles é realmente super especial para que eles não precisem se preocupar com coisas chatas como a integração em sistemas existentes.

(Não tire a idéia errada do meu sarcasmo aqui - eu realmente gosto de python como uma linguagem, eu odeio o fato de que a versão e gerenciamento de dependência é uma PITA. É como voltar 20 + anos para a era de manualmente procurando por bits obscuros de código e patches para obter algo compilado e executado em seu * nix proprietário

    
por 26.09.2012 / 11:50
1

Eu sugiro seguir o ksh93 ou até mesmo o sabor POSIX e você sempre pode usar o bash / zsh para rodar.

E o uso de distro baseado em Debian não fica boquiaberto como padrão awk. Então, sim, evite adições ao Gawk, já que o mawk é muito mais rápido.

    
por 26.09.2012 / 07:23
0

Não é bash. Escreva para um close-to-POSIX sh como traço ou cinza. Isso vai ser mais universal. Eu não acho que há mais nada que seja um concorrente próximo. (E isso parece-me uma questão factual, não uma "opinião", como reclama um dos comentadores.)

Se você precisar de algo um pouco mais poderoso que o sh (por exemplo, se você quiser matrizes associativas reais), use o awk. (Evitando as extensões do gawk. Existem muitas versões do awk, mas há um núcleo amplamente compartilhado.) Isso deve estar disponível quase tão amplamente quanto sh.

    
por 26.09.2012 / 01:01
0

Eu diria que a disponibilidade seria classificada em algum lugar nesta ordem:

  1. sh
  2. awk
  3. Perl (ainda estou para ver um * nix sem ele, incluindo BSDs)

Embora o Python soe como uma boa linguagem, eu não usei nenhum sistema operacional que veio com ele em uma instalação básica, embora aparentemente o Ubuntu, talvez?

    
por 26.09.2012 / 16:24
0

Eu acredito que os especialistas aqui já forneceram ótimas sugestões que devem ajudá-lo a decidir. A usabilidade e disponibilidade dos diferentes shells foram bem descritas nos outros posts.

Em uma nota diferente, se eu fosse você, também consideraria a meta que desejo alcançar com os scripts. Toda ferramenta tem seus próprios méritos e deméritos. Então, embora eu use bastante o Python, não vou usar isso em todos os casos.

Posso pensar em alguns cenários e mencionar algumas ferramentas úteis para eles.

Arquivos FTP para frente e para trás; processá-los; enviar notificações por email; e assim por diante

Nesse caso, seria melhor usar o shell (por exemplo, Bash) e usar os vários utilitários (por exemplo, ftp , cron e mail ). Este é um caso de uso típico em muitas grandes empresas.

Processamento rápido de texto

Mais uma vez, o shell. Os utilitários como grep , awk , sed , paste e outros são muito úteis neste caso.

Construir

No domínio C / C ++, a ferramenta universal para isso é make . O mundo Java prefere a ANT Apache.

Implantação e controle remoto

Ou o shell ou o Python. Por exemplo, scp e rsync , respectivamente, seriam bastante úteis para copiar o (s) arquivo (s) ou sincronizar os arquivos.

O Python, por outro lado, tem um módulo muito útil chamado fabric . Isso seria útil para operações mais complexas, por exemplo, copiar arquivos, interromper algum processo, criar o servidor e da mesma forma. Além disso, o Python também fornece um módulo, pip , que pode resolver as dependências especificadas baixando e instalando os pacotes relevantes.

(Note que as sugestões acima não focam muito nos recursos do , mas nos diferentes utilitários disponíveis.)

    
por 31.08.2013 / 15:02
-1

Perl não está na base do FreeBSD, NetBSD ou DragonflyBSD, desculpe. O OpenBSD possui Perl na instalação base. O OS X é atualmente um UNIX certificado e pode ser considerado como um tipo de variante BSD em algum nível e tem Perl, Python e Ruby na base.

Muitos UNIXs proprietários não têm Perl em sua base, por exemplo, Solaris, AFAIK nem HP-UX ou IBM AIX também ...

    
por 31.08.2013 / 11:27