Comando cd in Linux: percorsi, directory precedente e script
Il comando cd cambia la directory di lavoro corrente della shell. In Bash puoi indicare un percorso assoluto o relativo, raggiungere la home con cd senza argomenti oppure tornare alla directory precedente con cd -.
cd è un comando interno, o builtin: modifica lo stato della shell in cui viene eseguito. Gli esempi seguenti si riferiscono a Bash su Linux; altre shell possono avere opzioni diverse. I percorsi assoluti come /srv/app sono esempi: devono esistere ed essere accessibili sul tuo sistema.
Cos'è il comando cd?
cd sta per change directory e cambia la directory di lavoro corrente della shell. I comandi eseguiti successivamente con percorsi relativi cercano file e directory basandosi sulla directory modificata.
Il comando pwd stampa la directory corrente. Nel primo esempio, il secondo pwd mostra /var/log se lo spostamento riesce.
pwd
cd /var/log
pwd
Eseguendo type cd, puoi confermare che si tratta di un comando interno di Bash. Se eseguito come programma separato, cambia solo la directory del processo figlio e non può influenzare la shell principale, quindi la shell lo implementa direttamente.
Sintassi di base
cd [-L] [-@] [directory]
cd -P [-e] [-@] [directory]
Normalmente basta indicare una directory. I due comandi seguenti sono esempi distinti: cd projects cerca una directory relativa alla posizione corrente, non necessariamente alla home. Nei percorsi relativi può intervenire anche CDPATH, spiegata più avanti.
cd /etc
cd projects
Uno spostamento riuscito restituisce lo stato di uscita 0. Un percorso inesistente, un componente che non è una directory o permessi insufficienti producono uno stato diverso da zero. Negli script controlla il risultato prima di eseguire operazioni che dipendono dalla posizione.
Percorsi assoluti e relativi
Percorsi assoluti
Un percorso assoluto che parte dalla directory root / punta allo stesso obiettivo indipendentemente dalla posizione corrente.
cd /var/log
cd /usr/local/bin
cd /
I percorsi assoluti sono più facili da comprendere se è necessario che la posizione di base sia chiara nelle procedure operative o negli script.
Usare percorsi relativi
Un percorso relativo parte dalla directory corrente. Per provare la sequenza seguente, scegli una posizione scrivibile in cui cd-demo non esista ancora. La catena con && interrompe le operazioni se un passaggio fallisce.
mkdir cd-demo &&
cd ./cd-demo &&
mkdir -p documents/projects/web documents/projects/backup &&
cd ./documents &&
cd ./projects/web &&
cd ../backup &&
pwd
L’ultimo pwd termina con /cd-demo/documents/projects/backup: dopo l’ingresso in web, ../backup risale a projects e scende in backup. Per tornare alla posizione iniziale usa cd ../../../... La cartella di prova rimane disponibile per l’ispezione.
Home, directory padre e directory precedente
Raggiungere la home
cd senza argomenti usa il valore della variabile HOME. cd ~ di solito raggiunge la stessa posizione, ma è la shell a espandere la tilde prima di eseguire il comando. Se HOME non è impostata, cd senza argomenti segnala un errore; per ~, Bash tenta invece di ricavare la home dalle informazioni dell’account. ~/Downloads funziona solo se quella sottodirectory esiste, con quel nome.
cd
cd ~
cd ~/Downloads
La forma ~nomeutente cerca la home nelle informazioni dell’account. Nell’esempio seguente alice deve essere un utente esistente.
cd ~alice
Non puoi spostarti in essa se l'utente non esiste o se non hai il permesso di accedere al percorso home.
Directory corrente e directory padre
Un punto . indica la directory corrente; due punti .. indicano la directory padre. Le righe seguenti illustrano forme diverse: ogni cd riuscito modifica la base dei successivi percorsi relativi.
cd .
cd ..
cd ../..
cd ../../shared
cd . normalmente mantiene la posizione. Per risalire di due livelli usa cd ../..; tre punti ... non sono una scorciatoia standard di Bash e indicano semplicemente un nome di directory. Tra cd e il percorso serve uno spazio: cd. è un altro nome di comando.
Tornare alla directory precedente con cd -
cd - si sposta nella directory di lavoro precedente memorizzata in OLDPWD e, se ha successo, stampa il nuovo percorso.
cd /etc
cd /var/log
cd -
È conveniente quando si alternano due directory. Se le informazioni sulla directory precedente non sono ancora state create nella shell corrente, potrebbe verificarsi un errore OLDPWD not set.
Percorsi con spazi e caratteri speciali
Racchiudi i percorsi tra virgolette
I percorsi con spazi dovrebbero essere racchiusi tra virgolette in modo da essere passati come un unico argomento.
cd "Project Files"
cd '/srv/shared data'
Quando si utilizza una variabile come percorso, è anche sicuro racchiuderla tra virgolette doppie per evitare che il valore venga suddiviso in più parole o espanso tramite globbing.
target='/srv/shared data'
cd -- "$target"
Backslash e nomi che iniziano con un trattino
È anche possibile fare l'escape degli spazi mettendo un backslash davanti a essi.
cd Project\ Files
Per un nome che inizia con un trattino, anteponi ./ oppure termina le opzioni con --. Le due righe seguenti sono alternative da eseguire dalla directory che contiene -archive.
cd ./-archive
cd -- -archive
Il completamento con Tab aiuta a inserire i nomi esistenti e a gestire gli spazi. Controlla comunque il percorso completato prima di eseguire il comando, soprattutto se esistono più nomi simili.
Comprendere PWD e OLDPWD
PWD rappresenta la posizione corrente
Bash memorizza la nuova directory di lavoro nella variabile PWD dopo uno spostamento riuscito. Puoi confrontarla con il comando pwd per controllare il percorso logico ricordato dalla shell corrente.
printf '%s\n' "$PWD"
pwd
~+ viene anche sostituito con il valore PWD nell'espansione della tilde di Bash.
printf '%s\n' ~+
OLDPWD rappresenta la posizione precedente
Dopo uno spostamento riuscito, la directory di lavoro precedente viene memorizzata in OLDPWD. cd - utilizza questo valore.
printf '%s\n' "$OLDPWD"
printf '%s\n' ~-
Immediatamente dopo l'avvio della shell o prima di spostarsi in una directory, OLDPWD potrebbe non esistere.
Collegamenti simbolici: -L e -P
Nei percorsi che contengono collegamenti simbolici, il percorso logico ricordato dalla shell può differire dal percorso fisico risolto dal file system.
Mantenere il percorso logico con -L
Normalmente Bash usa il percorso logico; -L richiede esplicitamente questo comportamento anche se è attiva l’opzione globale set -P. I componenti .. vengono elaborati sul percorso logico prima della risoluzione dei collegamenti. Se /srv/current è un collegamento a una release, PWD può quindi mantenere il nome /srv/current.
cd -L /srv/current
pwd
Conserva la struttura del percorso inserita dall'utente, rendendola facile da comprendere quando si lavora con collegamenti di progetto o il collegamento all'attuale release.
Usare il percorso fisico con -P
-P risolve i collegamenti simbolici durante l’attraversamento del percorso, prima di elaborare ... Per esempio, se /srv/current punta a /srv/releases/v1, cd -P /srv/current seguito da pwd -P mostra /srv/releases/v1. Con cd -L /srv/current/.. si raggiunge /srv; con cd -P /srv/current/.. si raggiunge /srv/releases, purché questi percorsi esistano e siano accessibili.
cd -P /srv/current
pwd -P
-e provoca il ritorno di uno stato di errore quando viene utilizzato con -P se non è possibile determinare il percorso fisico corrente dopo lo spostamento.
cd -P -e /srv/current
Cercare directory con CDPATH
CDPATH contiene directory di ricerca separate da due punti, un po’ come PATH per gli eseguibili. Bash la consulta per argomenti come sample-app. Un percorso assoluto o un percorso il cui primo componente è . o .., come ./build o ../backup, evita questa ricerca.
Esempio di impostazione di CDPATH
(
CDPATH=.:~/projects:/srv/apps
cd sample-app
)
L’esempio cerca sample-app prima nella directory corrente, poi in ~/projects e infine in /srv/apps. Almeno una delle directory corrispondenti deve esistere. Una voce vuota equivale alla directory corrente; anche . indica quella posizione. Le parentesi limitano la modifica di CDPATH e lo spostamento alla subshell, lasciando invariata la shell chiamante.
Precauzioni nell'uso di CDPATH
Quando trova la directory tramite una voce non vuota di CDPATH, Bash stampa il nuovo percorso assoluto. Anche una voce esplicita . è non vuota e può attivare questa stampa. Negli script questo output può interferire con valori raccolti tramite sostituzione di comando.
Negli script preferisci percorsi assoluti oppure percorsi relativi espliciti. CDPATH= davanti al comando azzera la ricerca per quella chiamata; il cambio di directory resta invece nella shell corrente. L’esempio richiede una sottodirectory build già esistente.
CDPATH= cd -- ./build
Eseguire un comando solo se cd riesce
Se lo spostamento fallisce, eseguire comunque il comando successivo può operare nella directory sbagliata. Con && il comando a destra viene eseguito soltanto se cd restituisce zero. Gli esempi con deploy.sh e build.sh presuppongono script già presenti, eseguibili e verificati: non installano né creano un’applicazione.
cd /srv/app && ./deploy.sh
In uno script eseguito come processo separato puoi interrompere esplicitamente il lavoro se cd fallisce. La sequenza seguente va inserita nello script; non eseguirla con source, perché exit chiuderebbe la shell corrente.
cd /srv/app || {
printf '%s\n' 'Impossibile raggiungere la directory di lavoro.' >&2
exit 1
}
./deploy.sh
Se si usa un punto e virgola come in cd path; command, il comando successivo verrà eseguito indipendentemente dal fatto che la modifica abbia avuto successo.
Script e subshell
Perché uno script non sposta la shell chiamante
Uno script avviato come programma separato modifica la propria directory di lavoro, non quella della shell chiamante. Per verificarlo senza usare percorsi di sistema, esegui questo esempio da una directory scrivibile in cui cd-script-demo non esista. Crea un piccolo script completo e una directory target; il file è scritto solo dopo la creazione riuscita della nuova cartella di prova.
mkdir cd-script-demo &&
cd ./cd-script-demo &&
mkdir target &&
printf '%s\n' '#!/usr/bin/env bash' 'cd ./target || exit 1' 'pwd' > change-directory.sh &&
chmod u+x change-directory.sh &&
./change-directory.sh &&
pwd
Lo script stampa un percorso che termina con /cd-script-demo/target, mentre l’ultimo pwd della shell chiamante termina con /cd-script-demo. Dalla stessa posizione esegui ora la riga seguente: source legge lo script nella shell corrente e questa volta la posizione diventa target. Una funzione shell può avere lo stesso effetto. Usa soltanto codice affidabile: source può modificare anche variabili, opzioni e altro stato della shell.
source ./change-directory.sh
Lavorare in una subshell
Per lavorare in una directory specifica mantenendo la posizione della shell chiamante, puoi creare una subshell usando le parentesi.
(
cd /srv/app && ./build.sh
)
Quando la subshell termina, la shell chiamante mantiene la posizione che aveva prima delle parentesi, anche se il lavoro interno fallisce. Per memorizzare e ripristinare più posizioni nella shell corrente puoi invece usare pushd e popd.
Perché sudo cd non funziona
sudo cd /root generalmente non può essere usato. cd è un comando integrato della shell corrente, e un processo avviato da sudo non può cambiare la directory di lavoro della shell padre.
Se la politica di amministrazione lo consente e ti serve una sessione amministrativa, sudo -i avvia una nuova shell di login dell’utente di destinazione, normalmente root. sudo tenta prima di raggiungerne la home. Per tornare alla shell iniziale termina la nuova sessione con exit.
sudo -i
Per un’unica operazione, applica sudo al comando che richiede privilegi. Le due righe seguenti sono alternative: la prima richiede che l’utente corrente possa entrare in /srv/app; la seconda fa eseguire sia lo spostamento sia lo script nella shell avviata con privilegi. maintenance.sh deve già esistere ed essere stato verificato.
cd /srv/app && sudo ./maintenance.sh
sudo sh -c 'cd /srv/app && ./maintenance.sh'
Usa i privilegi di amministratore solo dove necessario e assicurati che i percorsi e gli eseguibili siano attendibili.
Confronto tra cd, pushd e popd
| Comando | Uso principale | Funzionalità |
|---|---|---|
cd |
Si sposta nella directory specificata. | È possibile tornare alla posizione precedente utilizzando OLDPWD. |
pushd |
Inserisce la destinazione in cima allo stack e vi si sposta, mantenendo la posizione precedente nello stack. | Utile quando ci si sposta tra più posizioni, e Bash gestisce lo stack. |
popd |
Rimuove la voce in cima allo stack e passa alla directory che diventa la nuova cima. | Si abbina a pushd per ripristinare la posizione salvata. |
dirs |
Mostra lo stack delle directory. | È possibile visualizzare solo lo stato dello stack senza spostarsi. |
Comandi di spostamento usati frequentemente
| Comando | Descrizione |
|---|---|
cd |
Raggiunge la directory indicata da HOME. |
cd ~ |
Raggiunge la home tramite l’espansione della tilde. |
cd .. |
Risale alla directory padre. |
cd ../.. |
Risale di due livelli rispetto alla directory corrente. |
cd - |
Torna alla directory di lavoro precedente. |
cd / |
Raggiunge la radice del file system. |
cd ~/projects |
Raggiunge projects all’interno della home. |
cd -P path |
Risolve i collegamenti simbolici e usa il percorso fisico. |
Riepilogo delle opzioni
| Opzione | Descrizione |
|---|---|
-L |
Usa il percorso logico, il comportamento normale di Bash; richiede esplicitamente tale modalità anche quando set -P è attivo. |
-P |
Interpreta i collegamenti simbolici come il percorso fisico di destinazione e si sposta lì. |
-e |
Usato con -P, restituisce uno stato di errore se non riesce a determinare il percorso corrente fisico dopo lo spostamento. |
-@ |
Nei sistemi supportati, mostra gli attributi estesi dei file come se fossero directory. Questo potrebbe non essere supportato negli ambienti Linux tipici. |
-- |
Indica la fine delle opzioni ed è usato quando si trattano nomi di directory che iniziano con un trattino come argomenti. |
Errori comuni
Nessun file o directory di questo tipo
Il percorso potrebbe non esistere oppure potresti aver assunto erroneamente la posizione corrente. Verifica la posizione di base con pwd e controlla la sensibilità alle maiuscole/minuscole e gli spazi nel percorso.
pwd
ls -ld -- "target path"
Permesso negato
Per attraversare una directory serve il permesso di ricerca, rappresentato dal bit di esecuzione x, sulla destinazione e su ciascuna directory intermedia. Il permesso di lettura r permette di elencarne i nomi e svolge un ruolo diverso. Su Linux, se disponibile, namei -l aiuta a esaminare i componenti del percorso.
namei -l /path/to/directory
Prima di modificare i permessi, verifica l’accesso realmente necessario, i gruppi e le liste di controllo degli accessi (Access Control List, ACL). Anche altre politiche di sicurezza possono impedire l’accesso. Sostituisci i percorsi di esempio con quelli effettivi; non risolvere il problema assegnando indiscriminatamente permessi a tutti.
Non è una directory
L'ultimo componente o i componenti intermedi del percorso potrebbero essere file ordinari. Verifica i loro tipi con file e ls -ld.
file -- "target path"
ls -ld -- "target path"
FAQ
È normale che non ci sia output quando si esegue il comando cd?
Sì. Normalmente cd non stampa nulla se riesce; verifica la posizione con pwd. Fanno eccezione cd - e uno spostamento trovato tramite una voce non vuota di CDPATH, che stampano il nuovo percorso.
Come si sale di due livelli rispetto alla directory corrente?
cd ../.. risale di due livelli: ciascun .. indica la directory padre e la barra separa i componenti del percorso.
Posso cambiare la directory del terminale corrente usando uno script?
Uno script avviato come processo separato non può cambiare la directory della shell chiamante. Per farlo usa una funzione oppure source nella shell corrente, dopo aver verificato l’intero contenuto dello script.




