2010-07-07 13 views
13

Ho appena iniziato a utilizzare Linux e sono curioso di sapere come vengono definiti i comandi integrati di shell come cd.quali sono i comandi integrati della shell in linux?

Inoltre, sarei grato se qualcuno potesse spiegare come sono implementati ed eseguiti.

+1

Questo non ha nulla a che fare con il kernel. –

risposta

12

Se volete vedere come builtin bash sono definito allora avete solo bisogno di guardare Section 4 of The Bash Man Page.

Se, invece, volete sapere come bultins bash sono implementate, avrete bisogno di guardare the Bash source code perché questi comandi vengono compilati in file eseguibile bash.

Un modo semplice e veloce per vedere se un comando è o meno un bash incorporato è utilizzare il comando help. Esempio, help cd ti mostrerà come viene definito il bash incorporato di "cd". Allo stesso modo per help echo.

3

Manjari, controllare il codice sorgente della shell bash da ftp://ftp.gnu.org/gnu/bash/bash-2.05b.tar.gz Troverete che la definizione di shell built-in comandi non in un binario eseguibile separato, ma la sua all'interno del guscio binario in sé (la shell nome built-in chiaramente lo suggerisce).

1

A Shell incorporato - http://linux.about.com/library/cmd/blcmdl1_builtin.htm per es. -

which cd 
/usr/bin/which: no cd in (/usr/bin:/usr/local/bin...... 

Non è una shell incorporata ma un binario.

which ls 
/bin/ls 
+2

Non completamente vero - a volte i comandi incorporati e gli eseguibili si sovrappongono, ad es. sebbene ci sia il programma '/ bin/echo', la maggior parte delle shell fornisce il proprio builtin 'echo'. –

+0

un altro esempio è "tempo" –

11

L'insieme effettivo di built-in varia da shell a shell. Ci sono:

  • Special built-in utilities, che deve essere integrato, perché hanno alcune proprietà speciali
  • Regular built-in utilities, che sono quasi sempre built-in, a causa della performance o di altre considerazioni
  • Qualsiasi programma di utilità standard può anche essere integrato se desideri un implementatore di shell.

È possibile scoprire se l'utilità è costruito utilizzando il comando type, che è supportato dalla maggior parte delle shell (anche se la sua uscita non è standardizzato). Un esempio dal dash:

$ type ls 
ls is /bin/ls 
$ type cd 
cd is a shell builtin 
$ type exit 
exit is a special shell builtin 

Re cd utilità, teoricamente non c'è niente impedisce un realizzatore di shell per la sua attuazione come comando esterno. cd non può modificare direttamente la directory corrente della shell, ma, ad esempio, potrebbe comunicare una nuova directory al processo della shell tramite un socket. Ma nessuno lo fa perché non ha senso. Tranne conchiglie molto vecchie (dove non c'era una nozione di built-in), dove cd usava qualche trucco di sistema sporco per fare il suo lavoro.

Come è implementato cd all'interno della shell? L'algoritmo di base è descritto here. Può anche fare del lavoro per supportare le funzionalità extra della shell.

2

Ogni shell Unix ha almeno alcuni comandi incorporati. Questi comandi incorporati fanno parte della shell e sono implementati come parte del codice sorgente della shell. La shell riconosce che il comando che è stato chiesto di eseguire era uno dei suoi builtin, e esegue quell'azione da solo, senza richiamare un eseguibile separato. Diverse shell hanno diversi builtin, anche se ci sarà un sacco di sovrapposizioni nel set di base.

A volte, i builtin sono incorporati per motivi di prestazioni. In questo caso, c'è spesso anche una versione di quel comando in $PATH (possibilmente con un set di funzionalità diverse, un diverso insieme di argomenti della riga di comando riconosciuti, ecc.), Ma la shell ha deciso di implementare il comando come un builtin in modo che potesse salva il lavoro di generare un processo di breve durata per fare del lavoro che potrebbe fare da solo. Questo è il caso per bash e printf, ad esempio:

$ type printf 
printf is a shell builtin 
$ which printf 
/usr/bin/printf 
$ printf 
printf: usage: printf [-v var] format [arguments] 
$ /usr/bin/printf 
/usr/bin/printf: missing operand 
Try `/usr/bin/printf --help' for more information. 

noti che nell'esempio precedente, printf è sia una shell builtin (implementato come parte di bash stesso), così come un comando esterno (situato in/usr/bin/printf). Notare che si comportano in modo diverso anche - quando vengono chiamati senza argomenti, la versione integrata e la versione di comando stampano diversi messaggi di errore. Nota anche l'opzione -v var (memorizza i risultati di questo printf in una variabile di shell denominata var) può essere eseguita solo come parte della shell - i sottoprocessi come/usr/bin/printf non hanno accesso alle variabili della shell che li ha eseguiti.

E questo ci porta alla seconda parte della storia: alcuni comandi sono incorporati perché devono essere. Alcuni comandi, come chmod, sono involucri sottili attorno alle chiamate di sistema. Quando si esegue /bin/chmod 777 foo, i fork shell, execs/bin/chmod (passando "777" e "foo") come argomenti, e il nuovo processo chmod esegue il codice C chmod("foo", 777); e quindi restituisce il controllo alla shell. Ciò non funzionerebbe per il comando cd, tuttavia. Anche se cd sembra lo stesso caso di chmod, deve comportarsi in modo diverso: se la shell ha generato un altro processo per eseguire la chiamata di sistema chdir, cambierebbe la directory solo per quel processo appena generato, non per la shell. Quindi, quando il processo è tornato, la shell sarebbe rimasta nella stessa directory di sempre, quindi cd deve essere implementato come shell incorporato.

Problemi correlati