É ~ / Mary um caminho relativo? [duplicado]

35
    

Esta pergunta já tem uma resposta aqui:

    

Suponhamos que Mary seja um diretório. O caminho a seguir é ~/Mary relative?

    
por Alex 12.10.2017 / 13:46

6 respostas

73

Não, não é relativo.

É um caminho completo, com ~ sendo um alias.

Caminhos relativos descrevem um caminho em relação ao local atual do seu diretório. No entanto, ~/Mary é exatamente o mesmo, não importa em qual diretório você esteja atualmente.

Supondo que você estava logado como Bob e também no diretório /home/Bob , então ../Mary seria um exemplo de um caminho relativo para /home/Mary . Se você estivesse atualmente em /etc/something , então ~/Mary ainda seria /home/Bob/Mary , mas ../Mary seria agora /etc/Mary .

Observe que o Bash manipula ~ de formas específicas e nem sempre traduz a $HOME .

Para mais informações, consulte

por 12.10.2017 / 13:48
49

Se esse ~/Mary for um caminho dado a qualquer chamada de sistema (como open() , stat() ...), então é um caminho relativo, é a entrada Mary relacionada ao diretório ~ em o diretório atual. Portanto, se o diretório atual for /tmp , por exemplo, esse será o arquivo /tmp/~/Mary .

No entanto, se ~/Mary for usado sem aspas em um shell (ou outra ferramenta) que ofereça suporte à expansão de til, então ~ será substituído pelo conteúdo da variável $HOME (se estiver definido) e Como $HOME normalmente contém um caminho absoluto como /home/me , ~/Mary será expandido para /home/me/Mary , portanto, um caminho absoluto também.

Se você alterar $HOME para ser um caminho relativo (mas você não deseja fazer isso), então ~/Mary será expandido para um caminho relativo pelo shell:

$ HOME=..; echo ~/Mary
../Mary

Se você alterá-lo para //foo (ou se o seu diretório inicial era / , que costumava ser comum para root ), a expansão de ~/Mary não seria nem um caminho de acesso absoluto nem um caminho relativo (pelo menos de acordo com as definições do POSIX).

Com as versões bash anteriores à versão 4.0, você pode até fazer coisas engraçadas como:

$ HOME='*' bash-3.2.48 -c 'cd /; echo ~/mount'
bin/mount run/mount

(que foi corrigido em 4.0)

Mais informações sobre Unix e Linux em

por 12.10.2017 / 15:15
7

Vamos ficar pedantes.

Como outros já afirmaram, é um alias; como tal, é estritamente nem um caminho absoluto nem um caminho relativo. Praticamente, é um caminho absoluto, pois não é relativo ao diretório de trabalho.

Agora, para os detalhes. Em um nível do SO, os aliases não são suportados, portanto, a regra de que todos os caminhos absolutos começam com uma barra é verdadeira e tudo o mais é um caminho relativo. No entanto, os aplicativos podem não apenas passar o nome para o kernel: o tratamento especial de : , ~ e - é comum e depende do aplicativo. - é usado para iniciar as opções, portanto, para garantir que você esteja usando um caminho relativo, é possível preceder ./ para forçar a manipulação relativa em quase todos os casos (até onde eu sei, a única exceção é um nome de host contendo uma barra em algumas implementações de rcp ou scp ). O reconhecimento de : é usado na detecção de urls e hosts remotos para alguns comandos e a execução de // também tem um significado especial em alguns casos, mas todos esses casos são problemas no nível do aplicativo que não estão no nível do SO.

Quase todos os shells (eu sei de uma exceção) e muitos aplicativos Unix suportam a expansão básica do til. As duas expansões de til com maior probabilidade de funcionar são ~/path (em que o til inicial é substituído pelo conteúdo da variável $HOME ) e ~name/path (em que name é procurado na base de dados do usuário para localize o diretório inicial do usuário name ). Onde fica funky é se a base de dados do usuário não contém caminhos absolutos (não faça isso) ou $HOME não contém um caminho absoluto (não faça isso também). Outras formas de expansão do til também podem existir; por exemplo, o Bash expande ~- para o diretório de trabalho anterior, novamente todos no nível do aplicativo (e o shell é um aplicativo).

    
por 12.10.2017 / 21:56
4

As duas respostas mais votadas (EightBitTony e Stéphane) estão corretas: ~ é um alias de shell que expande para o usuário atual diretório inicial .

Em todos os sistemas semelhantes ao Unix, os diretórios pessoais dos usuários são especificados como caminhos absolutos no banco de dados do usuário (por exemplo, /etc/passwd é tradicionalmente usado para contas de usuários locais).

No entanto, algumas das respostas e comentários parecem confusos quanto à definição dos termos absoluto e relativo - com alguns que limitam a interpretação pós-moderna de que todos os caminhos são relativos (para o diretório pai ou para / ).

Definições das especificações do POSIX

Para fornecer alguma clareza, imaginei que seria útil adicionar uma resposta que cite as definições conforme especificado por O Grupo Aberto em POSIX.1-2008 (o definições estão ligadas na resposta de Stéphane, mas nem todos seguem os links):

Um nome do caminho é especificado como

A string that is used to identify a file.

Um nome de caminho absoluto é especificado como:

A pathname beginning with a single or more than two <slash> characters

Um caminho relativo é especificado como

A pathname not beginning with a <slash> character.

Além disso, como um shell POSIX expande o ~ especificado em Expansão de til .

    
por 13.10.2017 / 16:49
2

Sim, ~ / Mary é um caminho relativo.

Esta questão parece ser uma questão de definição. Não tenho certeza se existe uma definição oficial de sistemas amplos para caminho absoluto e caminho relativo

Existem dois tipos de 'caminho': relativo e absoluto . Um caminho absoluto sempre aponta para o mesmo recurso. Caminhos relativos apontam para um recurso relativo a outra coisa.

Quando ~ é usado, normalmente é usado para ser expandido para o diretório inicial do usuário atual. O diretório home depende do usuário atual, então ~ / Mary é relativo ao diretório inicial do usuário atual.

Por exemplo, ~/Mary pode se expandir para /home/bob/Mary para o usuário bob e pode se expandir para /home/alice/Mary para o usuário alice.

Mais alguns exemplos
./Mary é relativo ao diretório atual
../Mary é relativo ao diretório pai
~ / Mary é relativo ao diretório home do usuário atual
Mary é relativa ao diretório atual / Mary é relativo ao diretório raiz. O diretório raiz é fixo, então este é um caminho absoluto

No entanto, as pessoas podem afirmar que até mesmo um diretório raiz é relativo ao host atual. Se você adicionar um host a um caminho, ele se tornará hostname: / Mary. Mas isso ainda não é realmente um caminho absoluto, pois 'hostname' é relativo ao sistema que define nomes de host.

    
por 13.10.2017 / 14:40
1

Deixe-me oferecer um experimento simples:

[vttoth@host ~]$ cd /tmp
[vttoth@host tmp]$ mkdir "~"
[vttoth@host tmp]$ mkdir "~/Mary"
[vttoth@host tmp]$ ls -al "~"
total 12
drwxrwxr-x.  3 vttoth vttoth   17 Oct 12 20:24 .
drwxrwxrwt. 14 root   root   8192 Oct 12 20:24 ..
drwxrwxr-x.  2 vttoth vttoth    6 Oct 12 20:24 Mary
[vttoth@host tmp]$ cd "~/Mary"
[vttoth@host Mary]$ pwd
/tmp/~/Mary

Claro como parece em relação a mim.

No entanto, se no bash shell (o mesmo se aplica a muitos outros shells) eu faço

[vttoth@host Mary]$ echo ~
/home/vttoth

torna-se evidente que ~ é expandido pelo shell em um caminho absoluto.

Em suma, a questão é ambígua: a resposta literal é que "~/anything" é um caminho relativo, mas pode-se adivinhar que a questão realmente é sobre como o shell expande o símbolo ~ a menos que seja protegido da expansão por o uso de citações.

Eu recomendo ler a seção intitulada expansão til na página man bash, ou a (s) seção (ões) correspondente (s) nas páginas man do shell preferido.

    
por 13.10.2017 / 02:33