Risposte:
Bash ( bash
) è una delle tante shell Unix disponibili (ma le più utilizzate). Bash sta per " B ourne A gain SH ell" ed è un rimpiazzo / miglioramento della shell Bourne originale ( sh
).
Gli script di shell sono script in qualsiasi shell, mentre gli script di Bash sono script specifici per Bash. In pratica, tuttavia, "shell script" e "bash script" sono spesso usati in modo intercambiabile, a meno che la shell in questione non sia Bash.
EDIT: In realtà, la shell di scripting predefinita in Ubuntu è dash, mentre la shell interattiva predefinita (quello che ottieni se tiri su un terminale) è Bash. Tuttavia, i due termini sono ancora per lo più intercambiabili.
/bin/sh
sia un link simbolico per /bin/dash
rendere la shell di sistema predefinita , ma non è la shell di scripting predefinita , cioè non c'è una regola scritta che devi assolutamente usare /bin/sh
. Quando uno lo utilizza /bin/sh
è principalmente per motivi di portabilità, quando si prevede che lo script venga utilizzato su più piattaforme OS simili a Unix, la maggior parte delle quali ha una /bin/sh
shell Bourne-famiglia conforme a POSIX.
introduzione
Gli script di shell e gli Bash
script non sono la stessa cosa, poiché esistono altre shell come quelle sh
che possono essere utilizzate per eseguire uno script; uno script che deve essere eseguito da Bash
dovrebbe essere etichettato come uno Bash
script. I termini sono spesso usati in modo intercambiabile perché Bash
, con la sua funzionalità estesa rispetto a sh
, è quello più comunemente usato per eseguire script utente in molte distribuzioni. Tuttavia, ci sono altre shell, come la Korn (ksh)
, C shell (csh)
e la Z shell (zsh)
, ma non entreremo in loro qui come una discussione sh
e bash
sono più rilevanti per Ubuntu. Un grande articolo di IBM qui fornisce maggiori dettagli sull'evoluzione delle shell in Linux e descrive bene l'architettura delle shell e il modo in cui le shell differiscono.
Shell Scripting
Sh
era la shell Unix originale sviluppata da Stephen Bourne; tuttavia i sistemi basati su Debian e Ubuntu considerano dash
la loro sh
shell ( sh
è in realtà collegata a dash
). In Debian e Ubuntu, a causa della velocità di sh
, è più spesso usato per procedure di sistema critiche e per eseguire script chiave all'avvio; per maggiori dettagli vedi la wiki di Ubuntu . Bash
sta per Bourne Again SHell ed è stato sviluppato in seguito da Brian Fox e ha ampliato di molto l'originale sh
. Lo sviluppo di Fox e di altri Bash
era una parte importante del progetto GNU. Vedere questa grande discussione sulla storia di Bash
per ulteriori informazioni.
È importante notare che entrambi sh
e Bash
, come utilizzati in Ubuntu e altre distribuzioni, sono POSIX
conformi, il che significa che sottoscrivono una serie di standard su come i comandi vengono eseguiti in Shell. Questo per garantire che i risultati degli script utilizzati nel sistema operativo possano essere previsti in modo affidabile e che il comportamento della shell possa essere mantenuto all'interno di tali POSIX
parametri, in quanto ciò è particolarmente importante per gli sviluppatori. Per ulteriori informazioni sugli standard, consultare la documentazione ufficiale .
Spesso gli script shell hanno il suffisso .sh
, anche se sono destinati a essere eseguiti come bash
script e hanno #!/bin/bash
in cima allo script. In realtà non importa se lo script si chiama script.sh o my.script , ciò che conta è se la chiamata all'interprete è /bin/sh
o /bin/bash
. Gli script della shell possono anche essere chiamati sulla riga di comando con sh
o bash
.
Tuttavia, è importante notare che i risultati possono essere diversi a seconda di quale interprete viene chiamato, poiché non tutti i bash
comandi funzioneranno sh
, mentre la maggior parte dei sh
comandi funzionerà bash
. In generale, la maggior parte degli utenti vorrà utilizzare i /bin/bash
propri script in modo da poter sfruttare il set di funzionalità estese; gli script di sistema possono essere eseguiti con /bin/sh
se necessario.
Risorse per gli script di Bash Shell
A volte è difficile trovare risorse utili online che seguono le buone pratiche e che forniscono consigli che ti permetteranno di creare script utili. Dopo man bash
, alcune delle risorse più importanti sono la wiki di Greg , gli hacker di Bash e il recente libro di Steve Parker sulla sceneggiatura di Shell che si concentra principalmente su Bash
ed è pubblicato da O'Reilly. Una buona introduzione è anche intrapresa dalla Guida per principianti di Bash .
Ci sono molteplici shell disponibili per Ubuntu, come bash
, zsh
, ksh
, tcsh
e csh
.
Quindi ogni volta che qualcuno dice shell , sta parlando di uno di quelli. Tuttavia, quelle shell differiscono un po 'l'una dall'altra. Quindi, quando qualcuno parla di bash
script, sta usando una shell, ma quando qualcuno parla di script di shell, non sta di per sé usando bash
. Ma come bash
è comunemente usato negli script per Ubuntu, di solito lo è. Inoltre, le diverse shell sono le stesse in molti aspetti, quindi di solito non importa.
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Mar 29 11:53 /bin/sh -> dash*
$ ls -l /bin/dash
-rwxr-xr-x 1 root root 109768 Mar 29 11:53 /bin/dash*
$ ls -l /bin/bash
-rwxr-xr-x 1 root root 955024 Apr 3 08:58 /bin/bash*
Ciò dimostra che "sh" è un collegamento simbolico a "trattino" e che / bin / bash, che è la shell interattiva predefinita su Ubuntu, è un eseguibile che è quasi 9 volte più grande di / bin / sh.
In effetti, "man sh" (1590 righe) vs "man bash" (5459 righe) rivela che bash è un grande superset del tradizionale "sh".
Leggi di più qui:
Lo script della shell verrebbe definito come uno script orientato alla portabilità che può essere eseguito da una shell di sistema di sistemi operativi compatibili con POSIX. La sintassi sarebbe identica o simile alla sintassi del linguaggio di script di shell definita dallo standard POSIX. Questo è lo standard per la maggior parte dei sistemi operativi POSIX compatibili, come Linux / Unix / * BSD ecc. POSIX è il terreno più comune per la compatibilità tra i sistemi operativi.
Sistemi operativi diversi dai summenzionati implementano shell diverse per l'utilizzo non interattivo (ad es. Per eseguire script di sistema o script che usano #! /bin/sh
shebang) che oltre a implementare comandi e sintassi POSIX, hanno le loro estensioni o possono essere rimossi da alcune funzionalità meno utili per motivi di prestazioni, ma il terreno POSIX consente un livello molto elevato di portabilità degli script progettati per diversi Oss conformi a POSIX.
La maggior parte dei sistemi operativi di cui sopra ha una shell interattiva separata che di solito è completamente bash . Bash è conforme POSIX in gran parte, ma ha anche un grande pool di comandi aggiuntivi e supporta sintassi diverse. L'avvio di Bash con l'opzione della riga di comando --posix o l'esecuzione di 'set -o posix' mentre Bash è in esecuzione farà sì che Bash si conformi più da vicino allo standard POSIX modificando il comportamento in modo che corrisponda a quello specificato da POSIX nelle aree in cui l'impostazione predefinita di Bash differisce, vedi: https://www.gnu.org/software/bash/manual/html_node/Bash-POSIX-Mode.html
Grazie alle regole uniformi sul posizionamento degli eseguibili per le shell (di solito si trovano nella directory '/ bin /'), possiamo avere regole uniformi per la creazione di script di shell, in particolare, siamo chiari su quale percorso mettere nell'espressione shebang a cui puntare un eseguibile shell appropriato per eseguire lo script. I file system Unix / Linux / * BSD non supportano intrinsecamente le estensioni, quindi le estensioni dei file servono solo come suggerimento aggiuntivo o per scopi di indicizzazione.
Su Debian / Ubuntu in particolare, bin/sh
è un collegamento simbolico che punta a bin/dash
un eseguibile di una dash dash . Ciò rende il dash la shell di sistema, che è stimato essere 4 volte più veloce ed è di dimensioni ~ 1/10 rispetto alla bash più funzionale. fonte: https://unix.stackexchange.com/questions/148035/is-dash-or-some-other-shell-faster-than-bash
Debian / Ubuntu terminale interattivo è di default, come in molti altri Unix-like sistemi operativi, bash, per cui il percorso è anche uniforme: /bin/bash
.
Standard POSIX.1-2017: http://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xcu_chap02.html
Se un comando o un'opzione non sono definiti da POSIX, per prima cosa non inserirlo in uno
#! /bin/sh
script.
Per convertire il tuo script da bash al modulo POSIX, potresti voler verificare automaticamente la presenza di bug nel tuo script shell o vedere quali modifiche nel tuo script bash dovresti fare per renderlo compatibile con POSIX: