3

我有以下目录结构:

misha@misha-lmd:~/tmp$ ls -l
total 4.0K
-rw-r--r-- 1 misha lmd 21 Feb 18 21:00 hello.py
lrwxrwxrwx 1 misha lmd 20 Feb 18 21:01 symlink -> /home/misha/nobackup/

接下来,我尝试以下操作:

misha@misha-lmd:~/tmp$ cd symlink
misha@misha-lmd:~/tmp/symlink$ cat ../hello.py 
cat: ../hello.py: No such file or directory

为什么这不起作用?

如果我这样做:

misha@misha-lmd:~/tmp/symlink$ cd ..
misha@misha-lmd:~/tmp$ cat hello.py
print "Hello World!"

那么一切都很好。cd 处理 .. 正确,但 cat 没有。这是什么魔法,我如何让事情按照我想要的方式运作?

编辑

好的,多亏了这里的一些答案,我对发生的事情有了更多的了解。首先,cd它实际上不是可执行文件,它是 shell 的内置命令(在本例中为 bash):

misha@misha-lmd:~/tmp$ type cd
cd is a shell builtin

如果你man bash,你可以找到所有关于 bash 用于其内务管理的环境变量,包括在目录中移动。还有其他内置函数,例如pwd,具有实际上是可执行文件的对应项:

misha@misha-lmd:~/tmp/symlink$ type pwd
pwd is a shell builtin
misha@misha-lmd:~/tmp/symlink$ /bin/pwd
/home/misha/nobackup
misha@misha-lmd:~/tmp/symlink$ /bin/pwd -L
/home/misha/tmp/symlink

/bin/pwd可执行文件默认打印物理路径,但也可以打印给定“-L”开关的逻辑路径。同样,当我尝试这样做时:

misha@misha-lmd:~/tmp/symlink$ cat ../hello.py 
cat: ../hello.py: No such file or directory

事情失败了,因为..被解释为物理父目录,而不是逻辑目录。这使我可以将我的问题细化为:

当我为可执行文件指定命令行参数时,我如何才能..表示逻辑父级,而不是物理父级?

4

3 回答 3

4

因为..符号链接目录中的目录是您的主目录。

../something表示“转到..目录”,而不是“剥离最后一个路径组件”。

pwd -P更改为符号链接后,您可以尝试查看自己的位置。

于 2013-02-18T12:09:07.923 回答
1

它不起作用,因为没有/home/misha/hello.py. 符号链接不会创建新目录,而是指向链接的目录。所以当你 cd 到一个符号链接时,你实际上是 cd 到那个目录,

您是否期望 shell 会记住您来自符号链接的位置?好吧,不是那样工作的:)

于 2013-02-18T12:10:17.807 回答
0

尝试

cat $(cd ..; pwd)/hello.pycat

不知道对你有没有帮助。

编辑:
如果你真的需要它,这是一种方法(但它有点难看):

$ lcat ( ) ( cd "${1%/*}"; cat "${1##*/}"; )
# use it like 'cat'
$ lcat ../hello.py

对函数体使用( ... )而不是{ ... }使其cd在子 shell 而不是当前 shell 中执行。
当我尝试它时,它也适用于“文件名完成”。
但这只是解决问题cat,我认为用于其他命令也可能更复杂。

$ lcmd ( ) ( local cmd="$1"; shift; cd "${1%/*}"; $cmd "${1##*/}"; )

然后做例如lcmd cat ../hello.py

于 2013-02-18T13:56:25.037 回答