在 中zsh
,我创建了一个符号链接
$ ln -s ~/Documents symboliclink
然后我想知道这个符号链接里面有什么。
$ ls -l symboliclink
> lrwxrwxrwx 1 user user 21 Oct 10 15:56 symboliclink -> /home/user/Documents
这仅显示符号链接,而不显示其中的内容。如果我ls
只使用,它会列出内容,但如果我使用标志-l
,它不会列出内容。这适用于bash
forls
和ls -l
。我怎样才能zsh
也获得这种行为?
答案1
这是ls
选项-H
:
ls -lH symboliclink
从man 1p ls
:
-H
如果在命令行上指定了引用目录类型文件的符号链接,则 ls 将评估该链接引用的文件的文件信息和文件类型,而不是链接本身;但是,ls 应写入链接本身的名称,而不是链接引用的文件。
另请注意选项 -L
-L
评估所有符号链接(无论是在命令行上命名还是在文件层次结构中遇到)的文件信息和文件类型,使其成为链接引用的文件的信息和文件类型,而不是链接本身;但是,ls 应写入链接本身的名称,而不是链接引用的文件。当 -L 与 -l 一起使用时,以长格式写入符号链接的内容(请参阅 STDOUT 部分)。
答案2
ls -l
两者之间的输出看似差异的一个可能原因桀骜和巴什是使用Tab
-completion 并AUTO_REMOVE_SLASH
启用 in桀骜(这是默认值)。
自动删除斜线<D>
当补全结果的最后一个字符是斜杠并且下一个键入的字符是单词分隔符、斜杠或结束命令的字符(例如分号或与号)时,请删除斜杠。
当输入 时ls -l symb
Tab,zsh
和bash
都会完成此操作ls -l symboliclink/
(请注意/
最后的 )。不同之处在于,如果您只是按(即结束命令)那里,zsh
(启用后AUTO_REMOVE_SLASH
)将删除斜杠。Enter
所以你会有效地ls -l symboliclink/
运行巴什,它告诉ls -l
您查看链接后面。但在桀骜您将运行ls -l symboliclink
,它告诉ls -l
您要查看有关链接而不是目标目录的信息。
ls
不带选项-l
将始终显示目标目录的内容,无论/
末尾是否有。
为了得到桀骜为了不删除末尾的斜杠,只需在TAB
-completion 之后显式键入它就足够了。通常这不会明显改变已完成的文本,但如果您键入空格或确认命令,则会/
保留。 “通常”是因为可以为自动添加的后缀字符设置突出显示,例如洋红色和粗体:
zle_highlight[(r)suffix:*]="suffix:fg=magenta,bold"
(笔记:使用外部时这可能不起作用ZSH 语法高亮插件)
另一个解决方案(显然)是禁用AUTO_REMOVE_SLASH
.这可以通过以下方式完成
setopt noautoremoveslash
答案3
只需在末尾添加“/”即可。
ls -l symboliclink/
答案4
程序的行为ls
不依赖于调用它的 shell。如果您ls
在 bash 和 zsh 中观察到不同的行为,那是因为您在其中一个 shell 中调用了别名(或函数)ls
,但在另一个 shell 中没有调用。您在 zsh 中观察到的行为与ls
bash 中的行为相对应,因此您必须使用其他选项来调用它。
您可能已ls
为ls -H
或起了别名ls -L
,以使其取消引用符号链接。这是一个坏主意,因为除了绕过别名 ( ) 之外,您无法获取有关符号链接本身的信息\ls
。
当文件是目录的符号链接时,可以通过在末尾添加斜杠来对目录而不是文件进行操作:ls -l symboliclink/
相当于ls -l symboliclink/.
.看什么时候符号链接被视为它链接到的东西以及符号链接?