我的键盘按钮有问题,我已经更换了 3 次键盘。我暂时将 printf 用于某些文本编辑器。我需要在别名上使用颜色打印数组中的“`”和“%”字符,根本不起作用。
基本上在 bash 中是这样的:
printf "[%c%c%c]\n", '`', '`', '%';
输出 :
[``%]
我试试这个:
alias key='printf "\n\033[33m= "[ %c%c%c~+ |\ ]\n\n", '`', '`', '%'" '
在别名上我得到这个错误:
]nn, , %: command not found
别名上的格式字符应该是什么?
提前致谢。
忽略无关的逗号 (
,
) 字符,这里的问题是引用。反引号是一种已弃用的命令替换语法,并在双引号内保留其特殊含义。所以而
作品,
等同于
printf '%c%c\n' "$(" ")"
,它尝试将文字空间作为命令执行并将结果作为参数传递给printf
:那么,为什么不能简单地使用单引号形式定义别名呢?出色地:
单引号不嵌套,所以
将
'printf '
,%c%c\n
, 和连接' '
成单一格式字符串,留下(未加引号)您的交互式 shell 扩展为
$(' ')' '
- 再次尝试执行文字空间。另一方面,如果您尝试使用外部双引号
然后根据上面链接的引用规则,单引号变成文字,你的 shell 再次扩展
' '
为命令。有效的是转义单引号:
对于您的完整别名
(尽管引用
"%"
并不是绝对必要的)。如果“倾斜的牙签”变得难以处理,您可以考虑使用 shell 函数而不是别名,从而消除一级引用1:
另见在 Bash 中,何时使用别名、何时使用脚本以及何时编写函数?
你在你的别名中使用反引号“`”......那些用于命令替换......
bash
虽然是旧的风格并且不应该使用因为它们可能会在未来的某个时候过时以支持当前的命令替换语法$( ... )
.. . 它们需要被转义,以便你能够printf
像你一样将它们作为参数传递给并作为文字反引号......像这样:另一种对你有用的方法是:
是因为它们用单引号括起来,这是告诉 bash 不要将它们作为命令替换标记处理的另一种方式......但是当您在别名字符串中使用它并添加更多单引号时,整个引号边界翻转并打开围绕反引号,即:
反引号由 bash 处理。
printf
在 bash 中不需要用逗号分隔的参数,尽管应该被很好地解析。%c
此外,通常不需要使用字符说明符,因为字符串说明符%s
可以与适当的引号/转义一起使用,并且应该更加灵活。