Lo script bash è uguale allo script di shell?


58

Sono molto nuovo su Ubuntu. Sento la gente dire "shell scripting", "bash scripting".

Mi chiedo sono uguali? O sono diversi?


C'è una risposta utile a SO
Mr. Pei

Risposte:


55

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.


1
Cosa definisce dash come la shell di scripting predefinita?
wjandrea,

1
@wjandrea Il fatto che /bin/shsia un link simbolico per /bin/dashrendere 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/shshell Bourne-famiglia conforme a POSIX.
Sergiy Kolodyazhnyy,

29

introduzione

Gli script di shell e gli Bashscript non sono la stessa cosa, poiché esistono altre shell come quelle shche possono essere utilizzate per eseguire uno script; uno script che deve essere eseguito da Bashdovrebbe essere etichettato come uno Bashscript. 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 she bashsono 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

Shera la shell Unix originale sviluppata da Stephen Bourne; tuttavia i sistemi basati su Debian e Ubuntu considerano dashla loro shshell ( 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 . Bashsta 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 Bashera una parte importante del progetto GNU. Vedere questa grande discussione sulla storia di Bashper ulteriori informazioni.

È importante notare che entrambi she Bash, come utilizzati in Ubuntu e altre distribuzioni, sono POSIXconformi, 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 POSIXparametri, 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 bashscript e hanno #!/bin/bashin 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/sho /bin/bash. Gli script della shell possono anche essere chiamati sulla riga di comando con sho bash.

Tuttavia, è importante notare che i risultati possono essere diversi a seconda di quale interprete viene chiamato, poiché non tutti i bashcomandi funzioneranno sh, mentre la maggior parte dei shcomandi funzionerà bash. In generale, la maggior parte degli utenti vorrà utilizzare i /bin/bashpropri script in modo da poter sfruttare il set di funzionalità estese; gli script di sistema possono essere eseguiti con /bin/shse 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 Bashed è pubblicato da O'Reilly. Una buona introduzione è anche intrapresa dalla Guida per principianti di Bash .


2
Questa risposta è in realtà superiore alla mia (la risposta accettata), la mia è arrivata appena una settimana prima di questa.
Hilton Shumway,

4

Ci sono molteplici shell disponibili per Ubuntu, come bash, zsh, ksh, tcshe 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 bashscript, 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.


2
$ 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:


2

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/shshebang) 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

Specificatore di Shebang e percorsi uniformi per eseguibili shell su sistemi operativi simili a Unix

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/dashun 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

La regola generale sarebbe:

Se un comando o un'opzione non sono definiti da POSIX, per prima cosa non inserirlo in uno #! /bin/shscript.

Converti il ​​tuo script o verifica la presenza di errori

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:

https://www.shellcheck.net/

http://mywiki.wooledge.org/Bashism


1
Risposta abbastanza buona, +1. Benvenuto in AskUbuntu!
Sergiy Kolodyazhnyy il

1
Per quanto riguarda Dash come / bin / sh su Ubuntu, c'è un articolo per quello che potresti voler citare. E c'è anche askubuntu.com/q/976485/295286
Sergiy Kolodyazhnyy
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.