cshell 别名:如何在 cshell 别名中使用嵌套单引号(')

cshell 别名:如何在 cshell 别名中使用嵌套单引号(')

我正在 cshell 中尝试以下别名:

alias sll 'ls -l \!* | grep -oE '[^ ]+$' | paste -s | xargs ls -l'

对于此 CSH 表示,非法变量名称。

如果我使用\$,别名将被设置而不会出现任何错误。但是当我使用这个别名时,我得到,grep: Invalid regular expression

附:

  1. 此别名的目的是ls -Ll <filenames>通过文件的完整路径来实现符号链接引用。
  2. 别名的 RHS 部分作为独立命令可以正常工作。
  3. 我尝试了而不是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 --

相关内容