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.