Ho incontrato un comando di Linux, builtin cd.
Qual è la differenza tra i comandi builtin cde 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 cde cd?
In effetti, ho fatto alcune ricerche sulla differenza, ma non sono riuscito a trovare una spiegazione notevole e significativa al riguardo.
Risposte:
Il cdcomando è integrato, quindi normalmente builtin cdfarà la stessa cosa di cd. Ma c'è una differenza se cdviene ridefinito come funzione o alias, nel qual caso cdchiamerà la funzione / alias ma builtin cdcambierà 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 cdfunzione che fa qualcosa e cambia directory (dal momento che chiamare cdda 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 mysubdire \cd mysubdir?
cd, nel qual caso \cdignorerebbe 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 cdcomando è 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 bashcomando builtinimpone 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 cdsarebbe non chiamare tale. L'utilizzo builtin cdignora qualsiasi funzionalità sovraccarica che potrebbe essere stata aggiunta tramite una funzione shell o alias dall'utente.
Esempio:
Il cdcomando integrato può essere sovraccaricato da una funzione che aggiorna il prompt:
cd() {
builtin cd "$@" && PS1=$(__update_prompt)
}
dove __update_promptc'è qualche altra funzione fornita dall'utente che genera una stringa.
La builtin cdfunzione in non chiamerebbe la funzione in modo ricorsivo. L'uso builtin cdin una shell in cui questa funzione è attiva, inoltre, non chiamerebbe la funzione.
1 Ci sono Unices con un cdcomando 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 cdcome una delle utility esterne che dovrebbero essere disponibili ( cdnon è una delle "utility integrate speciali") . Può anche servire da test per vedere se sarebbe possibile cambiare directory di lavoro in una data directory .
cdcomando esterno .