Você só deve usar sempre #! /bin/sh
.
Você nunca deve usar extensões bash (ou zsh, ou fish ou ...) em um script de shell.
Você só deve escrever scripts de shell que funcionem com qualquer implementação da linguagem do shell (incluindo todos os programas "utilitários" que acompanham o próprio shell). Atualmente, você provavelmente pode considerar o POSIX.1-2001 ( não -2008) como autoritário para o que o shell e os utilitários são capazes, mas esteja ciente de que um dia você poderá ser chamado para portar seu script para um sistema legado (por exemplo, Solaris ou AIX) cuja concha e utilitários foram congelados por volta de 1992.
Sério ?!
Sim seriamente.
Aqui está a coisa: Shell é uma linguagem de programação terrível . A única coisa que /bin/sh
vale a pena é o único e único interpretador de script que é garantido que toda instalação do Unix possui.
Aqui está outra coisa: /usr/bin/perl
é mais provável que alguma iteração do interpretador principal do Perl 5 ( ) esteja disponível em uma instalação Unix selecionada aleatoriamente do que (/(usr|opt)(/(local|sfw|pkg)?)?/bin/bash
é. Outras boas linguagens de script (Python, Ruby, node.js, etc. - inclusive incluímos PHP e Tcl nessa categoria quando comparados ao shell) também estão disponíveis como o bash e outros shells estendidos.
Portanto, se você tiver a opção de escrever um script bash, poderá usar uma linguagem de programação que não seja terrível.
Agora, scripts shell simples , do tipo que apenas executam alguns programas em uma sequência de um trabalho cron ou algo assim, não há nada de errado em deixá-los como scripts shell. Mas scripts shell simples não precisam de matrizes, funções ou [[
até mesmo. E você só deve escrever scripts de shell complicados quando não tiver outra opção. Os scripts do Autoconf, por exemplo, ainda são apropriadamente scripts shell. Mas esses scripts precisam ser executados em todas as encarnações /bin/sh
relevantes para o programa que está sendo configurado. e isso significa que eles não podem usar nenhuma extensão. Você provavelmente não precisa se preocupar com Unixes proprietários antigos atualmente, mas provavelmente deve se preocupar com os BSDs de código aberto atuais, alguns dos quais não são instaladosbash
por padrão, e ambientes incorporados que fornecem apenas um mínimo de shell e busybox
.
Concluindo, no momento em que você se encontra querendo um recurso que não está disponível na linguagem shell portátil, isso é um sinal de que o script se tornou muito complicado para permanecer um script shell. Reescreva-o em um idioma melhor.
bash
funções e sintaxe, em vez desh
funções e sintaxe.