Come dire se sono effettivamente in una posizione di collegamento simbolico dalla riga di comando?


33

Supponiamo di avere una cartella:

cd /home/cpm135/public_html

e creare un collegamento simbolico

ln -s /var/lib/class .

Più tardi, sono in quella directory:

cd /home/cpm135/public_html/class

La pwdsta per dirmi che sono in/home/cpm135/public_html/class

C'è un modo per sapere che sono "davvero" dentro /var/lib/class? Grazie



1
Alcune shell in realtà non ti consentono di essere all'interno di un collegamento simbolico. Ad esempio, la fishshell risolve automaticamente il collegamento simbolico quando lo si cdinserisce.
trysis,

Risposte:


56

A seconda di come pwdè configurato il comando, potrebbe essere predefinito mostrare la directory di lavoro logica (output di pwd -L) che mostrerebbe la posizione del link simbolico o la directory di lavoro fisica (output di pwd -P) che ignora il link simbolico e mostra la directory "reale".

Per informazioni complete puoi farlo

file "$(pwd -L)"

All'interno di un collegamento simbolico, questo tornerà

/path/of/symlink: symbolic link to /path/of/real/directory

1
sì, la -Pbandiera era ciò di cui avevo bisogno. Grazie
Oliver Williams il

6
Per rispondere anche alla domanda nel titolo, basta usare test "$(pwd -L)" = "$(pwd -P)" && echo No symlinks(o sostituire && echo No symlinkscon || echo Symlinks).
un CVn il

1
Questo risponde perfettamente alla domanda senza la necessità di fare eco. Se la domanda fosse: "Come posso visualizzare un messaggio se mi trovo in una directory con link simbolici?", Sarebbe richiesto l'eco.
Arronical,

file "$(pwd)"funziona solo se il collegamento simbolico è l'ultimo componente della directory. Non rileva il collegamento simbolico dell'OP quando viene registrato su CD /home/cpm135/public_html/class/foo/bar. Non sono a conoscenza di nulla che stampi informazioni per tutti i collegamenti simbolici in un percorso, ma puoi anche usarlo realpath ., che penso sia equivalente apwd -P
Peter Cordes,

17

Si noti che in pwdrealtà è una shell integrata. A seconda della shell e della sua configurazione, i risultati potrebbero cambiare. Per una soluzione più portatile, è necessario utilizzare /bin/pwd. Snippet dalla pagina del manuale:

NAME
       pwd - print name of current/working directory

SYNOPSIS
       pwd [OPTION]...

DESCRIPTION
       Print the full filename of the current working directory.

       -L, --logical
              use PWD from environment, even if it contains symlinks

       -P, --physical
              avoid all symlinks

       --help display this help and exit

       --version
              output version information and exit

       If no option is specified, -P is assumed.

       NOTE:  your  shell  may  have  its  own  version of pwd, which usually supersedes the version described here.  Please refer to your shell's documentation for
       details about the options it supports.

In generale, è possibile risolvere il percorso canonico completo di qualsiasi file / directory utilizzando readlink -f. readlink -f .funziona in modo simile a pwd -P.


2
Anche se ho imparato a readlink -f
mie spese

3

Ci sei davvero /home/cpm135/public_html/class- questa è l'unica risposta corretta alla domanda "qual è la mia directory di lavoro attuale".

Quando ti riferisci a /var/lib/class... non si tratta davvero di dove ti trovi, ma di più su quale percorso hai usato per arrivarci .

Quando esegui /bin/pwd, capisce la tua directory di lavoro corrente guardando il. e .. directory (quelle elencate nella parte superiore di ls -la), elaborando quale directory in .. corrisponde. e poi lavorare all'indietro fino a ... e. fare riferimento alla stessa directory. Una volta fatto tutto ciò, sa qual è la tua attuale directory di lavoro.

Quando esegui la pwdshell integrata, non segue questa procedura (anche se potrebbe farne una parte se necessario) - invece, ricorda il percorso che hai preso per arrivare qui. Quindi ogni volta che esegui un cdcomando, la tua shell lo ricorda come parte del percorso per arrivare dove sei ora e pwdstampa ciò che ha calcolato in base a tutti i cdcomandi che hai fatto, che può essere o meno il tuo reale directory di lavoro.

Le cose possono diventare davvero strane quando lo fai ln -s . fooe continui a cdentrare in foo - /bin/pwddirà che sei ancora nella stessa directory, ma l'integrato della shell pwddirà che sei dentro /foo/foo/foo/foo/foo/foo- anche se nessuna di queste directory esiste davvero. (Detto questo - probabilmente puoi cd farcela.)

Un'altra fonte di confusione è se le directory vengono rinominate. /bin/pwdraccoglierà immediatamente la modifica, ma il built-in pwdnon lo farà fino a quando non fai qualcosa che gli dice che il vecchio nome della directory non ha importanza.


1
Non stai rispondendo alla domanda, la stai respingendo.
Dmitry Grigoryev il

4
Anche se questo non risponde direttamente alla domanda , penso che sia un post utile per comprendere la differenza tra la shell pwdincorporata /bin/pwde spiegare come la versione autonoma fornisce informazioni più utili (che possono rispondere alla domanda originale).
Anthony G - giustizia per Monica,

1
Queste differenze si riducono tutte alle opzioni -Pe -Lmenzionate da altre risposte. In breve, alcune implementazioni sono impostate in modo predefinito su una, altre sull'altra. Sul sistema Centos che devo consegnare, l'integrato di bash è predefinito su logico ed /bin/pwdè predefinito su fisico, ma entrambi accettano entrambe le opzioni della riga di comando e concordano sul risultato quando vengono dati.
IMSoP

1
La domanda si basa su una premessa errata - 'c'è un modo per sapere che sono "davvero" in / var / lib / class?' Detto questo ... spiegando cosa significa veramente, lo aiuta a capire cosa sta davvero cercando. Le opzioni pwd -P e -L erano già state menzionate ...
dougmc,

1
Hai la tua discussione al contrario. ls ..mostrerà il contenuto di /var/libno /home/cpm135/public_html. cd ..è speciale: la shell esegue un monitoraggio speciale di "come ci sei arrivato" e in realtà non effettua una chdir("..")chiamata di sistema. Per quanto riguarda il kernel, l'attuale directory di lavoro della shell ( /proc/self/cwd) è solo una coppia mountpoint: inode. È come un descrittore di file aperto nella directory, motivo per cui rinominare la directory non rompe la shell. ( cd .per aggiornare la $PWDvariabile della shell ). Stai sottolineando un punto utile, quindi voterei questo quando risolto
Peter Cordes il

1

Fondamentalmente stai chiedendo se è necessario mostrare il percorso effettivo della directory di lavoro corrente. Bene, c'è con Python e la os.getcwd()funzione

Quello che vedi sotto è un piccolo test all'interno della directory "VirtualBox VMs" situata nella mia directory home. In realtà, è un collegamento simbolico a una directory diversa situata su un altro disco rigido, montato su /mnt/HDD.

bash-4.3$ file "$(pwd)"
/home/xieerqi/VirtualBox VMs: symbolic link to /mnt/HDD/VirtualBox VMs/
bash-4.3$ python -c 'import os; print os.getcwd()'
/mnt/HDD/VirtualBox VMs

Come puoi vedere, Python os.getcwd()risolve il percorso reale della directory, non il percorso del collegamento simbolico.

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.