Como saber se estou realmente em um local de ligação simbólica a partir da linha de comando?

31

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 estou "realmente" em /var/lib/class ? Obrigado

    
por Oliver Williams 18.12.2016 / 13:16

4 respostas

53

Dependendo de como o comando pwd está configurado, o padrão pode ser mostrar o diretório de trabalho lógico (saída por pwd -L ) que mostrará o local do symlink ou o físico diretório de trabalho (saída por pwd -P ) que ignora o symlink e mostra o diretório "real".

Para informações completas, você pode fazer

file "$(pwd -L)"

Dentro de um symlink, isso retornará

/path/of/symlink: symbolic link to /path/of/real/directory
    
por 18.12.2016 / 13:23
17

Note 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:

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.

Em geral, você pode resolver o caminho canônico completo de qualquer arquivo / diretório usando readlink -f . readlink -f . funciona de forma semelhante a pwd -P .

    
por 18.12.2016 / 16:07
3

Você realmente está em /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 ... isso não é realmente sobre onde você está, mas mais sobre qual caminho você usou para chegar lá .

Quando você executa /bin/pwd , ele descobre seu diretório de trabalho atual observando o. e .. diretórios (aqueles listados no topo de ls -la ), trabalhando em qual diretório em .. combina com. e depois trabalhando para trás até .. e. consulte o mesmo diretório. Uma vez feito isso, ele sabe qual é o seu diretório de trabalho atual.

Quando você executa o shell pwd integrado, ele não segue este procedimento (embora ele possa fazer algumas delas, se necessário) - em vez disso, ele lembra o caminho que você levou para chegar até aqui. Portanto, cada vez que você fizer um comando cd , seu shell lembrará disso como parte do caminho para chegar onde você está agora, e pwd imprimirá o que calculou com base em todos os comandos cd que você fez - - que pode ou não ser seu diretório de trabalho atual.

As coisas podem ficar muito estranhas quando você faz um ln -s . foo e mantém cd ing em foo - /bin/pwd dirá que você ainda está no mesmo diretório, mas o shell embutido pwd dirá ' re em /foo/foo/foo/foo/foo/foo - mesmo que tal diretório não exista realmente. (Dito isso - você provavelmente pode cd para ele.)

Outra fonte de confusão é se os diretórios forem renomeados. /bin/pwd irá então pegar a mudança imediatamente, mas o pwd embutido não irá até você fazer algo que diga que o antigo nome do diretório não importa.

    
por 19.12.2016 / 08:57
1

Essencialmente, você está perguntando se há para mostrar o caminho real do diretório de trabalho atual. Bem, existe com python e os.getcwd() function

O que você vê abaixo é um pequeno teste de dentro do diretório "VirtualBox VMs" localizado no meu diretório home. Na realidade, é um link simbólico para um diretório diferente localizados em diferentes disco rígido, montado em /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

Como você pode ver, de python os.getcwd() resolve o caminho real do diretório, não o caminho do link simbólico.

    
por 19.12.2016 / 14:15