Qual è la differenza tra i comandi integrati cd e cd?


Risposte:


41

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

5
+1 Gli esempi sono particolarmente illustrativi qui.
Tashus,

2
Nel caso di un alias, c'è qualche differenza tra builtin cd mysubdire \cd mysubdir?
Gerrit,

2
@gerrit Solo se esiste una funzione denominata cd, nel qual caso \cdignorerebbe l'alias ed eseguirà la funzione. Vedere stackoverflow.com/a/16506263/4518341
wjandrea

15

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 .


FWIW, MacOS rientrerebbe anche nella categoria dei sistemi operativi con un cdcomando esterno .
Yoann

@yoann In effetti lo fa.
Kusalananda

Grazie - hai reso la mia giornata di altissimo livello, ben studiata, pedanteria a piè di pagina.
James

la maggior parte delle shell - è un programma esterno per execlineb, ma poi il cd eseguirà gli argomenti rimanenti
Grump
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.