A linguagem de script mais universal para Linux é?

24

Estamos escrevendo scripts para sistemas Linux, houve um debate sobre qual seria a linguagem de script atual mais universal para Linux a ser usada. Bash, SH, Posix? O que?

Gilles 'SO- parar de ser mau'
fonte
3
Eu acho sh.
Blender
Você tem uma lista de distros de destino? Ou distros obrigatórios / desejáveis ​​nos quais deve ser executado?
4
"sh"? O que "sh"? A concha de Thomson? a concha Bourne? bash, ksh, pdksh, ash, zsh como encontrado /bin/shno sistema X ou Y ? A especificação sh POSIX, a especificação SUSv3, SUSv4 sh, a especificação LSB sh? "sh" por si só não significa nada.
Stéphane Chazelas 26/09/12
1
se for para criação de software e scripts de instalação, convém verificar Autotools, que tenta resolver problemas de compilação entre sistemas.
Lie Ryan
1
@sch A interseção comum mais portátil, "obviamente". No caso de pessoas não familiarizadas com os shells do Unix serem enganadas pelo seu comentário, a especificação POSIX é implementada por quase todos os shells contemporâneos que se atrevem a usar o nome sh, e os não conformes shque não são antigos e raros atualmente (por exemplo, Bourne). Pode-se recitar uma lista cada vez maior de extensões e variações, mas se o objetivo é "universal" ou portabilidade, deve-se seguir na direção oposta. A resposta de Gilles cobre os detalhes com mais profundidade.
Jw013 26/09/12

Respostas:

38

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

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

Todo sistema Linux e unix ou do tipo Unix possui um shell no estilo Bourne no caminho /bin/sh, e qualquer sistema não antigo possui um shell compatível com POSIX (exceto os erros ocasionais). Todo sistema moderno tipo unix (incluindo Linux) suporta shebangs ; portanto, ele executa automaticamente scripts /bin/shse a primeira linha for #!/bin/sh. Existem sistemas POSIX shem outro local (normalmente camadas de emulação em sistemas operacionais que você não consideraria realmente similares ao Unix).

Os sistemas Linux embarcados podem ter um sistema BusyBox simplificado que não implementa todos os recursos do POSIX. O BusyBox possui um grande número de opções em tempo de compilação para acomodar sistemas de dimensões reduzidas; portanto, é difícil saber o que esperar com antecedência, você precisa adaptar seus scripts para um dispositivo específico. BusyBox é a implementação mais comum de pequenas dimensões de utilitários sh e diversos; outro que você pode encontrar é o ambiente de shell extremamente reduzido no Android (versões posteriores são menos anêmicas).

Os sistemas Linux não incorporados quase sempre têm dash ou bash como /bin/sh. O Dash é um shell pequeno e rápido que implementa pouco mais que os recursos do POSIX. O Bash é um shell maior com mais recursos.

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

Uma das características da programação de shell é que você não está apenas usando o shprograma, mas também vários utilitários . A maioria dos utilitários de manipulação de arquivos e processamento de texto no Linux são os coreutils GNU (em sistemas embarcados, geralmente são 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 das unidades comerciais). Quase todas as variantes do unix, exceto Linux e OSX (* BSD e unidades comerciais), têm alguma versão do shell Korn , pelo menos pdksh . Muitas das extensões convenientes do bash são do ksh, portanto, pode ser útil escrever scripts que possam ser executados nos dois, mas detectar um pouco do local ou do bash ou do ksh em um sistema desconhecido.

A concha não pode fazer tudo. Se você precisar 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). Perl é a linguagem de script tradicional, e poucos sistemas Linux não incorporados não a 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 geralmente instalado no FreeBSD, e opcional, mas geralmente instalado no NetBSD.

Gilles 'SO- parar de ser mau'
fonte
1
"impulsionado em parte por ..." Isso e sendo quase obrigatório nos sistemas Fedora e RHEL.
Ignacio Vazquez-Abrams
Concordo principalmente com tudo isso. Apenas algumas ênfases diferentes: * algumas distros são baseadas no BusyBox, mas não necessariamente incorporadas (eu uso uma, Alpine). (Concedido, a resposta não dizer "quase sempre".) * BSDs são uma grande classe de Unix-like sistemas onde você não pode assumir o bash por padrão. * O dash pode fazer quase tudo o que o bash pode, mas às vezes exige mais cuidado. * Se você precisar de uma linguagem mais sofisticada, sim, Perl e Python são as escolhas mais comuns, mas o awk é ainda mais onipresente e adequado para muitos propósitos. Também é comumente subestimado. Mas é mais leve que o Perl e o Python.
dubiousjim
2
Um aviso justo - o FreeBSD retirou o Perl de sua instalação padrão há algum tempo. Além disso, não conheço nenhuma outra distribuição que não tenha o Perl na instalação básica.
TC1
@ TC1 Perl sempre foi opcional no NetBSD. Está no sistema básico do OpenBSD.
Gilles 'SO- stop be evil'
@dubiousjim Somente o Linux (não incorporado, ou uma aproximação suficientemente boa na prática) e o OSX têm o bash na instalação padrão; * O BSD possui pdksh ou mksh, e os escritórios comerciais possuem ATT ksh.
Gilles 'SO- stop be evil'
11

Em ordem de disponibilidade:

  1. sh, mas atenha-se às instalações especificadas pelo POSIX.
  2. bash, mas não se esqueça de especificá-lo explicitamente no shebang ou você poderá obter uma piada.
  3. Python. Quase todo mundo usa.
  4. Perl. Mas você consegue escrever.

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

Ignacio Vazquez-Abrams
fonte
10
Eu colocaria o PERL antes do python, ele é instalado por padrão na maioria dos sistemas Linux.
terdon
4
Perl é o número 3. E você pode escrever, bônus! :)
Warren Young
2
Concordo com @ignacio perl é # 4 e python é # 3. A razão é óbvia. Eu acho que Python é evolução do perl.
bagavadhar
5
@ashwin: não, python não é uma evolução de, ou mesmo como, perl. perl é um idioma por sysadmins para sysadmins. python é uma linguagem de programadores para programadores. Essa diferença é crucial. Ambos têm seus usos e, embora possa haver muita sobreposição nos casos de uso, para algumas tarefas o perl é a melhor escolha e para outros o python é claramente superior.
cas
1
Ruby e PHP foram inspirados pelo Perl. Python é o resultado de um experimento de física em que eles criaram anti-Perls em um supercollider. (Não tenho nada contra Python prós e contras, prós e contras..)
Warren Young
4

Normalmente, eu diria sh... mas desde que você especificou o Linux, eu direi bash- é garantido que ele esteja em todos os sistemas Linux ao redor (bem, excluindo os obscuros pedantemente pequenos que fetichizam o minimalismo :).

Se você não precisa se preocupar com a portabilidade não-linux (e se não precisar executar em pequenas distros ou em dispositivos Linux incorporados, como roteadores de caixas plásticas), poderá usar os aprimoramentos significativos que oferece sobre planície sh. Caso contrário, use sh.

Após bash(e sh), a próxima linguagem de script mais "universal" para Linux seria um dialeto de awk- geralmente um mawkou outro gawk. Se você continuar com o awk comum e evitar gawkisms, seu script deverá funcionar bem em praticamente qualquer sistema Linux (pode estar faltando em pequenas distros ou dispositivos incorporados). A maioria dos sistemas Linux possui ambos mawke estão gawkdisponíveis, mas em algumas distros (debian, por exemplo) mawké instalado por padrão e você deve instalar- gawkse, se desejar.

O próximo seria perl. AFAIK, o idioma base do perl é instalado por padrão em todas as distribuições comuns do Linux, o que a torna uma boa escolha. Ainda mais felizmente, há muito pouca incompatibilidade de versões com os lançamentos do perl5 (embora o perl 5.12 ou o 5.14 finalmente tenha conseguido remover alguns recursos obscuros que foram descontinuados por cerca de 15 anos ... amplo aviso para não usá-los), portanto a menos que seu estilo de codificação seja realmente estranho e você goste de ignorar mais de uma década de avisos "não faça isso", seus scripts perl funcionarão muito bem em quase qualquer lugar. A linguagem é robusto e poderoso e pode fazer tudo o que awke sedpode fazer e muito mais. Com um pouco de esforço, ele pode fazer as coisas queshtambém é tradicionalmente bom também (por exemplo, executar comandos externos e usar / canalizar a saída). As bibliotecas perl padrão também são bastante abrangentes - cobrindo mais do que apenas o básico.

O único problema com o perl é que também há uma enorme biblioteca de módulos CPAN para fazer qualquer coisa em que você possa pensar (e muito mais que talvez nunca lhe ocorra) - e nem todos eles estarão disponíveis em todos os sistemas com perl . Eles geralmente são de alta qualidade, por isso é fácil adquirir o hábito de usá-los - mas se você os usar, precisará garantir que eles estejam instalados. Muitos módulos CPAN são pré-empacotados para Linux e o restante é facilmente instalado com a ferramenta cpan (ou dh-make-perlno debian / ubuntu / etc para transformar um módulo CPAN em um pacote .deb)

Eu gostaria de poder dizer a pythonseguir, mas realmente não posso. Há muito o que gostar sobre o python, mas ele não está incluído por padrão em muitos sistemas Linux e, francamente, é a compatibilidade de versões (tanto para o próprio python quanto para suas bibliotecas supostamente "padrão") é uma bagunça completa. Algumas distros fazem um excelente esforço para resolver a bagunça, e outras não. Também não são ajudados pelo fato de o python ser basicamente uma linguagem escrita para programadores por programadores (em oposição a sysadmins) e eles não parecem pensar que o sistema em que o código será instalado é de todo importante. é realmente super especial, para que eles não precisem se preocupar com coisas chatas, como a integração em sistemas existentes.

(Não tenha uma idéia errada do meu sarcasmo aqui - eu realmente gosto de python como linguagem, odeio o fato de que o gerenciamento de versões e dependências é uma PITA. É como voltar 20 anos ou mais à era da caça manual por obscuros bits de código e patches para obter algo compilado e em execução no seu * nix proprietário)

cas
fonte
Eu sei que este é um post antigo, mas a melhor maneira de contornar isso é especificar qual versão no shebang (por exemplo /usr/bin/python2, /usr/bin/python3).
Isiah Meadows
1

Eu sugiro seguir o sabor ksh93 ou POSIX e você sempre pode usar o bash / zsh para executar.

E a distribuição baseada no Debian usa mawk e não gawk como awk padrão. Portanto, evite adições de gawk, pois o mawk é muito mais rápido.

MeaCulpa
fonte
0

Não festança. Escreva em um sh perto do POSIX, como traço ou cinza. Isso será muito universal. Não acho que exista outra coisa que seja um concorrente próximo. (E isso me parece uma pergunta factual, não uma "opinião", como reclama um dos comentaristas.)

Se você precisar de algo um pouco mais poderoso que o sh (por exemplo, se desejar matrizes associativas reais), use o awk. (Evitando as extensões 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.

dubiousjim
fonte
1
O awk-on-Linux é universalmente desajeitado; Não consigo pensar em nenhuma distro que possua outra variante por padrão.
Ignacio Vazquez-Abrams
5
Quais variantes do Linux não suportam bash?
Jonathan Leffler
1
Certamente bashpode ser instalado e executado em (quase) qualquer caixa Linux, mas muitos usuários debian instalarão apenas dashe preferem não instalar bash.
William Pursell
6
@WilliamPursell O pacote bash está marcado com o item Essential no Debian (ou seja, você precisa passar por um processo para desinstalar, com amplos avisos de que isso prejudicará seu sistema). O Bash é praticamente universal em sistemas Linux não incorporados.
Gilles 'SO- stop be evil'
1
@ JonathanLeffler: Por outro lado, os incorporados podem ter apenas o Busybox.
Caracol mecânico
0

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

  1. sh
  2. awk
  3. Perl (ainda não vi um * nix sem ele, incluindo BSDs)

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

Earlz
fonte
0

Acredito que os especialistas aqui já tenham fornecido ótimas sugestões que devem ajudá-lo a decidir. A usabilidade e disponibilidade dos diferentes shells foram bem descritas nas outras postagens.

Em uma nota diferente, se eu fosse você, também consideraria o objetivo que quero alcançar com os scripts. Toda ferramenta tem seus próprios méritos e deméritos. Portanto, embora eu use amplamente o Python, não o usarei em todos os casos.

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

Arquivos FTP para lá e para cá; processá-los; envie notificações por email; e assim por diante

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

Processamento rápido de texto

Mais uma vez, a concha. Os utilitários como grep, awk, sed, pastee outros são muito útil neste caso.

Construir

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

Implantação e controle remoto

O shell ou o Python. Por exemplo, scpe rsync, respectivamente, seria bastante útil para copiar o (s) arquivo (s) ou sincronizar os arquivos.

Python, por outro lado, possui 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, pipque pode resolver as dependências especificadas baixando e instalando os pacotes relevantes.

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

Barun
fonte
-1

Perl não está no FreeBSD, NetBSD ou DragonflyBSD, desculpe. O OpenBSD possui Perl na instalação base. Atualmente, o OS X é um UNIX certificado e pode ser considerado uma espécie de variante BSD em algum nível e possui Perl, Python e Ruby na base.

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

Marko V.
fonte
Sua declaração sobre o Perl ausente do Solaris está incorreta. Perl é um componente essencial do Solaris pelo menos desde 2005 (Solaris 10).
Jlliagre 31/08/2013