别名内的反斜杠未作为其定义的一部分存储

Backslash inside an alias not being stored as part of its definition

我有一个名为 BedrockServer 的屏幕会话。我输入的别名是这样的:

alias stop='screen -R BedrockServer -X stuff "stop $(printf '\r')"'

但是当我输入 alias 时,它显示为

alias stop='screen -R BedrockServer -X stuff "stop $(printf r)"'

而且别名不起作用。


我试过修改引号并在引号前和美元符号前使用反斜杠,但没有任何解决办法。

知道我做错了什么吗?

单引号内除'外的所有符号都失去了它们的特殊含义。因此 $( ) 还没有被解释。 如果它被解释,你可以嵌套引号。但是因为它没有被解释,所以你不能嵌套引号。

你的别名基本上是

'some literal string 'anUnquotedString' another literal string'

未加引号的字符串 \rr 相同。

使用函数而不是别名可以轻松解决引用问题。

stop() {
  screen -R BedrockServer -X stuff "stop $(printf '\r')"
}

如果您想坚持使用别名,有很多选项可以正确引用,例如

alias stop="screen -R BedrockServer -X stuff \"stop $(printf '\r')\""

每次执行 stop 时,上面的两个命令都会执行 printf。这是没有必要的。在别名中,你可以为定义执行一次(注意$( )之前缺少的\):

alias stop="screen -R BedrockServer -X stuff \"stop $(printf '\r')\""

对于函数 and/or 别名,您甚至可以使用 ANSI C 字符串完全删除 printf

stop() {
  screen -R BedrockServer -X stuff $'stop \r'
}
alias stop=$'screen -R BedrockServer -X stuff "stop \r"'