Qual è il punto del comando esterno `cd`?


72

Come indicato in questa risposta eccellente , i sistemi POSIX hanno un binario esterno cdoltre all'integrato della shell. Su OS X 10.8 lo è /usr/bin/cd. Non puoi usarlo come il builtin cdpoiché esce immediatamente dopo aver cambiato la propria directory di lavoro. A quale scopo serve?


Si noti che Ubuntu e CentOS (e quindi presumibilmente Red Hat) non hanno /usr/bin/cd, solo la shell integrata.
Keith Thompson,

1
Il mio Fedora 19 include /bin/cdtuttavia.
slm

1
Debian (ho controllato diverse versioni, inclusi i test attuali) non ha /bin/cd/usr/bin/cd.
derobert,

1
Immagino che questi sistemi non siano strettamente POSIX. Proprio come tutti gli altri. :)
Kojiro,

Risposte:


65

Serve principalmente per assicurarsi che la cassetta degli attrezzi POSIX sia disponibile sia all'interno che all'esterno di un guscio (vedere la logica POSIX per richiedere quelli ).

Perché cd, ciò non è tremendamente utile, ma nota che cdcambia directory ma ha altri effetti collaterali: restituisce uno stato di uscita che aiuta a determinare se sei in grado chdir()di quella directory o meno e genera un utile messaggio di errore che spiega perché non puoi chdir()quando non puoi.

Esempio:

dirs_i_am_able_to_cd_into=$(find . -type d -exec cd {} \; -print)

Un altro potenziale effetto collaterale è il montaggio automatico di una directory.

Su alcuni sistemi, la maggior parte dei comandi esterni per i builtin della shell standard sono implementati come link simbolico allo stesso script che fa:

#! /bin/sh -
"${0##*/}" "$@"

Cioè avviare una shell ed eseguire il built-in in essa.

Alcuni altri sistemi (come GNU) hanno utilità come veri comandi eseguibili che possono portare a confusioni quando il comportamento differisce dalla versione integrata della shell.


3
+1 per l'osservazione di effetti collaterali e messaggi di errore. Non è sempre ben spiegato ai nuovi utenti che molti idiomi intelligenti in Unix provengono da un uso attento degli effetti collaterali. E le stesse pagine man non sono mai state brave a descrivere il quadro generale.
RBerteig,

Sono venuto qui da una domanda simile su SO, potresti elaborare cosa intendi quando dici "montaggio automatico di una directory"?
Sfogliando il


1
Per decomprimere un po 'il pensiero di Stéphane Chazelas: se è necessario assicurarsi che una directory automoutable sia effettivamente montata senza apportarvi modifiche e senza tentare di leggere alcun file, è possibile utilizzare il cdcomando esterno . Potrebbe essere utile nel monitoraggio della disponibilità di un filesystem remoto automountable, o forse prima di fare qualcosa di critico nel tempo con uno.
telcoM,

11

Il fatto che un comando cd non incorporato è disponibile è essenzialmente dovuto al POSIX requisito per tutti i comandi incorporati periodiche che richiamabile dai comandi famiglia exec env, find, nice, nohup, timee xargsunito al fatto alcuni di questi comandi non vengono implementate come si builtins.

Non ha molto senso, cdperò, poiché combinarlo con questi comandi è abbastanza inutile. Ecco alcuni esempi più o meno sostenibili:

find . -type d -exec cd {} \;
env HOME=/foo cd

2
Numerosi built-in sono in realtà esenti da tale regola . Stranamente, il cd non è uno di questi.
Kevin

5
@Kevin Ho scritto che è un requisito per tutti i builtin regolari , quelli esentati sono builtin speciali : break, :, continue, . , eval, exec, exit, export, readonly, return, set, shift, times, trap, unsetsarebbe irrilevante come comandi esterni mentre cdè un builtin regolare che ha alcuni casi d'uso documentati come comando.
jlliagre,

1

Oltre a verificare se un percorso corrisponde a una directory accessibile, l' cdeseguibile elaborerà e utilizzerà la CDPATHvariabile e stamperà il percorso assoluto della directory risolta se è stato utilizzato correttamente.

$ export CDPATH=/usr
$ echo bin lib | xargs -n 1 cd
/usr/bin
/usr/lib

Ciò è utile solo occasionalmente, ma risparmierebbe la reimplementazione della stessa logica per la ricerca di directory corrispondenti. Un caso d'uso concreto è trovare la prima directory esistente di un nome particolare sotto diversi possibili genitori.

cdanche i processi OLDPWDper cd -, ma ciò è meno concretamente utile poiché la variabile d'ambiente sarebbe già disponibile.

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.