【问题标题】:how to use control characters in bash alias definition如何在 bash 别名定义中使用控制字符
【发布时间】:2020-04-17 08:22:46
【问题描述】:

我在 bash 中定义别名时遇到问题。

我将别名写为:

alias mypr="enscript -jC -p output.ps -b '$n %W Page $% of $='"

但是当我输入 alias mypr 时,我得到了这个($n 消失了,并且出现了一些额外的引号):

alias mypr='enscript -jC -p output.ps -b '\'' %W Page $% of $='\'''

我尝试查看53398792 的答案,但无法弄清楚我犯了什么错误。请给点建议?

【问题讨论】:

  • @codeforester/KamilCuk:我不同意近距离投票,因为引号的不同导致了问题。 OP 的尝试清楚地表明在他们的尝试中使用了这两种引用类型
  • 一个更规范的欺骗建议是链接一个解释为什么别名中的引号会导致问题的链接,并且如果它解释了建议函数而不是别名的替代方法

标签: bash


【解决方案1】:

避免将alias 定义用于除非常简单的命令快捷方式以外的任何内容,例如alias cdw="cd /home/users/foo/bar/workspace"。对于任何涉及多个命令构造或涉及参数的事情,引号总是更喜欢函数而不是 alias-es

您的函数替代可以简单地写成如下。这在任何 Unix shell 上都是 100% 可移植的,并且可以添加到启动文件中,您的 shell 正在使用

mypr() {
    enscript -jC -p output.ps -b '$n %W Page $% of $='
}

您的别名定义不起作用,因为 shell 不喜欢处理您的 $ 字符的方式。当您将别名定义为".." 时,在解析别名定义时,它会尝试扩展引号内的内容作为变量扩展的一部分。因此,任何包含前缀 $ 的标记都会被扩展,因此 shell 会尝试扩展 $n,但它没有看到任何值,因此它保留一个空字符串。

为避免这种情况,您应该将别名定义为单引号 '..' 或转义所有 $ 标记,以便在定义期间不会解析它们。由于$%$= 不是任何特殊的shell 变量或用户定义的变量,因此它们不会被扩展,而是按字面意思处理。

因此,在我们的第一阶段转义中,我们向$n 添加一个escape() 并将其定义如下

alias mypr="enscript -jC -p output.ps -b '\$n %W Page $% of $='"

您会立即看到,现在您保留了$n,但在删除引号时丢失了外部引号'..',因此您现在需要转义

alias mypr="enscript -jC -p output.ps -b \'\$n %W Page $% of $=\'"

你会发现,在调用你的别名时,即使上面的方法也不起作用,因为 shell 仍然设法扩展了$n。因此,您需要引入另一个级别的逃生和逃生。

alias mypr="enscript -jC -p output.ps -b \'\\\$n %W Page $% of $=\'"

【讨论】:

  • 感谢您的详细解释。但我发现@KamilCuk 的别名不那么复杂
【解决方案2】:

$n" 引号中展开。因为很可能变量n 是空的,所以它扩展为空。躲开它。

alias mypr="enscript -jC -p output.ps -b '\$n %W Page \$% of \$='"

或者使用单引号:

alias mypr='enscript -jC -p output.ps -b '\''$n %W Page $% of $='\'

或者只是使用一个函数:

mypr() { enscript -jC -p output.ps -b '$n %W Page $% of $=' "$@"; }

【讨论】:

  • 您的第一个和第二个选项不起作用,因为它在 -b arg 之后丢失了单引号
【解决方案3】:

试试这样的

alias mypr="enscript -jC -p output.ps -b \'"'\$n %W Page \$% of \$='"\'"

我用这个更简单的案例进行了测试:

# this outputs '$2'
alias tt="echo \'"'\$2'"\'"

所以我所做的是将所有美元符号转义并将它们放在单引号字符串中,引号也将它们转义但将它们放在双引号字符串中

这个想法是你可以将序列粘合在一起,这样你就可以拥有像"lala"'blabla' 这样的东西,它会很好地工作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-14
    • 2022-11-27
    • 1970-01-01
    • 2015-06-17
    • 2014-04-06
    • 2019-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多