我肯定忽略了一些显而易见的东西。
这有效:
[root@host2 /]# cd /home/mysite/public_html/../logs
[root@host2 /home/mysite/logs]# touch x
为啥不是这样呢?
[root@host2 /]# touch /home/mysite/public_html/../logs/x
touch: cannot touch `/home/mysite/public_html/../logs/x': No such file or directory
答案1
其中一个目录很有可能/home/mysite/public_html/../logs/
实际上是一个符号链接。cd
在这种情况下,大多数现代 shell 内置的命令都会发挥一点魔力,将cd ..
您带到“逻辑”父目录——这会考虑到您是如何到达那里的。
当您尝试时touch /home/mysite/public_html/../logs/x
,您无法获得这种魔力。
考虑:
$ ls -l /home/lars
public_html -> /var/www/lars
logs/
如果我cd /home/lars/public_html
实际上在 内/var/www/lars
。因此从技术上讲,../logs
不存在(因为logs
我想要的目录实际上在 中/home/lars
,而不是 中/var/www
,后者是 的“真正”父级)/var/www/lars
。
答案2
public_html
是指向完全不同地方的符号链接。作为 shell,它bash
以不同于许多其他程序的方式跟踪路径中的符号链接。尝试以下操作:cd /home/mysite/public_html
然后运行pwd
(bash 命令)和/bin/pwd
(程序)。当touch
尝试使用该路径时,它将转到/var/www/sites/mysite/
该链接指向的任何地方,然后从那里向上移动一个目录以到达logs/
... 但却找不到/var/www/sites/logs/
。