'~ / Documents' é um caminho relativo ou absoluto?

37

Isso é apenas uma questão de vocabulário, mas que continua se revirando na minha cabeça.

Provém de um exame prático de um livro de preparação LPIC . A resposta correta de acordo com o livro é que ~/Documents é um diretório relativo porque é relativo ao diretório inicial.

No entanto, este livro contém uma proporção honrosa de erros de digitação e erros, por isso não posso dar como certo tudo o que está escrito lá. Aqui eu não concordo porque para mim ~ age como uma variável expandida pelo shell no conteúdo da variável $HOME ou no caminho do diretório home do usuário atual (cf. man bash ), então o caminho real é /home/myuser/Documents , que é de fato um diretório absoluto.

Mesmo Wikipedia , por uma vez, não parece ser útil para mim neste tópico (mesmo se parece confirmar que o livro está errado em um presente):

An absolute or full path points to the same location in a file system regardless of the current working directory. To do that, it must contain the root directory.

By contrast, a relative path starts from some given working directory, avoiding the need to provide the full absolute path.

Aqui, novamente, eu não concordo: de acordo com essa definição, o caminho /opt/kde3/bin/../lib que não depende do diretório de trabalho atual deve ser absoluto, mas meu entendimento atual é compatível com o autor do livro, tornando este caminho um um relativo.

Uma rápida pesquisa na web está apenas aumentando minha frustração, de acordo com Webster Dictionary :

absolute path - A path relative to the root directory. Its first character must be the pathname separator.

Portanto, $HOME/Documents ou mesmo apenas $HOME não seriam considerados diretórios absolutos? Ou essa definição implica expansão variável? E quanto ao caractere ~ do shell? Existe alguma definição confiável de diretório relativo versus absoluto que eu possa encontrar em algum lugar e estou errado todo o caminho?

    
por WhiteWinterWolf 08.08.2015 / 17:02

7 respostas

39

Se o autor estava tentando pegá-lo falando sobre essa cadeia literal (sem expansão de shell) como um caminho, então é um caminho relativo ( mkdir -p './~/Documents' ). Caso contrário:

É um caminho absoluto , porque a resolução não depende do funcionamento atual do processo diretório. Caminho relativo sempre significa relativo ao diretório de trabalho do processo. Ou no caso de alvos de links simbólicos, relativos à localização do link simbólico. ( gcc -> gcc-5.2 vs. gcc -> /usr/bin/gcc-5.2 ). Isso é importante para montagens NFS e outros casos em que você pode obter o mesmo symlink através de diferentes caminhos absolutos. por exemplo,

/net/tesla/home/peter/foo -> bar  # always works from other machines

/net/tesla/home/peter/foo -> /home/peter/bar  # references my home dir on the local machine, not tesla.

Algumas vezes o Debian instalará links simbólicos para ../../doc/whatever/whatever , ao invés de um alvo de symlink absoluto, então funciona quando o NFS é montado em outro lugar, ou quando se olha para um chroot sem chroot(8) ing nele.

Todo processo Unix tem seu próprio cwd. O comando pwd existe apenas para imprimi-lo.

veja: link para saber mais sobre como alterar diretórios com as chamadas do sistema POSIX.

Como todos já disseram, ~ é expandido pelo shell antes que o caminho seja usado para qualquer coisa. Usar ~/bin/myprog em um script de shell fará com que funcione de maneira diferente para diferentes usuários. A diferença entre ~/bin/foo e /home/peter/bin/foo é que um deles codificou permanentemente o local, enquanto o outro o parametrizou. É um erro (IMO) chamar a versão ~ de um caminho relativo.

Falar sobre as coisas ser "relativo a uma variável de ambiente" é confuso. É uma prática ruim usar diferentes significados de termos em inglês que tenham significados técnicos específicos no contexto em que você os usa.

Em um sistema corrompido, com HOME=a/relative/path , ~/foo se expandiria para um caminho relativo. Isso não seria uma configuração utilizável.

    
por 09.08.2015 / 07:56
48

Esta é essencialmente uma questão sobre a definição de termos. Então, para seus propósitos, a resposta é o que o LPIC quer. Mas podemos chegar a algumas conclusões baseadas em fatos técnicos:

Se você passou '~/Documents' para uma chamada de sistema, ela procuraria por um diretório chamado exatamente ~ , o que não é o que queremos dizer. Então, pela noção de nomes de caminho usados pelo o kernel , este não é realmente um caminho.

~ é a sintaxe implementada pelo o shell (e outros programas que o imitam por conveniência) que expande em um caminho real. Para ilustrar, ~/Documents é aproximadamente a mesma coisa que $HOME/Documents . Como $HOME deve ser um caminho absoluto, o valor de $HOME/Documents também é um caminho absoluto. Mas o texto $HOME/Documents ou ~/Documents precisa ser expandido pelo shell para se tornar o caminho que queremos dizer.

Assim, se eu quisesse ser preciso e consistente, eu diria que ~/Documents é um fragmento de shell script que se expande para um caminho absoluto.

    
por 08.08.2015 / 19:26
16

Se o $HOME for /home/white/ , ~/Documents (o mesmo que $HOME/Documents ) será expandido pelo shell (consulte aqui para uma explicação) para /home/white/Documents , que é um caminho absoluto .

Um caminho relativo é aquele que não inicia com / (após a expansão do shell), como ../Documents ou foo/bar

Algumas camadas antigas não expandem ~ (o caminho bash , tcsh , zsh , etc. ...); eles veriam ~/Documents como um caminho relativo começando com ~ ; mas você geralmente não tem nome de diretório como ~ (mas você pode criar um com mkdir '~' , o que eu não recomendo).

    
por 08.08.2015 / 17:15
3

Um caminho absoluto começa em / (o que ele se refere é fixo), um caminho relativo começa no diretório atual (e então o que ele se refere a mudanças como o diretório atual muda). A maioria dos shells usa ~ no início como uma abreviação do caminho absoluto para o diretório inicial do usuário atual, isto é, ~/Documents é o diretório Documents na home do usuário atual, independentemente do diretório atual pode ser. Então é um caminho absoluto.

    
por 08.08.2015 / 23:50
1

O caminho pode se expandir para um local diferente dependendo de quem é o usuário. Dito isto, este ainda é um caminho absoluto, não um caminho relativo, na minha opinião. No entanto, não acho que as definições de caminho absoluto e relativo sejam definidas com precisão. Isso não é matemática. Esta questão realmente não testa a compreensão, na minha opinião, e é inútil.

    
por 08.08.2015 / 17:40
1

O uso do ~ / no início torna o caminho absoluto, já que (por qualquer definição) a possibilidade de localizar documentos não depende de onde você está atualmente. No entanto, a expansão é feita pelo shell, não pelo kernel, portanto, se você estiver usando um shell que não reconheça essa sintaxe (como / bin / sh, o shell original do Bourne, não o alias do bash), sorte.

Curiosamente, se você usar ~ root / em vez de ~ /, a otimização da leitura de $ HOME normalmente não se aplica e sempre será resolvida como absoluta se / etc / passwd estiver correto.

    
por 10.08.2015 / 15:16
-1

O livro parece estar assumindo que um caminho absoluto é qualquer caminho que comece com / , e um caminho relativo é qualquer outra coisa.

Você pode ver .. e $HOME como tipos semelhantes de tokens. Ambos precisam ser substituídos, para um componente de caminho, antes que o caminho seja resolvido para um caminho absoluto.

    
por 09.08.2015 / 09:36