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?
linux
shell
scripting
portability
Gilles 'SO- parar de ser mau'
fonte
fonte
sh
./bin/sh
no 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.sh
, e os não conformessh
que 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.Respostas:
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/sh
se a primeira linha for#!/bin/sh
. Existem sistemas POSIXsh
em 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, apipestatus
variá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
sh
programa, 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.
fonte
Em ordem de disponibilidade:
Depois disso, ninguém realmente se importa, pois não há muito que você não possa fazer com apenas isso.
fonte
Normalmente, eu diria
sh
... mas desde que você especificou o Linux, eu direibash
- é 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, usesh
.Após
bash
(esh
), a próxima linguagem de script mais "universal" para Linux seria um dialeto deawk
- geralmente ummawk
ou outrogawk
. 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 ambosmawk
e estãogawk
disponíveis, mas em algumas distros (debian, por exemplo)mawk
é instalado por padrão e você deve instalar-gawk
se, 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 queawk
esed
pode fazer e muito mais. Com um pouco de esforço, ele pode fazer as coisas quesh
també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-perl
no debian / ubuntu / etc para transformar um módulo CPAN em um pacote .deb)Eu gostaria de poder dizer a
python
seguir, 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)
fonte
/usr/bin/python2
,/usr/bin/python3
).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.
fonte
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.
fonte
bash
?bash
pode ser instalado e executado em (quase) qualquer caixa Linux, mas muitos usuários debian instalarão apenasdash
e preferem não instalarbash
.Eu diria que a disponibilidade seria classificada em algum lugar nesta ordem:
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?
fonte
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
,cron
email
). 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
,paste
e 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,
scp
ersync
, 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,pip
que 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.)
fonte
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 ...
fonte