Zsh

顯示符號連結的內容

  • October 11, 2016

zsh中,我建立了一個符號連結

$ ln -s ~/Documents symboliclink

然後我想知道這個符號連結裡面有什麼。

$ ls -l symboliclink
> lrwxrwxrwx 1 user user 21 Oct 10 15:56 symboliclink -> /home/user/Documents

這僅顯示符號連結,而不顯示其中的內容。如果我ls只使用,它會列出內容,但如果我使用-l標誌,它不會。這適用於bashforlsls -l. 我怎樣才能得到這種行為zsh呢?

zshbashls -l之間的輸出看似不同的一個可能原因是使用-completion 並在zsh中啟用(這是預設設置)。Tab``AUTO_REMOVE_SLASH

AUTO_REMOVE_SLASH <D>

如果完成後產生的最後一個字元是斜杠,而鍵入的下一個字元是單詞分隔符、斜杠或結束命令的字元(例如分號或 & 號),請刪除斜杠。

鍵入 時ls -l symb``Tab,兩者zshbash都將完成此操作ls -l symboliclink/(注意/末尾的)。不同之處在於zsh(啟用AUTO_REMOVE_SLASH)將刪除斜線,如果你只是按下Enter(即結束命令)那裡。

因此,您將有效地ls -l symboliclink/bash中執行,它告訴ls -l您查看連結後面。但是在zsh中,您將執行ls -l symboliclink,它告訴ls -l您要查看有關連結而不是目標目錄的資訊。

ls沒有選項-l將始終顯示目標目錄的內容,無論/最後是否有一個。


為了讓zshTAB在末尾不刪除斜杠,只需在-completion之後顯式鍵入它就足夠了。通常這不會明顯改變已完成的文本,但如果您鍵入空格或確認命令,/則會保留。“通常”,因為可以為自動添加的後綴字元設置突出顯示,例如洋紅色和粗體:

zle_highlight[(r)suffix:*]="suffix:fg=magenta,bold"

注意:使用外部ZSH 語法高亮外掛時,這可能不起作用)

另一種解決方案是(顯然)禁用AUTO_REMOVE_SLASH. 這可以通過

setopt noautoremoveslash

這是ls選項-H

ls -lH  symboliclink

來自man 1p ls

-H

如果在命令行上指定了引用目錄類型文件的符號連結,則 ls 應將文件資訊和文件類型評估為連結所引用文件的資訊和文件類型,而不是連結本身;但是, ls 應寫入連結本身的名稱,而不是連結引用的文件。

另請注意選項 -L

-L

評估所有符號連結的文件資訊和文件類型(無論是在命令行上命名還是在文件層次結構中遇到)是連結引用的文件,而不是連結本身;但是, ls 應寫入連結本身的名稱,而不是連結引用的文件。當 -L 與 -l 一起使用時,以長格式寫入符號連結的內容(參見 STDOUT 部分)。

引用自:https://unix.stackexchange.com/questions/315461