[英]Bash printf %q invalid directive
我想在.bashrc文件中更改我的PS1。 我找到了一个使用带有%q指令的printf来转义字符的脚本:
#!/bin/bash
STR=$(printf "%q" "PS1=\u@\h:\w\$ ")
sed -i '/PS1/c\'"$STR" ~/.bashrc
问题是我收到此错误:
script.sh: 2: printf: %q: invalid directive
任何想法 ? 也许另一种逃避角色的方法?
printf
命令内置于bash中。 它也是一个外部命令,通常安装在/usr/bin/printf
。 在大多数Linux系统上, /usr/bin/printf
是GNU coreutils实现。
较早版本的GNU coreutils printf
命令不支持%q
格式说明符; 它是在2016年10月20日发布的版本8.25中引入的。 bash的内置printf
命令可以 - 并且只要bash有内置的printf
命令。
错误消息暗示您正在使用bash之外的其他内容运行script.sh
。
由于#!/bin/bash
行似乎是正确的,您可能正在执行以下操作之一:
sh script.sh
. script.sh
source script.sh
相反,只需直接执行它(在确保它具有执行权限后,如果需要,使用chmod +x
):
./script.sh
或者您可以手动编辑.bashrc
文件。 如果脚本正确执行,则会将此行添加到.bashrc
:
PS1=\\u@\\h:\\w\$\
(该行末尾的空间很重要。)或者你可以更简单地这样做:
PS1='\u@\h:\w\$ '
该脚本的一个问题是它将替换提到PS1
每一行。 如果你只是设置一次,否则不参考它,那很好,但如果你有类似的东西:
if [ ... ] ; then
PS1=this
else
PS1=that
fi
那么剧本就会彻底搞砸了。 这有点太聪明了。
基思汤普森在答案中提出了很好的建议。 但是FWIW,你可以强制bash使用内置命令,在命令名前加上builtin
例如
builtin printf "%q" "PS1=\u@\h:\w\$ "
反过来,
command printf "%s\\n" some stuff
强制bash使用外部命令(如果可以找到一个)。
command
时,可以使用具有相同名称的功能存在于磁盘上的调用命令。 然而, command
磁盘上不代替猛砸调用命令的内置具有相同的名称,它只能抑制一个shell函数的调用。 (感谢Rockallite引起我的注意这个错误)。
可以启用或禁用特定的bash内置函数(也许你的.bashrc正在对printf执行此操作)。 请参阅help enable
了解详情。 我想我应该提一下,你可以使用
type printf
找出什么样的实体(shell函数,内置函数或外部命令)bash在你给它一个裸露的printf
时会运行。 您可以通过传递type
-a
选项来获取具有给定名称的所有命令的列表,例如
type -a printf
您可以使用grep查看.bashrc文件中包含PS1的行:
grep 'PS1' ~/.bashrc
要么
grep -n0 --color=auto 'PS1=' ~/.bashrc
它为您提供行号和彩色输出。 然后,您可以使用行号强制sed只修改您想要更改的行。
例如,如果grep告诉您要更改的行是第7行,则可以执行此操作
sed -i '7c\'"$STR" ~/.bashrc
编辑它。 甚至更好,
sed -i~ '7c\'"$STR" ~/.bashrc
如果您犯了错误,它会备份文件的原始版本。
当使用sed -i
我通常在没有-i
情况下首先进行测试运行,以便输出转到shell,让我看看在将它们写入文件之前修改了什么。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.