别名内的反斜杠未作为其定义的一部分存储
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'
未加引号的字符串 \r
与 r
相同。
使用函数而不是别名可以轻松解决引用问题。
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"'
我有一个名为 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'
未加引号的字符串 \r
与 r
相同。
使用函数而不是别名可以轻松解决引用问题。
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"'