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 POSIX sh
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, a pipestatus
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.
sh
.