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.