如何转义 oh-my-zsh 别名中的特殊字符?

How do I escape special characters in oh-my-zsh alias?

所以我正在尝试创建一个别名来列出当前目录中的文件,就像“ls -lAh”一样,但只包含我想要的特定列。所以我想出了这个命令:

ls -lAh | awk 'BEGIN{FS=" "; OFS=" "} {print ,,,,}'

这只会打印我需要的列,即日期和时间、文件大小和文件名的顺序。

然而,如果我想为这个命令创建一个别名,我显然需要转义很多字符,这样它们才能被正确解释,但我没有这样做。有时,当我在单引号或美元符号前加一个反斜杠时,它会以一种或另一种方式中断,我无法让它工作。

请帮助我理解我应该如何转义特殊字符以便正确解释。

万一它改变了什么,我在 MacOS 上。如果需要,请务必要求澄清。

编辑:- 这是我在尝试实际创建别名时尝试的方法:

alias lah='ls -lAh | awk \'BEGIN\{FS=" "; OFS=" "\} \{print $6,$7,$8,$5,$9}\''

我尝试在每个特殊字符前加反斜杠,第一次尝试时我只是将它们放在单引号前,但没有用,它告诉我类似 zsh: parse error at { 的内容。然后我在每个花括号前放了一个反斜杠,但没有用,显然美元符号也是特殊字符,所以我在它们前面放了反斜杠,但是每当我在输入命令后按 return 时,它就会生成一个新行显示 quote>,我必须在其中加上单引号来结束命令,当我这样做时它会打印:zsh: command not found: \{print.

您应该在 .bashrc 中设置一个函数,而不是别名。 例如:

ldir() {
ls -lAh | awk 'BEGIN{FS=" "; OFS=" "} {print ,,,,}'}

然后重新加载 bashrc:

source .bashrc

您现在应该能够 运行 ldir 命令。

问题是如何正确地用单引号引用一个已经包含单引号的字符串。

ls -lAh | awk 'BEGIN{FS=" "; OFS=" "} {print ,,,,}'

要轻松获得正确引用的字符串,您可以使用 ZSH 的键序列 ESC '(单引号)。

  • 键入您要引用的字符串,例如
    ls -lAh | awk 'BEGIN{FS=" "; OFS=" "} {print ,,,,}'
  • ESC,然后按 '(单引号)。在你的例子中,这应该给你类似
    'ls -lAh | awk '\''BEGIN{FS=" "; OFS=" "} {print ,,,,}'\'
  • 继续您的命令的其余部分,或将引用的字符串复制并粘贴到您的编辑器中。

一般来说,要在单引号内引用单引号,您需要插入一个右引号 '、一个转义引号 \',如果需要,还需要插入一个左引号 ',如下所示:

alias lah='ls -lAh | awk '\''BEGIN{FS=" "; OFS=" "} {print ,,,,}'\'

另一种选择是对 'outside' 引号使用双引号,因为双引号字符串支持转义。诀窍是知道需要转义什么:

alias lah="ls -lAh | awk 'BEGIN{FS=\" \"; OFS=\" \"} {print $6,$7,$8,$5,$9}'"

请注意,如果您要求 zsh 显示此别名,它会将其规范化为使用单引号,如@Bodo 的回答:

% alias lah
lah='ls -lAh | awk '\''BEGIN{FS=" "; OFS=" "} {print ,,,,}'\'