Ho incontrato un comando di Linux, builtin cd
.
Qual è la differenza tra i comandi builtin cd
e cd
?
In effetti, ho fatto alcune ricerche sulla differenza, ma non sono riuscito a trovare una spiegazione notevole e significativa al riguardo.
Ho incontrato un comando di Linux, builtin cd
.
Qual è la differenza tra i comandi builtin cd
e cd
?
In effetti, ho fatto alcune ricerche sulla differenza, ma non sono riuscito a trovare una spiegazione notevole e significativa al riguardo.
Risposte:
Il cd
comando è integrato, quindi normalmente builtin cd
farà la stessa cosa di cd
. Ma c'è una differenza se cd
viene ridefinito come funzione o alias, nel qual caso cd
chiamerà la funzione / alias ma builtin cd
cambierà comunque la directory (in altre parole, manterrà l'accesso integrato anche se ostruito da una funzione).
Per esempio:
user:~$ cd () { echo "I won't let you change directories"; }
user:~$ cd mysubdir
I won't let you change directories
user:~$ builtin cd mysubdir
user:~/mysubdir$ unset -f cd # undefine function
O con un alias:
user:~$ alias cd='echo Trying to cd to'
user:~$ cd mysubdir
Trying to cd to mysubdir
user:~$ builtin cd mysubdir
user:~/mysubdir$ unalias cd # undefine alias
L'utilizzo builtin
è anche un buon modo per definire una cd
funzione che fa qualcosa e cambia directory (dal momento che chiamare cd
da essa continuerebbe a chiamare nuovamente la funzione in una ricorsione infinita.)
Per esempio:
user:~ $ cd () { echo "Changing directory to ${1-home}"; builtin cd "$@"; }
user:~ $ cd mysubdir
Changing directory to mysubdir
user:~/mysubdir $ cd
Changing directory to home
user:~ $ unset -f cd # undefine function
builtin cd mysubdir
e \cd mysubdir
?
cd
, nel qual caso \cd
ignorerebbe l'alias ed eseguirà la funzione. Vedere stackoverflow.com/a/16506263/4518341
Nella maggior parte dei casi, non vi è alcuna differenza (ma vedi sotto). Il cd
comando è un comando integrato in tutte le shell. Deve essere incorporato 1 in quanto un comando esterno non può cambiare l'ambiente della shell che invoca e cambiare la directory di lavoro costituisce un cambiamento nel suo ambiente.
Il bash
comando builtin
impone alla shell di utilizzare la versione integrata di un comando, anche se potrebbero essere disponibili funzioni shell, alias o comandi esterni con lo stesso nome.
Nel caso in cui v'è ad esempio una funzione di shell con il nome cd
, allora builtin cd
sarebbe non chiamare tale. L'utilizzo builtin cd
ignora qualsiasi funzionalità sovraccarica che potrebbe essere stata aggiunta tramite una funzione shell o alias dall'utente.
Esempio:
Il cd
comando integrato può essere sovraccaricato da una funzione che aggiorna il prompt:
cd() {
builtin cd "$@" && PS1=$(__update_prompt)
}
dove __update_prompt
c'è qualche altra funzione fornita dall'utente che genera una stringa.
La builtin cd
funzione in non chiamerebbe la funzione in modo ricorsivo. L'uso builtin cd
in una shell in cui questa funzione è attiva, inoltre, non chiamerebbe la funzione.
1 Ci sono Unices con un cd
comando esterno (macOS e, credo, Solaris). Lo scopo di quel comando, che non può cambiare la directory di lavoro per una shell, è probabilmente quello di soddisfare lo standard POSIX, che elenca cd
come una delle utility esterne che dovrebbero essere disponibili ( cd
non è una delle "utility integrate speciali") . Può anche servire da test per vedere se sarebbe possibile cambiare directory di lavoro in una data directory .
cd
comando esterno .