Bash (Unix shell)
La sintassi del comando Bash è un superset della sintassi del comando Bourne shell. Bash supporta l’espansione delle parentesi graffe, il completamento della riga di comando (completamento programmabile), il debug di base e la gestione del segnale (utilizzando trap
) da bash 2.05 a tra le altre funzionalità. Bash può eseguire la stragrande maggioranza degli script di Bourne shell senza modifiche, ad eccezione degli script di Bourne shell che si imbattono in un comportamento di sintassi marginale interpretato in modo diverso in Bash o tentano di eseguire un comando di sistema corrispondente a un nuovo builtin Bash, ecc. La sintassi del comando Bash include idee tratte dalla KornShell (ksh) e dalla shell C (csh) come la modifica della riga di comando, la cronologia dei comandi (history
comando), lo stack di directory, le variabili $RANDOM
e $PPID
e la sintassi di sostituzione dei comandi POSIX $(…)
.
Quando un utente preme il tasto tab all’interno di una shell di comando interattiva, Bash utilizza automaticamente il completamento della riga di comando, dalla versione beta 2.04, per abbinare nomi di programma, nomi di file e nomi di variabili parzialmente digitati. Il sistema di completamento della riga di comando Bash è molto flessibile e personalizzabile, ed è spesso confezionato con funzioni che completano argomenti e nomi di file per programmi e attività specifiche.
La sintassi di Bash ha molte estensioni che mancano nella shell di Bourne. Bash può eseguire calcoli interi (“valutazione aritmetica”) senza generare processi esterni. Utilizza il comando((…))
e la sintassi della variabile$((…))
per questo scopo. La sua sintassi semplifica il reindirizzamento I / O. Ad esempio, può reindirizzare lo standard output (stdout) e lo standard error (stderr) allo stesso tempo utilizzando l’operatore &>
. Questo è più semplice da digitare rispetto all’equivalente della shell Bourne ‘command > file 2>&1
‘. Bash supporta la sostituzione dei processi utilizzando la sintassi<(command)
e>(command)
, che sostituisce l’output di (o l’input a) un comando in cui viene normalmente utilizzato un nome file. (Questo è implementato tramite/proc/ fd / unnamed pipes su sistemi che lo supportano, o tramite named pipes temporanei dove necessario).
Quando si utilizza la parola chiave ‘function’, le dichiarazioni di funzione Bash non sono compatibili con gli script Bourne/Korn/POSIX (KornShell ha lo stesso problema quando si utilizza ‘function’), ma Bash accetta la stessa sintassi di dichiarazione di funzione delle shell Bourne e Korn ed è conforme a POSIX. A causa di queste e di altre differenze, gli script della shell Bash sono raramente eseguibili sotto gli interpreti della shell Bourne o Korn a meno che non siano scritti deliberatamente con questa compatibilità in mente, che sta diventando meno comune man mano che Linux diventa più diffuso. Ma in modalità POSIX, Bash si conforma più da vicino a POSIX.
Bash supporta qui i documenti. Dalla versione 2.05 b Bash può reindirizzare lo standard input (stdin) da una “here string” usando l’operatore <<<
.
Bash 3.0 supporta la corrispondenza delle espressioni regolari nel processo utilizzando una sintassi che ricorda Perl.
Nel febbraio 2009, Bash 4.0 ha introdotto il supporto per gli array associativi. Gli indici di array associativi sono stringhe, in modo simile a AWK o Tcl. Possono essere utilizzati per emulare array multidimensionali. Bash 4 passa anche la sua licenza a GPLv3; alcuni utenti sospettano che questa modifica delle licenze sia il motivo per cui macOS continua a utilizzare versioni precedenti. Apple ha finalmente smesso di usare Bash nei loro sistemi operativi con il rilascio di macOS Catalina in 2019.
Brace expansionEdit
Brace expansion, chiamata anche alternanza, è una caratteristica copiata dalla shell C. Genera una serie di combinazioni alternative. I risultati generati non devono esistere come file. I risultati di ogni stringa espansa non vengono ordinati e l’ordine da sinistra a destra viene mantenuto:
$ echo a{p,c,d,b}eape ace ade abe$ echo {a,b,c}{d,e,f}ad ae af bd be bf cd ce cf
Gli utenti non dovrebbero usare espansioni di parentesi graffe negli script della shell portatile, perché la shell Bourne non produce lo stesso output.
$ # A traditional shell does not produce the same output$ /bin/sh -c 'echo a{p,c,d,b}e'a{p,c,d,b}e
Quando l’espansione delle parentesi graffe viene combinata con i caratteri jolly, le parentesi vengono prima espanse e quindi i caratteri jolly risultanti vengono sostituiti normalmente. Quindi, un elenco di immagini JPEG e PNG nella directory corrente potrebbe essere ottenuto usando:
ls *.{jpg,jpeg,png} # expands to *.jpg *.jpeg *.png - after which, # the wildcards are processedecho *.{png,jp{e,}g} # echo just show the expansions - # and braces in braces are possible.
Oltre all’alternanza, l’espansione delle parentesi graffe può essere utilizzata per intervalli sequenziali tra due interi o caratteri separati da doppi punti. Le versioni più recenti di Bash consentono a un terzo intero di specificare l’incremento.
$ echo {1..10}1 2 3 4 5 6 7 8 9 10$ echo file{1..4}.txtfile1.txt file2.txt file3.txt file4.txt$ echo {a..e}a b c d e$ echo {1..10..3}1 4 7 10$ echo {a..j..3}a d g j
Quando l’espansione della parentesi è combinata con l’espansione variabile, l’espansione della variabile viene eseguita dopo l’espansione della parentesi, il che in alcuni casi può richiedere l’uso del eval
integrato, quindi:
$ start=1; end=10$ echo {$start..$end} # fails to expand due to the evaluation order{1..10}$ eval echo {$start..$end} # variable expansion occurs then resulting string is evaluated1 2 3 4 5 6 7 8 9 10
Startup scriptsEdit
All’avvio di Bash, esegue i comandi in una varietà di file dot. A differenza degli script di shell Bash, i file dot in genere non hanno il permesso di esecuzione abilitato né una direttiva interprete come #!/bin/bash
.
Esempio di avvio Bash compatibile legacy
Lo scheletro~/.bash_profile
di seguito è compatibile con la shell Bourne e fornisce semantica simile a csh per~/.bashrc
e~/.bash_login
&& cmd
è una valutazione di cortocircuito che verifica se il nome del file esiste ed è leggibile, saltando la parte dopo&&
se non lo è.
&& . ~/.profile # set up environment, once, Bourne-sh syntax onlyif ; then # are we interactive? && . ~/.bashrc # tty/prompt/function setup for interactive shells && . ~/.bash_login # any at-login tasks for login shell onlyfi # End of "if" block
Problemi del sistema operativo in Bash startupEdit
Alcune versioni di Unix e Linux contengono script di avvio del sistema Bash, generalmente sotto le directory /etc
. Bash li chiama come parte della sua inizializzazione standard, ma altri file di avvio possono leggerli in un ordine diverso rispetto alla sequenza di avvio Bash documentata. Il contenuto predefinito dei file dell’utente root può anche avere problemi, così come i file scheletro il sistema fornisce ai nuovi account utente al momento dell’installazione. Gli script di avvio che lanciano il sistema X window possono anche fare cose sorprendenti con gli script di avvio Bash dell’utente nel tentativo di impostare le variabili di ambiente utente prima di avviare il window manager. Questi problemi possono spesso essere risolti utilizzando un file~/.xsession
o~/.xprofile
per leggere il~/.profile
— che fornisce le variabili di ambiente che Bash shell windows generato dal window manager bisogno, come xterm o Gnome Terminal.
PortabilityEdit
Richiamare Bash con l’opzione--posix
o indicareset -o posix
in uno script fa sì che Bash si conformi molto strettamente allo standard POSIX 1003.2. Gli script di shell Bash destinati alla portabilità dovrebbero tenere conto almeno dello standard di shell POSIX. Alcune funzionalità bash non trovate in POSIX sono:
- Alcune opzioni di invocazione estese
- Espansione di parentesi
- Array e array associativi
- La doppia parentesi
]
costrutto di test esteso e la sua corrispondenza regex - Il costrutto di valutazione aritmetica delle doppie parentesi (solo
(( ... ))
;$ ((... ))
è POSIX) - Alcuni stringa-operazioni di manipolazione in espansione di parametro
-
locale
per scope variabili - il Processo di sostituzione
- Bash specifici comandi incorporati
- Coprocesses
- $EPOCHSECONDS e $EPOCHREALTIME variabili
Se un pezzo di codice utilizza tale funzione, è chiamato un “bashism” – un problema per un uso portatile. Debian checkbashisms
e Vidar Holen shellcheck
possono essere usati per assicurarsi che uno script non contenga queste parti. L’elenco varia a seconda della destinazione effettiva shell: la politica di Debian permette alcune estensioni nei loro script, come nel dash
), mentre uno script intenzione di supporto pre-POSIX Bourne shell, come autoconf s configurare
, sono ancora più limitati nelle funzionalità, che può utilizzare.
Scorciatoie da tastieramodifica
Bash utilizza readline per fornire scorciatoie da tastiera per la modifica della riga di comando utilizzando le associazioni di tasti predefinite (Emacs). I Vi-binding possono essere abilitati eseguendo set -o vi
.
Process managementEdit
La shell Bash ha due modalità di esecuzione per i comandi: batch e modalità concorrente.
Per eseguire i comandi in batch (cioè in sequenza) devono essere separati dal carattere”;”, o su righe separate:
command1; command2
in questo esempio, quando command1 è finito, command2 viene eseguito.
Un’esecuzione in background di command1 può verificarsi usando (symbol &) alla fine di un comando di esecuzione, e il processo verrà eseguito in background restituendo immediatamente il controllo alla shell e consentendo l’esecuzione continua dei comandi.
command1 &
O per avere un’esecuzione simultanea di due command1 e command2, devono essere eseguiti nella shell Bash nel modo seguente:
command1 & command2
In questo caso command1 viene eseguito in background & simbolo, restituendo immediatamente il controllo alla shell che esegue command2 in primo piano.
Un processo può essere fermato e il controllo restituito a bash digitando Ctrl+z mentre il processo è in esecuzione in primo piano.
Un elenco di tutti i processi, sia in background che in arresto, può essere ottenuto eseguendo jobs
:
$ jobs- Running command1 &+ Stopped command2
Nell’output, il numero tra parentesi si riferisce all’id del lavoro. Il segno più indica il processo predefinito per bg
efg
. Il testo “Running” e “Stopped” si riferiscono allo stato del processo. L’ultima stringa è il comando che ha avviato il processo.
Lo stato di un processo può essere modificato utilizzando vari comandi. Il comandofg
porta un processo in primo piano, mentrebg
imposta un processo arrestato in esecuzione in background. bg
efg
possono prendere un id lavoro come primo argomento, per specificare il processo su cui agire. Senza uno, usano il processo predefinito, identificato da un segno più nell’output di jobs
. Il comandokill
può essere usato per terminare un processo prematuramente, inviandogli un segnale. L’id del lavoro deve essere specificato dopo un segno di percentuale:
kill %1
Esecuzione condizionaleedit
Bash fornisce separatori di comandi “esecuzione condizionale” che rendono l’esecuzione di un comando subordinata al codice di uscita impostato da un comando precedente. Ad esempio:
cd "$SOMEWHERE" && ./do_something || echo "An error occurred" >&2
Dove ./ do_something viene eseguito solo se il comando cd (change directory) ha avuto “successo” (ha restituito uno stato di uscita pari a zero) e il comando echo viene eseguito solo se il cd o il ./ do_something comando restituisce un “errore” (stato di uscita diverso da zero).
Per tutti i comandi lo stato di uscita viene memorizzato nella variabile speciale$?
. Bash supporta ancheif ...;poi ...;altro ...; fi
ecase VARIABLE VARIABILE in pattern pattern)...;; other other_pattern)...;; esac
forme di valutazione dei comandi condizionali.
Segnalazione di bugedit
Un comando esterno chiamato bashbug segnala bug della shell Bash. Quando il comando viene richiamato, viene visualizzato l’editor predefinito dell’utente con un modulo da compilare. Il modulo viene inviato ai manutentori Bash (o facoltativamente ad altri indirizzi e-mail).
Programmabile completionEdit
Bash programmabile completamento,complete
ecompgen
comandi sono stati disponibili dalla versione beta di 2.04 nel 2000. Queste strutture consentono il completamento intelligente complesso, come l’offerta di opzioni di programma disponibili tab-complete e quindi, dopo che l’utente seleziona un’opzione che richiede un nome file come input successivo, solo il completamento automatico dei percorsi dei file (e non altre opzioni) per il token successivo.
Leave a Reply