Dove posso mettere una funzione shell definita dall'utente?


14

Sto programmando di creare una funzione che mi semplifichi le cose. La funzione sarebbe qualcosa di simile

function lazymode()
{
echo "Hello World!";
}

in modo che quando uso il comando lazymodenella shell , verrà emesso il Hello World!.

Quale file devo inserire la funzione definita dall'utente?

Risposte:


14

Dipende dalla funzione. Se è solo un one-liner semplicissimo come quello, potresti creare un alias o inserire la funzione ~/.bashrc(un file che viene caricato quando si avvia).

Se stai creando qualcosa di un po 'più carnoso, potrebbe avere più senso creare il proprio script eseguibile in ~/bin/cui non esisterà per impostazione predefinita (è solo una directory) ma dovrebbe essere sul tuo percorso. Ricorda per questo che il file dovrà essere eseguibile ( chmod +x filename) e iniziare con una #!/bin/bashstanza appropriata .

Il secondo percorso presenta alcuni chiari vantaggi:

  • È più facile vedere cosa è disponibile
  • Un errore di sintassi non riempie il tuo profilo
  • Non è necessario continuare a rifornire nuovamente la configurazione di bash se si modifica lo script
  • È disponibile per qualsiasi shell fintanto che viene utilizzato il percorso completo o si ~/bin/trova nel percorso anche per quella shell (che dovrebbe essere nella maggior parte dei casi AFAIK).

Ho usato l'opzione successiva. La mia funzione contiene comandi che eliminano file, wget è qualcosa, esegue i comandi javac e java. e quando l'ho provato sul terminale gnome, non funziona bene. Pensi che ci sia un problema?
Abel Melquiades Callejo,

Cosa fa invece?
Oli

È già stato risolto. Risolto con questa risposta
Abel Melquiades Callejo,

umm ... gli script utente non dovrebbero trovarsi /usr/local/bininvece nei guai con $PATH?
Braiam,

Mi sembra che un piccolo, ma degno di nota, vantaggio del mettere funzioni ~/.bashrc(come è sourced) sia che Bash cerca le funzioni prima di fare la ricerca PATH.
Zanna,

4

La scelta migliore sarebbe ~/.bashrcfile.

Si sia possibile scrivere le definizioni di funzione di shell direttamente in ~/.bashrcfile o, se hai un sacco di loro e non si vuole ingombrare il vostro ~/.bashrcfile li si può mettere in un altro file di vostra scelta - tanto per essere sicuri di fonte che file nel tuo ~/.bashrcfile. Ad esempio, se il file con le tue funzioni è chiamato bash_functions, aggiungi semplicemente nel tuo ~/.bashrcfile le righe:

if [[ -f /path/to/bash_functions ]]; then
    source /path/to/bash_functions
fi

o, equivalentemente:

if [[ -f /path/to/bash_functions ]]; then
    . /path/to/bash_functions
fi

dove il .è solo una rappresentazione simbolica di source. Il iftest verifica che il file /path/to/bash_functionsesista prima di provare a cercarlo.

Questa tecnica è molto simile alla creazione di alias ~/.bashrccreando un file chiamato ~/.bash_aliasese usando una sintassi simile a quella sopra ~/.bashrcper verificare la sua esistenza e quindi sorgente.


grazie, ha funzionato. a proposito, qual è la differenza con .profile? in alcuni Linux, non riesco a mettere le funzioni in bashrc
Abel Melquiades Callejo,

2
~/.profileil file viene eseguito dall'interprete dei comandi per le shell di accesso. Quando si utilizza la GUI e si apre il terminale, quel file non viene eseguito perché ci si troverà in una shell non di accesso.
Radu Rădeanu,

1

Ecco una procedura essenziale per dichiarare una funzione permanente:

  1. Apri il ~/.bashrcfile in un editor di testo. Non importa quale editor di testo, purché tu sappia come usarlo e finché apri il file/home/<username>/.bashrc

  2. Alla fine della ~/.bashrcdichiarazione la propria funzione, ad esempio:

    find_dirs(){
        find "$1" -type d
    }
  3. Salva e chiudi il file.

Il ~/.bashrcfile viene letto ogni volta che si apre la shell interattiva (ovvero una nuova scheda terminale, si sshaccede tramite o si apre TTY1 o altra console virtuale). Questo non sarà disponibile nei file di script, perché ~/.bashrcnon viene letto per shell non interattive. Inoltre, non è disponibile se si esegue bashcon l' --norcopzione.

Se si desidera che la funzione sia immediatamente disponibile nella scheda attualmente aperta, utilizzare il source ~/.bashrccomando.


Le funzioni accettano argomenti proprio come i normali comandi. Ad esempio, $1tramite $9indica i parametri posizionali quando chiami una funzione. Nell'esempio precedente find_dirsaccetta solo un parametro posizionale e verrebbe chiamato come find_dirs /etc. È inoltre possibile utilizzare $@per fare riferimento a tutti i parametri posizionali. Le funzioni accettano anche il reindirizzamento. È possibile chiamare una funzione con find_dirs $1 > /dev/null; potremmo anche dichiararlo come segue:

find_dirs(){
    find "$1" -type d
}

Nota da man bash: "Le funzioni vengono eseguite nel contesto della shell corrente; non viene creato alcun nuovo processo per interpretarle". Ciò significa che dovresti anche essere consapevole delle funzioni che hanno la capacità di modificare l'ambiente di esecuzione della shell: modificare le variabili e le impostazioni del terminale.

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.