我想使用printf
带有特定格式字符串的快捷命令,并提出了以下内容。
local PF="printf %s\n"
$PF "Some Text"
它完成了这项工作,但想知道使用这种方法时是否存在任何警告,这可能会导致格式字符串的误解。
答案1
当您可以只使用函数时为什么要执行变量的值 - 这就是它们的用途。
PF() { printf "%s\n" "$@" ; } PF "Some Text"
或别名:
alias PF='printf "%s\n"' PF "Some Text"
如果您确实想使用变量,请使用它来保存格式字符串。例如
fmt="%s\n" printf "$fmt" "Some Text"
如果您希望将行长度保持在 80 个字符以下,则可以在两个或多个语句中分配变量。例如
fmt="......part1......" fmt+="......part2......" fmt+="......part3......" ...
如果您只想使分配的格式字符串更具可读性,或者添加有关部分或全部部分的单独注释,这也很有用。
答案2
在$PF
列表上下文中调用 split+glob。的内容$PF
根据涉及特殊参数的复杂规则进行分割(例如,与解释代码$IFS
时发生的情况无关),然后生成的单词受文件名生成的影响(又名路径名扩展又名通配符)。bash
printf %s\n
所以,这里至少存在两个问题:
的行为
$PF
取决于 的当前值$IFS
。默认情况下, inbash
,$IFS
包含空格、制表符和换行符,这里您确实希望$PF
按空格分割,否则字符串不包含制表符或换行符。但在$IFS
已更改的上下文中%
,例如,您最终会以参数运行"printf "
命令。"s\n"
在 bash 的某些版本(即 5.0,我相信它在 5.1 中被恢复)中,
\
是一个通配符(至少像这里一样,它来自一些参数扩展并且不用于引用)。打开
failglob
或nullglob
选项,这意味着:$ PF='printf %s\n' bash-5.0 -O failglob -c '$PF test' bash-5.0: no match: %s\n $ PF='printf %s\n' bash-5.0 -O nullglob -c '$PF test%d' test0
即使没有这些选项:
$ PF='printf %s\n' bash-5.0 -c '$PF test' test $ touch %sn $ PF='printf %s\n' bash-5.0 -c '$PF test' testn
看@cas' 很好的答案该怎么做。