Por que o toque está falhando?

3

Eu devo estar perdendo algo óbvio.

Isso funciona:

[root@host2 /]# cd /home/mysite/public_html/../logs 
[root@host2 /home/mysite/logs]# touch x

Por que isso não acontece?

[root@host2 /]# touch /home/mysite/public_html/../logs/x
touch: cannot touch '/home/mysite/public_html/../logs/x': No such file or directory
    
por Eric 26.05.2012 / 03:23

2 respostas

11

Há uma boa chance de que um dos diretórios em /home/mysite/public_html/../logs/ seja, na verdade, um link simbólico. O comando cd embutido na maioria dos shells modernos faz um pouco de mágica nesse caso, então cd .. leva você ao diretório pai "lógico" - o que leva em conta como você chegou lá.

Quando você tenta touch /home/mysite/public_html/../logs/x , não consegue essa mágica.

Considere:

$ ls -l /home/lars
public_html -> /var/www/lars
logs/

Se eu cd /home/lars/public_html estou realmente dentro de /var/www/lars . Portanto, tecnicamente, ../logs não existe (porque o diretório logs desejado está realmente em /home/lars , não em /var/www , que é o pai "real" de /var/www/lars .

    
por 26.05.2012 / 03:31
1

public_html é um link simbólico para um lugar completamente diferente. Como um shell, bash rastreia links simbólicos em caminhos de maneira diferente de muitos outros programas. Tente isto: cd /home/mysite/public_html , em seguida, execute pwd (o comando bash) e /bin/pwd (o programa). Quando touch tentar usar o caminho, ele irá para /var/www/sites/mysite/ ou para onde quer que esse link apontar, então vá para um diretório a partir daí para obter logs/ ... e não conseguirá encontrar /var/www/sites/logs/ .

    
por 26.05.2012 / 03:37

Tags