在zsh,我做了一个符号链接
$ ln -s ~/Documents symboliclink
Run Code Online (Sandbox Code Playgroud)
然后我想知道这个符号链接里面有什么。
$ ls -l symboliclink
> lrwxrwxrwx 1 user user 21 Oct 10 15:56 symboliclink -> /home/user/Documents
Run Code Online (Sandbox Code Playgroud)
这仅显示符号链接,而不显示其中的内容。如果我ls只使用,它会列出内容,但如果我使用-l标志,它不会。这bash对 forls和ls -l. 我怎样才能得到这种行为zsh?
这是ls选项-H:
ls -lH symboliclink
Run Code Online (Sandbox Code Playgroud)
来自man 1p ls:
-H
如果在命令行上指定了引用目录类型文件的符号链接,ls 应评估文件信息和文件类型为链接所引用文件的信息和文件类型,而不是链接本身;但是, ls 应写入链接本身的名称,而不是链接引用的文件。
还要注意选项 -L
-L
评估所有符号链接的文件信息和文件类型(无论是在命令行中命名的还是在文件层次结构中遇到的)是链接引用的文件的信息和文件类型,而不是链接本身;但是, ls 应写入链接本身的名称,而不是链接引用的文件。当 -L 与 -l 一起使用时,以长格式写入符号链接的内容(请参阅 STDOUT 部分)。
zsh和bashls -l之间的输出看似不同的一个可能原因是使用-completion 并在zsh 中启用(这是默认设置)。TabAUTO_REMOVE_SLASH
AUTO_REMOVE_SLASH <D>
如果补全产生的最后一个字符是斜杠,而键入的下一个字符是单词定界符、斜杠或结束命令的字符(如分号或与号),则删除斜杠。
键入 时ls -l symbTab,zsh和bash都将完成此操作ls -l symboliclink/(注意/末尾的 )。不同之处在于zsh(启用AUTO_REMOVE_SLASH)将删除斜杠,如果您只是按Enter(即结束命令)那里。
因此,您将有效地ls -l symboliclink/在bash 中运行,它告诉ls -l您查看链接的后面。但是在zsh 中,您将运行ls -l symboliclink,它告诉ls -l您要查看有关链接的信息而不是目标目录的信息。
lswithout option-l将始终显示目标目录的内容,无论/末尾是否有。
为了让zsh不删除末尾的斜杠,只需在TAB-completion后显式键入它就足够了。通常这不会明显改变完成的文本,但如果你输入一个空格或确认命令,/将保留。“通常”,因为可以为自动添加的后缀字符设置突出显示,例如洋红色和粗体:
zle_highlight[(r)suffix:*]="suffix:fg=magenta,bold"
Run Code Online (Sandbox Code Playgroud)
(注意:这在使用外部ZSH 语法高亮插件时可能不起作用)
另一个解决方案是(显然)禁用AUTO_REMOVE_SLASH. 这可以用
setopt noautoremoveslash
Run Code Online (Sandbox Code Playgroud)