Comprensione degli attraversamenti dei collegamenti simbolici della directory e della directory principale


9

Diciamo che hai delle directory /dir1e /dir2/linked, dove quest'ultima è un link simbolico alla prima.

Quando cda linkede pwd, si ottiene l'output /dir2/linked. Se poi cd .., sarai messo su /dir2. Questo comportamento è coerente con il concetto di essere dentro/dir2/linked prima. Tuttavia, a quanto ho capito, la directory principale ( ..) di qualsiasi directory è memorizzata nell'inode della directory (ovvero: fisicamente sul disco). Ovviamente, dato che /dir2/linkedè davvero /dir1, la directory principale sull'inode deve essere/

A complicare ulteriormente le cose, mentre all'interno /dir2/linked, le uscite di ls ..e cd .. ; ls .sono diverse! Sembra cdonorare il percorso simbolico, mentrels onora il percorso "fisico". Come accennato in questa domanda , c'è comunque cd -Pquesto caso d'uso.

man pwd menziona directory di lavoro "fisiche" e "logiche", ma a questo punto ho ancora alcune domande:

  • Questo comportamento è sempre fornito dal PWD variabile d'ambiente, come indicato in man pwd?
  • Perché impostazione predefinita cd e lscomportamenti diversi, se sono entrambi comandi shell (ovvero: non programmi)?
  • Il programma tipico (non il comando shell) utilizza al PWDposto del percorso fisico? Mi rendo conto che dipende dall'implementazione, ma c'è qualche regola empirica?

1
Molte informazioni in questa risposta
Stéphane Chazelas,

1
@ StéphaneChazelas Questa è una risposta fantastica, grazie per aver condiviso
goncalopp il

Prego. Sentiti libero di copiare e incollare il testo da lì se prevedi di rispondere autonomamente alla tua domanda.
Stéphane Chazelas,

Risposte:


5

bash "conosce" i collegamenti simbolici e tiene traccia di queste informazioni quando si utilizza un collegamento simbolico per accedere a una directory.

Puoi verificarlo nel seguente esempio nel modo seguente:

$ cd /dir2
$ cd linked
$ pwd
/dir2/linked
$ PWD='' bash -c pwd
/dir1

Devi iniziare bash con una PWDvariabile vuota , altrimenti usa quel trucco per visualizzare il percorso "falso".

Nota che ls è un programma separato e come tale non ha la conoscenza di bash di come sei arrivato alla directory corrente, quindi ls ..mostrerà solo il contenuto del reale directory genitore , non relativo al link simbolico che hai seguito.

La maggior parte dei programmi non dipenderà dalla variabile d'ambiente in CWDquanto ci sono molti modi per avviare i programmi, tramite la shell bash è solo uno, quindi non è affidabile aspettarsi CWDdi contenere il valore corretto (prova a impostare CWDqualcosa di sbagliato prima di farlo bash -c pwd, puoi vedere che controlla il valore per sanità mentale).


è utile sapere che chiarisci in questo PWDmodo, ma di per sé questo non risponde alle domande che ho citato
goncalopp,

Aggiunte alcune informazioni aggiuntive.
Wurtel,

Ho avuto l'impressione che mi sia lsstato fornito da Bash, ma tu e helpmi hai convinto diversamente. Questo rende le cose molto più chiare, grazie!
goncalopp,

PWDè standard in POSIX. Puoi fare affidamento su di esso per essere impostato. Se non è impostato, le cose potrebbero rompersi, ad esempio l' pwd utilità : vedi anche Variabili d'ambiente .
darkfeline,
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.