Dove sono archiviate le funzioni della shell su Linux?


11

All'inizio cercavo il motivo che whichnon produceva nulla dopo avergli dato alcuni programmi come argomento, ad es cd.

Da quello che ho trovato qui , il motivo probabilmente è che cdsulla mia macchina è una funzione, che è confermata da esecuzione type cd.

TLDR: Ma poiché i normali programmi che whichpossono individuare grazie alla $PATHvariabile sono collocati in una di quelle $PATHcartelle, dove sono cdmemorizzate funzioni o script come ?

user@linuxmchine:~$ type cd
cd is a function
cd () 
{ 
    __zsh_like_cd cd "$@"
}

Ho capito cd is a shell builtin. Dai un'occhiata alla pagina man per la tua shell (zsh?)
Xen2050,

1
Dai un'occhiata a unix.stackexchange.com/questions/85249/… Il problema è quello che è un comando legacy che non dovrebbe essere usato, specialmente a causa di cose come questa domanda.
Joe,

Risposte:


12

Funzioni definite dall'utente

In genere le funzioni bash sono memorizzate in modo permanente in uno bashscript di avvio.

  • Script di avvio a livello di sistema: /etc/profileper shell di login e /etc/bashrcper shell interattive.
  • L'utente definisce gli script di avvio: ~/.bash_profileper shell di login e ~/.bashrcper shell interattive.
  • Maggiori informazioni sulle shell interattive / login sono disponibili nella manpagina bash nella sezione INVOCATION.

Le funzioni shell definite dall'utente vengono caricate dinamicamente in un hash (o tabella di ricerca) all'avvio di bash. Dal file sorgente bash variable.cla definizione per la tabella è:

/* The list of shell functions that the user has created, or that came from
   the environment. */
HASH_TABLE *shell_functions = (HASH_TABLE *)NULL;

Le funzioni definite dall'utente possono essere elencate con il declarecomando bash , altre shell ancora usano typeset. In bash declareha sostituito il typesetcomando.

declare -f

Le funzioni esistono in memoria per tutta la durata della shell bash.

Funzioni definite dalla shell (integrate)

Queste sono le funzioni comuni come echo, printf, cde :. Sono compilati in una libreria collegata bashall'eseguibile. La creazione delle definizioni nell'eseguibile consente di risparmiare tempo rispetto al caricamento di una definizione esterna. Le definizioni per queste funzioni (contenute nei .deffile sorgente che sono analizzate nel sorgente C) sono contenute nella builtinsdirectory del sorgente bash.

Un utile vantaggio: per informazioni sull'uso di un comando incorporato nella shell help <command>. per esempio

help                # list all builtins
help declare        # info and options for declare
help -m declare     # gives man style information for declare

Grazie per quella risposta estratto. Questo è esattamente quello che stavo cercando. Pensi che ci sia uno strumento per seguire le funzioni bash creando processi o qualcosa del genere typesetche mostri quale file / script ha causato la creazione / modifica di una funzione?
Gabrijel Šimunović,

Non conosco alcuno di questi strumenti: sarebbe un'opzione utile al comando declareo typesetper visualizzare il file sorgente di una definizione di funzione. Penso che sia un problema di ingegneria del software. Recentemente .aliasho trovato una funzione shell definita in un file, non quello che mi aspettavo!
suspectus,

8

Le funzioni della shell sono archiviate nella memoria della shell (o, forse, in file temporanei non documentati). Essi non esistono in alcun modo utilizzabile fino all'avvio della shell (per esempio, quando si accede a un CLI, o si avvia una finestra di shell come xterm) e sono definiti (ad esempio, attraverso la lettura .bashrc, .bash_profileo qualcosa di simile) e cessano di esiste quando la shell termina.


1
La natura effimera di qualcosa che digiti al prompt è importante. Il mio voto va a questa risposta. Se si digita cd () { pwd; builtin cd "$@"; }al prompt, l'unica posizione memorizzata è nella memoria della shell attualmente in esecuzione. (Il mio esempio è Bash, ma lo stesso principio si applica a qualsiasi shell.)
Tripleee

6

cde altri comandi comuni come echo, typee aliassono i cosiddetti builtin .

I comandi integrati sono contenuti nella shell stessa e diverse shell possono avere comandi integrati diversi.


4
Non so se varrebbe la pena sottolineare che il codice eseguibile per comandi integrati come cdè contenuto all'interno del programma shell stesso, ad esempio all'interno del file /bin/bashse questa è la shell. (Penso che le tue parole qui siano chiare, ma ho visto persone confuse da ogni sorta di cose.)
David Z,

1

La domanda del Super User Trovare la definizione di una funzione bash è strettamente correlata a questa. L'utente HairOfTheDog ha fornito questa risposta (parafrasato):

I seguenti comandi segnaleranno la posizione (nome file e numero riga) della definizione di una funzione. Supponendo una funzione denominata foo,

# Turn on extended shell debugging
shopt -s extdebug

# Display the function’s name, line number and fully qualified source file
declare -F foo

# Turn off extended shell debugging
shopt -u extdebug

Ad esempio, l'output di questi comandi potrebbe essere:

foo 32 /source/private/main/developer/cue.pub.sh

Quanto sopra potrebbe funzionare solo nelle bashshell POSIX e non in generale.

Grazie a Blue Raspberry per aver trovato questo!

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.