Bash (Italiano)

From ArchWiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Tango-preferences-desktop-locale-modified.pngThe translation of this article or section does not reflect the original text.Tango-preferences-desktop-locale-modified.png

Reason: Last updated in 2012 (181561), out of sync with English page (Discuss in Talk:Bash (Italiano))

Bash (Bourne-again Shell) è una shell/linguaggio di programmazione appartenente al progetto GNU. Il suo nome è un omaggio al suo predecessore: la deprecata da tempo Bourne shell. Bash può essere eseguita su molti sistemi operativi UNIX-like, incluso GNU/Linux. Arch utilizza Bash per tutti i suoi init-scripts(script di avvio).

Invocazione

Il comportamento di Bash può essere variato a seconda di come viene invocato. Alcune descrizioni dei diversi modi vengono riportati sotto.

Login shell

Se Bash viene avviato da login in una tty. da un demone SSH, o simili, viene considerato una login shell. Questo modo può essere ottenuto tramite l'uso delle opzioni -l oppure --login dalla riga di comando.

Interactive shell

Bash è considerato una interactive shell se viene avviato senza l'utilizzo dell'opzione -c nè di altri argomenti che non siano opzioni, ed il cui standard input e standard error vengano indirizzati al terminale.

POSIX compliance

Bash può essere eseguito con una maggiore conformità agli standard POSIX, avviando Bash utilizzando l'opzione --posix da riga di comando oppure eseguendo ‘set -o posix’ durante l'esecuzione di Bash.

Legacy mode

In Arch /bin/sh (che era l'eseguibile per la Bourne shell) è un link simbolico a /bin/bash.

Se Bash viene invocato usando il nome sh, tenterà di imitare il solito comportamento di avvio della storica versione di sh, il più simile possibile, e cercherà anche di attenersi agli standard POSIX.

In questa modalità, Bash effettua il source dei file di avvio ed entrerà in POSIX compliance.

Configurazione

Tango-preferences-desktop-locale-modified.pngThe translation of this article or section does not reflect the original text.Tango-preferences-desktop-locale-modified.png

Reason: traduzione è obsoleta (Discuss in Talk:Bash (Italiano))

Panoramica dei file di configurazione

  • /etc/profile
  • ~/.bash_profile
  • ~/.bash_login
  • ~/.profile
  • /etc/bash.bashrc (Non-standard: solo alcune distro, Arch inclusa)
  • ~/.bashrc
  • ~/.bash_logout

Una panoramica dei file di configurazione comunemente usati:

/etc/profile

Viene effettuato il source di /etc/profile da tutte le shell compatibili con la Bourne shell al momento del login. Imposta l'ambiente al login e carica le configurazioni specifiche per applicazione (/etc/profile.d/*.sh).

.profile

Questo file viene letto e ne viene effettuato il source da bash quando si effettua un login ed una shell interattiva viene avviata.

.bashrc

Il file ~/.bashrc viene letto e ne viene effettuato il source da bash quando viene invocata senza login e senza una shell interattiva, ad esempio, quando si avvia una console virtuale dal proprio desktop environment. Questo file è utile per impostare l'ambiente specifico dell'utente.

Ordine del source dei file di configurazione

Questi file vengono presi in considerazione da bash per il source in diverse circostanze.

  • se interattiva + login shell → /etc/profile poi il primo leggibile tra ~/.bash_profile, ~/.bash_login, e ~/.profile
    • Bash effettuerà il source di ~/.bash_logout all'uscita.
  • se interattiva + non-login shell → /etc/bash.bashrc poi ~/.bashrc
  • se login shell + legacy mode → /etc/profile poi ~/.profile

Ma in Arch, per default:

  • /etc/profile (indirettamente) effettua il source di /etc/bash.bashrc
  • /etc/skel/.bash_profile che gli utenti sono incoraggiati a copiare in ~/.bash_profile, effettua il source di ~/.bashrc

il che implica che /etc/bash.bashrc e ~/.bashrc saranno eseguiti per tutte le shell interattive, sia che siano login shell o meno.

Esempi dei file punto possono essere trovati in /etc/skel/.

Nota: legacy mode è quando viene invocato il comando sh

Shell e variabili d'ambiente

La capacità di Bash e dei programmi eseguiti tramite essa, è che possono essere influenzati da un numero di variabili di ambiente. Le variabili d'ambiente sono usate per memorizzare valori come i percorsi contenenti gli eseguibili, oppure quale browser usare. Quando una shell o uno script viene lanciato esso eredita le sue variabili genitrici, questo a partire da una serie di variabili shell interne[1].

Queste variabili possono essere esportate per far si che diventino variabili d'ambiente:

VARIABILE=contenuto
export VARIABILE

Oppure con un solo comando

export VARIABILE=content

Le variabili d'ambiente sono convenzionalmente contenute nel file ~/.profile o in /etc/profile così che tutte le shell compatibili con la shell di Bourne possano utilizzarle.

Consultare Environment variables per maggiori informazioni.

Riga di comando

La riga di comando di Bash è gestita da una libreria separata chiamata Readline. Readline fornisce molte scorciatoie da tastiera per interagire con la riga di comando ad esempio per spostarsi prima o dopo una parola, cancellare una parola eccetera. Spetta Readline gestire la cronologia dei comandi eseguiti. Ed inoltre, permette di creare delle macro.

Alias

alias è un comando, che abilita l'uso di una parola al posto di un'altra stringa. Esso viene spesso utilizzato per abbreviare un comando, o per aggiungere opzioni o argomenti ad un comando utilizzato regolarmente.

Gli alias personalizzati sono preferibilmente contenuti nel file ~/.bashrc, mentre gli alias di sistema (che verranno utilizzati da tutti gli utenti) devono essere inseriti in /etc/bash.bashrc.

Funzioni

Bash supporta anche l'uso delle funzioni. La seguente funzione estrarrà un ampio insieme di tipi di file compressi. Aggiungere la funzione al file ~/.bashrc e viene utilizzato secondo la seguente sintassi extract <file1> <file2> ...:

~/.bashrc
extract() {
    local c e i

    (($#)) || return

    for i; do
        c=''
        e=1

        if [[ ! -r $i ]]; then
            echo "$0: file is unreadable: \`$i'" >&2
            continue
        fi

        case $i in
        *.t@(gz|lz|xz|b@(2|z?(2))|a@(z|r?(.@(Z|bz?(2)|gz|lzma|xz)))))
               c='bsdtar xvf';;
        *.7z)  c='7z x';;
        *.Z)   c='uncompress';;
        *.bz2) c='bunzip2';;
        *.exe) c='cabextract';;
        *.gz)  c='gunzip';;
        *.rar) c='unrar x';;
        *.xz)  c='unxz';;
        *.zip) c='unzip';;
        *)     echo "$0: unrecognized file extension: \`$i'" >&2
               continue;;
        esac

        command $c "$i"
        e=$?3
    done

    return $e
}
Nota: Gli utenti di Bash dovranno assicurarsi che extglob sia abilitato: shopt -s extglob, ad esempio aggiungendolo al file .bashrc. Viene abilitato di default se si utilizza il completamento di Bash. Gli utenti di Zsh dovranno invece lanciare il comando: setopt kshglob.

Un altro metodo per fare questo è installare il pacchetto unp.

Trucchi e Consigli

Personalizzazione del prompt

Il prompt è controllate dalla variabile $PS1. Per colorare il prompt di bash, prima commentare la variabile $PS1 di default:

#PS1='[\u@\h \W]\$ '

Successivamente aggiungere la seguente riga:

PS1='\[\e[0;31m\]\u\[\e[m\] \[\e[1;34m\]\w\[\e[m\] \[\e[0;31m\]\$ \[\e[m\]\[\e[0;32m\] '

La variabile $PS1 sopra è utile per il prompt dell'utente root, la parte iniziale in rosso e il testo della console verde. Per maggiori dettagli sulla personalizzazione del prompt della shell, consultare Color Bash Prompt.

Auto-completamento

Risulta utile avere l'auto-completamento attivo (premendo Tab due volte sulla tastiera) dopo che si è inserito un comando come sudo.

Per fare questo aggiungere una riga in questo formato nel file ~/.bashrc:

complete -cf your_command

Ad esempio, per abilitare l'auto-completamento dopo i comandi sudo e man:

complete -cf sudo
complete -cf man

Completamento avanzato

Nonostante il supporto nativo per l'auto completamento di Bash per i nomi file, i comandi e le variabili, ci sono diversi metodi per aumentare ed estenere la sua portata.

Il pacchetto bash-completion estende queste funzionalità aggiungendo l'auto completamento per un ampio numero di comandi ed le loro opzioni. Consentire il completamento avanzato su bash è molto semplice, basta installare il seguente pacchetto:

# pacman -S bash-completion

Per abilitare il completamento automatico di Bash, basterà avviare una nuova shell e sarà abilitato automaticamente grazie al file /etc/bash.bashrc.

Completamento veloce

Aggiungendo la seguente riga al file di inizializzazione di readline (~/.inputrc o /etc/inputrc di default):

set show-all-if-ambiguous on

non sarà necessario premere Tab (il tasto di default) due volte per ottenere una lista dei possibili completamenti (entrambi quando un parziale completamento sarà possibile), basterà una singola pressione del tasto per ottenerla. In alternativa per ottenere questa lista solo quando nessun completamento è possibile (quando non è possibile un completamento parziale), aggiungere la seguente riga al posto della precedente:

set show-all-if-unmodified on

Disabilitare Ctrl+z nel terminale

Si può disabilitare la combinazione Ctrl+z (mette in pausa/chiude le applicazioni lanciate nel terminale) inserendo i propri comandi in questo script

#!/bin/bash
trap "" 20
/percorso_per_l'applicazione/

esempio:

#!/bin/bash
trap "" 20
/usr/bin/adom

Con questo script di esempio, quando si premerà accidentalmente Ctrl+z invece di Shift+z o di altre combinazioni, mentre si gioca a Adom(un gioco) il gioco non verrà chiuso. Non succederà nulla perché il comando verrà ignorato.

Ripulire lo schermo dopo il log out

Per ripulire lo schermo dai precedenti output, una volta effettuato il log out da un terminale viruale, aggiungere le seguenti linee al file ~/.bash_logout:

clear
reset

ASCII art, fortune e cowsay

Oltre ai colori, le informazioni di sistema e i simboli ASCII, Bash può visualizzare dei disegni di ASCII art al login. Le immagini ASCII possono essere trovate online ed incollate all'interno di file di testo, o generate da zero. Per impostare la visualizzazione al login del terminale, inserire la riga

cat /percorso/del/file/di/testo

all'inizio del file ~/.bashrc.

Sarà possibile visualizzare frasi commoventi, ispiranti, stupide o maligne in modo casuale. Per vederne un esempio installare il pacchetto fortune-mod dal repositroy extra.

(user@host)-(10:10 AM Wed Dec 22)--(~)--->  fortune 
It is Texas law that when two trains meet each other at a railroad crossing, each shall come to a full stop, and neither shall proceed until the other has gone.

Per visualizzare una frase casuale quando si effettua il login in un terminale, aggiungere la riga

command fortune

all'inizio del file ~/.bashrc.

Nota: Di default, fortune visualizza citazioni e frasi innocue. Comunque, il pacchetto contiene una serie di commenti che qualcuno potrebbe ritenere offensive, e si trovano in /usr/share/fortune/off. Consultare la pagina di manuale per maggiori informazioni su queste frasi.

Queste due capacità possono essere combinate, uando il programma cowsay. Modificare la prima riga del file ~/.bashrc in

command cowsay $(fortune)

oppure in

command cowthink $(fortune)
The earth is like a tiny grain of sand, 
only much, much heavier.                
----------------------------------------- 
       \   ^__^
        \  (oo)\_______
           (__)\       )\/\
               ||----w |
               ||     ||

Le immagini ASCII possono essere generate dai file di testo .cow situati in /usr/share/cows, e tutti i temi possono essere elencati con il comando cowsay -l. Questi file possono essere modificati a discrezione dell'utente; possono anche essere create immagini personalizzate creandole di sana pianta oppure scaricandole dalla rete. Il modo più semplice per creare un file cow da una immagine trovata online è quella di aprire un file .cow con un editor di testo, ed incollarvi l'immagine dal browser, successivamente salvarla con un altro nome. Per testare il file personalizzato usare il comando

# cowsay -f cowfile $(fortune)

In questo modo è possibile visualizzare immagini accattivanti ed i comandi possono essere più complessi. Per esempi specifici, consultare questo sito. Un altro esempio, di uso casuale di cow, un immagine random, ed una buona formattazione di eventuali testi lunghi di fortunes.

fortune -a | fmt -80 -s | cowsay -$(shuf -n 1 -e b d g p s t w y) -f $(shuf -n 1 -e $(cowsay -l | tail -n +2)) -n
 ________________________________________ 
( Fry: I must be a robot. Why else would )
( human women refuse to date me?         )
---------------------------------------- 
       o
         o
           o  
              ,'``.._   ,'``.
             :,--._:)\,:,._,.:
             :`--,@@@:`...';\        
              `,'@@@@@@@`---'@@`.     
              /@@@@@@@@@@@@@@@@@:
             /@@@@@@@@@@@@@@@@@@@\
           ,'@@@@@@@@@@@@@@@@@@@@@:\.___,-.
          `...,---'``````-..._@@@@|:@@@@@@@\
            (                 )@@@;:@@@@)@@@\  _,-.
             `.              (@@@//@@@@@@@@@@`'@@@@\
              :               `.//@@)@@@@@@)@@@@@,@;
              |`.            _,'/@@@@@@@)@@@@)@,'@,'
              :`.`-..____..=:.-':@@@@@.@@@@@_,@@,'
             ,'\ ``--....-)='    `._,@@\    )@@@'``._
            /@_@`.       (@)      /@@@@@)  ; / \ \`-.'
           (@@@`-:`.     `' ___..'@@_,-'   |/   `.)
            `-. `.`.``-----``--,@@.'
              |/`.\`'        ,',');
                  `         (/  (/
(user@host)-(10:10 AM Wed Dec 22)--(~))--->

Calendario storico ASCII

Per installare i file del calendario nella cartella ~/.calendar:

$ mkdir -p ~/.calendar
$ curl -o calendar.rpm http://download.fedora.redhat.com/pub/epel/5/x86_64/calendar-1.25-4.el5.x86_64.rpm[link interrotto 2020-08-02]
$ rpm2cpio calendar.rpm | bsdtar -C ~/.calendar --strip-components=4 -xf - ./usr/share/c*

Questo comando visualizzerà gli oggetti nel calendario

$ sed -n "/$(date +%m\\/%d\\\|%b\*\ %d)/p" $(find ~/.calendar /usr/share/calendar -maxdepth 1 -type f -name 'c*' 2>/dev/null);

Personalizzare il Titolo

La variabile $PROMPT_COMMAND vi permette di eseguire un comando prima del prompt. Ad esempio, è possibile cambiare il titolo con il path completo della directory in cui lavorate:

export PROMPT_COMMAND='echo -ne "\033]0;$PWD\007"'

Altre risorse