Si dovrebbe usare sempre e solo #! /bin/sh
.
Non utilizzare mai le estensioni bash (o zsh, o fish, o ...) in uno script di shell, mai.
Dovresti sempre scrivere script di shell che funzionino con qualsiasi implementazione del linguaggio di shell (inclusi tutti i programmi di "utilità" che vanno insieme alla shell stessa). In questi giorni puoi probabilmente prendere POSIX.1-2001 ( non -2008) come autorevole per ciò che la shell e le utility sono in grado di fare, ma tieni presente che un giorno potresti essere chiamato a portare il tuo script su un sistema legacy (ad esempio Solaris o AIX) la cui shell e utility sono state congelate intorno al 1992.
Cosa, sul serio ?!
Si, seriamente.
Ecco il punto: Shell è un terribile linguaggio di programmazione. L'unica cosa che deve fare è che /bin/sh
è l'unico e unico interprete di script che ogni installazione di Unix è garantita.
Ecco l'altra cosa: alcune iterazioni dell'interprete core Perl 5 ( /usr/bin/perl
) hanno più probabilità di essere disponibili su un'installazione Unix selezionata casualmente di quanto non lo (/(usr|opt)(/(local|sfw|pkg)?)?/bin/bash
sia. Altri buoni linguaggi di scripting (Python, Ruby, node.js, ecc. - Includerò anche PHP e Tcl in quella categoria quando si confronta con la shell) sono approssimativamente disponibili come bash e altre shell estese.
Pertanto, se hai la possibilità di scrivere uno script bash, hai la possibilità di usare un linguaggio di programmazione che non è terribile, invece.
Ora, semplici script di shell, il tipo che esegue solo alcuni programmi in una sequenza da un lavoro cron o qualcosa del genere, non c'è nulla di sbagliato nel lasciarli come script di shell. Ma semplici script di shell non hanno bisogno di matrici o funzioni o [[
addirittura. E dovresti scrivere script di shell complicati solo quando non hai altra scelta. Gli script di autoconf, ad esempio, sono correttamente script di shell. Ma quegli script devono essere eseguiti su ogni incarnazione /bin/sh
rilevante per il programma che si sta configurando. e ciò significa che non possono utilizzare alcuna estensione. Oggigiorno probabilmente non devi preoccuparti dei vecchi Unix proprietari, ma probabilmente dovresti preoccuparti degli attuali BSD open source, alcuni dei quali non si installanobash
per impostazione predefinita, e ambienti incorporati che offrono solo una shell minima e busybox
.
In conclusione, nel momento in cui ti ritrovi a desiderare una funzione che non è disponibile nel linguaggio della shell portatile, questo è un segno che lo script è diventato troppo complicato per rimanere uno script di shell. Riscriverlo invece in una lingua migliore.
bash
funzioni e sintassi anzichésh
funzioni e sintassi.