Le funzioni della shell Bash sono un modo per raggruppare diversi comandi UNIX/Linux per l'esecuzione successiva utilizzando un unico nome per il gruppo . La funzione della shell Bash può essere eseguita proprio come un normale comando Unix. Le funzioni della shell vengono eseguite nel contesto della shell corrente senza creare alcun nuovo processo per interpretarle.
Sia gli alias bash che le funzioni consentono di definire scorciatoie per comandi più lunghi o più complicati. Tuttavia, gli alias non consentono flussi di controllo, argomenti e altri trucchi che queste funzioni consentiranno, come spiegato in questo tutorial.
Questo articolo fa parte della serie di tutorial bash in corso. Fare riferimento al nostro precedente tutorial sull'introduzione di bash, lo stato di bash esiste e gli esempi di alias bash.
Sintassi per creare una funzione bash:
function functionname() { commands . . }
- funzione è una parola chiave facoltativa.
- nome funzione è il nome della funzione
- comandi – Elenco dei comandi da eseguire nelle funzioni.
La funzione accetta argomenti. Durante l'esecuzione, gli argomenti della funzione diventano i parametri posizionali. Il parametro posizionale 0 avrà lo scriptname che rimane invariato.
Puoi chiamare la funzione bash dalla riga di comando come mostrato di seguito:
$ functionname arg1 arg2
- Quando la shell interpreta un comando Linux, prima esamina le speciali funzioni integrate come break, continue, eval, exec ecc., quindi cerca le funzioni della shell.
- Lo stato di uscita della funzione bash è lo stato di uscita dell'ultimo comando eseguito nel corpo della funzione.
Nota: Posizionare le definizioni delle funzioni della shell in un file di avvio della shell (ad esempio, .bash_profile ). In questo modo, la funzione shell è sempre disponibile per te dalla riga di comando. Fare riferimento al nostro precedente articolo sulla sequenza di esecuzione di bash per identificare quando verrà eseguito .bash_profile.
Esempio 1:funzione per visualizzare un lungo elenco di file con l'estensione specificata
La funzione "lsext" viene utilizzata per trovare l'elenco dei file nella directory corrente, che ha l'estensione indicata come mostrato di seguito. Questa funzione usa la combinazione di comando find e comando ls per portare a termine il lavoro.
$ function lsext() { find . -type f -iname '*.'${1}'' -exec ls -l {} \; ; } $ cd ~ $ lsext txt -rw-r--r-- 1 root root 24 Dec 15 14:00 InMorning.txt -rw-r--r-- 1 root root 184 Dec 16 11:45 Changes16.txt -rw-r--r-- 1 root root 458 Dec 18 11:04 Changes18.txt -rw-r--r-- 1 root root 1821 Feb 4 15:01 ChangesOfDB.txt
Esempio 2. Funzione Bash per eseguire un dato comando Linux su un gruppo di file
Nell'esempio seguente, la funzione “batchexec” trova i file con l'estensione data ed esegue il comando dato su quei file selezionati.
$ function batchexec() { find . -type f -iname '*.'${1}'' -exec ${@:2} {} \; ; } $ cd ~ $ batchexec sh ls $ batchexec sh chmod 755 $ ls -l *.sh -rwxr-xr-x 1 root root 144 Mar 9 14:39 debug.sh -rwxr-xr-x 1 root root 5431 Jan 25 11:32 get_opc_vers.sh -rwxr-xr-x 1 root root 22 Mar 18 08:32 t.sh
Nell'esempio sopra, trova tutti i file di script della shell con estensione .sh e cambia i suoi permessi in 755. (Tutti i permessi per l'utente, per il gruppo e altri permessi di lettura ed esecuzione). Nella definizione della funzione potresti notare "${@:2}" che fornisce il secondo e i seguenti parametri posizionali (funzione di espansione della shell).
Esempio 3. Funzione Bash per generare password casuali
La seguente funzione viene utilizzata per generare password complesse casuali con caratteri speciali per la lunghezza specificata. Se la lunghezza non è specificata per impostazione predefinita, viene generata con una lunghezza di 12 caratteri.
$ function rpass() { cat /dev/urandom | tr -cd '[:graph:]' | head -c ${1:-12} } $ rpass 6 -Ju.T[[ $ rpass Gz1f!aKN^""k
Nell'esempio precedente, quando rpass viene eseguito con l'argomento 6, genera una password casuale con 6 caratteri e rpass senza argomento genera una password di 12 caratteri. ${1:-12} significa che se $1 non è impostato o null 12 verrà restituito, altrimenti verrà sostituito il valore di $1.
Esempio 4. Funzione Bash per ottenere l'indirizzo IP di una determinata interfaccia
L'esempio seguente definisce una funzione chiamata "getip" che accetta il nome dell'interfaccia come argomento e fornisce l'indirizzo IP assegnato sull'interfaccia data nella macchina. (per impostazione predefinita restituisce l'indirizzo ip eth0). Questo usa il comando ifconfig per ottenere l'indirizzo IP.
$ function getip() { /sbin/ifconfig ${1:-eth0} | awk '/inet addr/ {print $2}' | awk -F: '{print $2}'; } $ getip 15.110.106.86 $ getip eth0 15.110.106.86 $ getip lo 127.0.0.1
Esempio 5. Funzione Bash per stampare i dettagli delle macchine
Questo esempio definisce la funzione che fornisce tutte le informazioni richieste sulla macchina. Gli utenti possono definire e chiamare questa funzione nei file di avvio, in modo da ottenere queste informazioni durante l'avvio.
$ function mach() { echo -e "\nMachine information:" ; uname -a echo -e "\nUsers logged on:" ; w -h echo -e "\nCurrent date :" ; date echo -e "\nMachine status :" ; uptime echo -e "\nMemory status :" ; free echo -e "\nFilesystem status :"; df -h } $ mach Machine information: Linux dev-db 2.6.18-128.el5 #1 SMP Wed Dec 17 11:41:38 EST 2008 x86_64 GNU/Linux Users logged on: root pts/2 ptal.mot Wed10 0.00s 1.35s 0.01s w -h Current date : Thu Mar 18 11:59:36 CET 2010 Machine status : 11:59:36 up 7 days, 3 min, 1 user, load average: 0.01, 0.15, 0.15 Memory status : total used free shared buffers cached Mem: 2059768 2033212 26556 0 81912 797560 -/+ buffers/cache: 1153740 906028 Swap: 4192956 48164 4144792 Filesystem status : Filesystem Size Used Avail Use% Mounted on /dev/sda1 12G 12G 0 100% / tmpfs 1006M 377M 629M 38% /dev/shm /dev/sdc5 9.9G 409M 9.0G 5% /mydisk
Esempio 6:funzione Bash per formattare meglio l'output
La seguente funzione cancellerà lo schermo, posizionerà il cursore nella parte superiore dello schermo, eseguirà ls e quindi posizionerà il cursore alla fine dello schermo.
$ function ll () { clear; tput cup 0 0; ls --color=auto -F --color=always -lhFrt; tput cup 40 0; } $ ll
Visualizza il codice funzione usando il comando di tipo
type è una shell incorporata usata per visualizzare il codice della funzione.
Syntax: type function-name
$ type ll ll is a function ll () { clear; tput cup 0 0; ls --color=auto -F --color=always -lhFrt; tput cup 40 0; alias ls="ls --color=auto -F" }
Per un facile riferimento, ottieni tutte le 6 funzioni menzionate in questo articolo da questo file di funzioni .bash_profile di esempio.
Aggiungi tutte queste funzioni al tuo file ~/.bash_profile, per assicurarti di avere sempre accesso a queste funzioni senza doverlo creare ogni volta.