Grep
cshell 別名:如何在 cshell 別名中使用嵌套的單引號(’)
我正在 cshell 中嘗試以下別名:
alias sll 'ls -l \!* | grep -oE '[^ ]+$' | paste -s | xargs ls -l'
對於這個 CSH 說,非法變數名。
如果我使用
\$
,別名將被設置而沒有任何錯誤。但是當我使用這個別名時,我得到,grep: Invalid regular expression
PS:
- 此別名的目的是實現
ls -Ll <filenames>
符號連結引用的文件的完整路徑。- 別名的 RHS 部分可以作為獨立命令正常工作。
- 而不是 egrep (grep -E),我嘗試了
awk '{print $NF}'
. 即使這樣,CSH 也會給出錯誤:NF undefined variable。
檢查你的單引號。單引號不會神奇地嵌套。
alias sll 'ls -l \!* | grep -oE '\''[^ ]+$'\'' | xargs ls -ld --'
由於以下幾個原因,這仍然存在缺陷:
- 由於
[^ ]
,這不適用於包含空格的文件或連結目標名稱。- 由於您將該列表視為行列表,因此不適用於包含換行符的文件/連結目標名稱。
- 因為
xargs
,這不適用於包含撇號、反斜杠、雙引號和其他類型空格的文件/目標名稱。- 對於以相對路徑為目標的符號連結,僅適用於目前目錄中的符號連結,因為傳遞給第二個
ls
的是目前目錄的相對路徑,而符號連結是相對於符號連結文件的路徑解析的(如果您有一個a/b/c -> d
連結,指向a/b/d
,不在d
目前目錄中)。- 您將收到一條虛假的錯誤消息,
total <n>
因為ls
.- 對於符號連結的符號連結,這不會給你相同的
ls -lL
(可能是你想要的)。使用
zsh
,您可以做到:ls -ld -- *(:A)
修飾符將
:A
符號連結擴展到其規範的絕對路徑。在 GNU 系統上的準等價物:
readlink -fz -- * | xargs -r0 ls -ld --