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

Blu*_*Vio 3 grep alias csh quoting regular-expression

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

alias sll 'ls -l \!* | grep -oE '[^ ]+$' | paste -s | xargs ls -l'
Run Code Online (Sandbox Code Playgroud)

对于这个 CSH 说,非法变量名。

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

PS:

  1. 此别名的目的是实现ls -Ll <filenames>符号链接引用的文件的完整路径。
  2. alias 的 RHS 部分作为独立命令工作正常。
  3. 而不是 egrep (grep -E),我尝试了awk '{print $NF}'. 即便如此,CSH 也会给出错误:NF 未定义变量。

Sté*_*las 5

检查您的单引号。单引号不会神奇地嵌套。

alias sll 'ls -l \!* | grep -oE '\''[^ ]+$'\'' | xargs ls -ld --'
Run Code Online (Sandbox Code Playgroud)

由于以下几个原因,这仍然存在缺陷:

  • 由于[^ ],这不适用于包含空格的文件或链接目标名称。
  • 当您将该列表视为行列表时,它不适用于包含换行符的文件/链接目标名称。
  • 因为xargs, 这不适用于包含撇号、反斜杠、双引号、其他类型空格的文件/目标名称。
  • 对于以相对路径作为目标的符号链接,这只适用于当前目录中的符号链接,因为您传递给第二个ls是当前目录的相对路径,而符号链接是相对于符号链接文件的路径解析的(如果您有一个a/b/c -> d链接,指向 ,而a/b/d不是d在当前目录中)。
  • 你会得到,因为第一个虚假的错误信息total <n>的输出线ls
  • 对于符号链接的符号链接,这不会给你相同的ls -lL(可能是你想要的)。

使用zsh,你可以做到:

ls -ld -- *(:A)
Run Code Online (Sandbox Code Playgroud)

:A修改扩展符号链接到他们的经典绝对路径。

GNU 系统上的准等价物:

readlink -fz -- * | xargs -r0 ls -ld --
Run Code Online (Sandbox Code Playgroud)