Suponha que eu tenha uma pasta:
cd /home/cpm135/public_html
e faça um link simbólico
ln -s /var/lib/class .
Mais tarde, estou nesse diretório:
cd /home/cpm135/public_html/class
O pwd
vai me dizer que estou em/home/cpm135/public_html/class
Existe alguma maneira de saber que eu estou "realmente" dentro /var/lib/class
? obrigado
shell
symlink
cd-command
working-directory
Oliver Williams
fonte
fonte
fish
shell resolve automaticamente o link simbólico quando vocêcd
entra nele.Respostas:
Dependendo de como seu
pwd
comando estiver configurado, pode ser o padrão para mostrar o diretório de trabalho lógico (produzido porpwd -L
) que mostraria o local do link simbólico ou o diretório de trabalho físico (produzido porpwd -P
) que ignora o link simbólico e mostra o diretório "real".Para obter informações completas, você pode fazer
Dentro de um link simbólico, isso retornará
fonte
-P
bandeira era o que eu precisava. Obrigadotest "$(pwd -L)" = "$(pwd -P)" && echo No symlinks
(ou substitua&& echo No symlinks
por|| echo Symlinks
).file "$(pwd)"
funciona apenas se o link simbólico for o último componente do diretório. Ele não detecta o link simbólico do OP quando está em CD/home/cpm135/public_html/class/foo/bar
. Eu não estou ciente de qualquer coisa que imprime informações para todos os links simbólicos em um caminho, mas você também pode usarrealpath .
, que acho que é equivalente apwd -P
Observe que,
pwd
na verdade, é um shell embutido. Dependendo do seu shell e sua configuração, os resultados podem mudar. Para uma solução mais portátil, você deve usar/bin/pwd
. Snippet da página de manual:Em geral, você pode resolver o caminho canônico completo de qualquer arquivo / diretório usando
readlink -f
.readlink -f .
funciona de forma semelhante apwd -P
.fonte
readlink -f
não está disponível em todos os Unices (por exemplo, não está disponível no OS-X)Você realmente está dentro
/home/cpm135/public_html/class
- essa é a única resposta correta para a pergunta "qual é o meu diretório de trabalho atual".Quando você se refere a
/var/lib/class
... não é exatamente onde você está, mas mais sobre o caminho que você usou para chegar lá .Quando você executa
/bin/pwd
, ele descobre seu diretório de trabalho atual observando o. e .. diretórios (os listados na parte superior dels -la
), calculando qual diretório em .. combina com. e depois trabalhando para trás até ... e. consulte o mesmo diretório. Uma vez feito tudo isso, ele sabe qual é o seu diretório de trabalho atual.Quando você executa o
pwd
shell interno, ele não segue este procedimento (embora possa fazer parte dele, se necessário) - em vez disso, lembra o caminho que você seguiu para chegar até aqui. Portanto, toda vez que você executa umcd
comando, seu shell se lembra disso como parte do caminho para chegar onde está agora epwd
imprime o que foi calculado com base em todos oscd
comandos que você executou - o que pode ou não ser o seu real diretório de trabalho.As coisas podem ficar realmente estranhas quando você faz um
ln -s . foo
e continuacd
no foo -/bin/pwd
dirá que você ainda está no mesmo diretório, mas o shell internopwd
dirá que você está/foo/foo/foo/foo/foo/foo
- mesmo que esse diretório não exista. (Dito isto - você provavelmente podecd
.)Outra fonte de confusão é se os diretórios forem renomeados.
/bin/pwd
então, a mudança será feita imediatamente, mas o built-inpwd
não será feito até que você faça algo que indique que o nome do diretório antigo não importa.fonte
pwd
interno/bin/pwd
e explicar como a versão autônoma fornece informações mais úteis (que podem responder à pergunta original).-P
e-L
mencionadas por outras respostas. Em resumo, algumas implementações são padronizadas para uma, outras para a outra. No sistema Centos que tenho em mãos, o built-in do bash está padronizado para lógico e/bin/pwd
físico, mas ambos aceitam as duas opções de linha de comando e concordam com o resultado quando são fornecidos.ls ..
irá mostrar o conteúdo de/var/lib
, não/home/cpm135/public_html
.cd ..
é especial: o shell faz um rastreamento especial de "como você chegou lá" e, na verdade, não faz umachdir("..")
chamada de sistema. No que diz respeito ao kernel, o diretório de trabalho atual do seu shell (/proc/self/cwd
) é apenas um par mountpoint: inode. É como um descritor de arquivo aberto no diretório, e é por isso que renomear o diretório não quebra seu shell. (cd .
para atualizar a$PWD
variável do shell ). Você está fazendo um ponto útil, então eu upvote isso quando fixoEssencialmente, você está perguntando se há para mostrar o caminho real do diretório de trabalho atual. Bem, existe com python e
os.getcwd()
funçãoO que você vê abaixo é um pequeno teste no diretório "VirtualBox VMs", localizado no meu diretório pessoal. Na realidade, é um link simbólico para um diretório diferente localizado em um disco rígido diferente, montado em
/mnt/HDD
.Como você pode ver, o python's
os.getcwd()
resolve o caminho real do diretório, não o caminho do link simbólico.fonte