繁体   English   中英

Bash printf%q无效指令

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM