【问题标题】:How do I escape special characters in oh-my-zsh alias?如何转义 oh-my-zsh 别名中的特殊字符?
【发布时间】:2021-07-06 12:49:57
【问题描述】:

因此,我正在尝试创建一个别名,该别名将列出当前目录中的文件,例如“ls -lAh”,但仅包含我想要的特定列。所以我想出了这个命令:

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

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

但是,如果我想为这个命令创建一个别名,我显然需要转义很多字符以便正确解释它们,但我没有这样做。有时,当我在单引号或美元符号前面加上反斜杠时,它只是以某种方式破坏,我无法使其正常工作。

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

如果它改变任何东西,我在 MacOS 上。如果需要,请务必要求澄清。

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

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

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

【问题讨论】:

  • edit您的问题并展示您定义别名的尝试。这样就更容易提供帮助了。
  • @AlekseiK :不要反斜杠大括号。你在单撇号之间,所以你只需要转义单引号。顺便说一句,如果你定义一个函数而不是别名,我认为你会少得多。

标签: linux zsh alias oh-my-zsh


【解决方案1】:

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

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

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

  • 输入要引用的字符串,例如
    ls -lAh | awk 'BEGIN{FS=" "; OFS=" "} {print $6,$7,$8,$5,$9}'
  • ESC,然后按 '(单引号)。在您的示例中,这应该给您类似
    'ls -lAh | awk '\''BEGIN{FS=" "; OFS=" "} {print $6,$7,$8,$5,$9}'\'
  • 继续执行其余命令或将带引号的字符串复制并粘贴到编辑器中。

一般来说,要在单引号内引用单引号,您需要插入一个结束引号'、一个转义引号\',并在必要时插入一个开始引号',如下所示:

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

【讨论】:

  • 谢谢,之前有人回答过类似的问题,但无论什么原因他们的回答都被删除了,虽然你的解释更清楚了,现在我至少明白这是怎么回事了
【解决方案2】:

另一种选择是对“外部”引号使用双引号,因为双引号字符串支持转义。诀窍是知道需要转义的内容:

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 $6,$7,$8,$5,$9}'\'

【讨论】:

    【解决方案3】:

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

    ldir() {
    ls -lAh | awk 'BEGIN{FS=" "; OFS=" "} {print $6,$7,$8,$5,$9}'}
    

    然后重新加载 bashrc:

    source .bashrc
    

    您现在应该可以运行ldir 命令了。

    【讨论】:

    • 我知道我可以为此创建一个函数,但我只是希望所有内容都成为别名,这样管理起来更简单,而且我没有使用 bash,我使用的是 zsh,但是谢谢反正
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 2020-04-24
    • 2023-04-09
    • 1970-01-01
    • 2015-12-23
    • 2015-05-18
    相关资源
    最近更新 更多