我正在 cshell 中尝试以下别名:
alias sll 'ls -l \!* | grep -oE '[^ ]+$' | paste -s | xargs ls -l'
对于此 CSH 表示,非法变量名称。
如果我使用\$
,别名将被设置而不会出现任何错误。但是当我使用这个别名时,我得到,grep: Invalid regular expression
附:
- 此别名的目的是
ls -Ll <filenames>
通过文件的完整路径来实现符号链接引用。 - 别名的 RHS 部分作为独立命令可以正常工作。
- 我尝试了而不是egrep(grep -E)
awk '{print $NF}'
。即使如此,CSH 也会给出错误:NF 未定义变量。
答案1
检查你的单引号。单引号不会神奇地嵌套。
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 --