首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在bash别名定义中使用控制字符

如何在bash别名定义中使用控制字符
EN

Stack Overflow用户
提问于 2020-04-17 08:22:46
回答 3查看 156关注 0票数 0

我在bash中定义别名有问题。

我把化名写成:

代码语言:javascript
复制
alias mypr="enscript -jC -p output.ps -b '$n %W Page $% of $='"

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

代码语言:javascript
复制
alias mypr='enscript -jC -p output.ps -b '\'' %W Page $% of $='\'''

我试着在53398792看答案,但不知道我犯了什么错误。请给我建议?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-04-17 09:15:19

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

代码语言:javascript
复制
alias mypr="enscript -jC -p output.ps -b '\$n %W Page \$% of \$='"

或者使用单引号:

代码语言:javascript
复制
alias mypr='enscript -jC -p output.ps -b '\''$n %W Page $% of $='\'

或者只是使用一个函数:

代码语言:javascript
复制
mypr() { enscript -jC -p output.ps -b '$n %W Page $% of $=' "$@"; }
票数 1
EN

Stack Overflow用户

发布于 2020-04-17 09:17:36

避免对真正简单的命令快捷键(例如,alias )使用任何其他的alias cdw="cd /home/users/foo/bar/workspace"定义。对于涉及多个命令构造或涉及参数的任何事情,引号总是喜欢函数而不是别名-es

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

代码语言:javascript
复制
mypr() {
    enscript -jC -p output.ps -b '$n %W Page $% of $='
}

您的别名定义不起作用,因为shell不喜欢处理$字符的方式。正确地,当您在".."下定义别名时,当解析别名定义时,它尝试扩展引号中的内容,作为它进行变量展开的一部分。因此,任何在前面包含$前缀的令牌都会被展开,因此shell尝试展开$n,而它看不到值,因此它保留了一个空字符串。

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

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

代码语言:javascript
复制
alias mypr="enscript -jC -p output.ps -b '\$n %W Page $% of $='"

您将立即看到,现在您保留了$n,但作为移除引号的一部分,丢失了外部引号'..',因此您现在需要转义它。

代码语言:javascript
复制
alias mypr="enscript -jC -p output.ps -b \'\$n %W Page $% of $=\'"

您会发现,即使在调用别名时,上面的内容也不起作用,因为shell仍然成功地展开了$n。所以引入另一个层次的逃避和逃避,这就是你所需要的。

代码语言:javascript
复制
alias mypr="enscript -jC -p output.ps -b \'\\\$n %W Page $% of $=\'"
票数 2
EN

Stack Overflow用户

发布于 2020-04-17 09:25:04

试试像这样的东西

代码语言:javascript
复制
alias mypr="enscript -jC -p output.ps -b \'"'\$n %W Page \$% of \$='"\'"

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

代码语言:javascript
复制
# this outputs '$2'
alias tt="echo \'"'\$2'"\'"

所以我所做的就是把所有的美元符号都放进单引号里,引号也转义了,但是把它们放进了双引号里。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61267106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档