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