2014-09-26 82 views
2

我想在我的.bashrc文件中更改我的PS1。 我发现用printf用%Q指令转义字符的脚本:Bash printf%q无效指令

#!/bin/bash 
STR=$(printf "%q" "PS1=\[email protected]\h:\w\$ ") 
sed -i '/PS1/c\'"$STR" ~/.bashrc 

的问题是,我得到这个错误:

script.sh: 2: printf: %q: invalid directive 

任何想法?也许换一种方式来逃避角色?

回答

4

printf命令内置到bash中。它也是一个外部命令,通常安装在/usr/bin/printf。在大多数Linux系统上,/usr/bin/printf是GNU coreutils的实现。

较早版本的GNU coreutils printf命令不支持%q格式说明符;它在2016年8月20日发布的8.25版中引入。 bash内置的printf命令可以 - 只要bash有内置的printf命令。

错误消息意味着您正在运行script.sh而不是bash。

由于#!/bin/bash行似乎是正确的,你可能执行下列操作之一:

sh script.sh 
. script.sh 
source script.sh 

相反,只是执行它直接(在确信,如果有需要的执行权限,使用chmod +x) :

./script.sh 

或者您可以手动编辑您的.bashrc文件。该脚本,如果正确执行,将这一行添加到您的.bashrc

PS1=\\[email protected]\\h:\\w\$\ 

(在该行的末尾空间显著)。或者你可以做更多的只是这样的:

PS1='\[email protected]\h:\w\$ ' 

该脚本的一个问题是,它将每代替行提到PS1。如果你只是设置一次,否则不指它,这很好,但如果你有类似的东西:

if [ ... ] ; then 
    PS1=this 
else 
    PS1=that 
fi 

然后脚本将彻底搞砸了。这太聪明了。

+1

这是手动操作比使用花哨的命令行更简单,更安全的情况之一。 :) – 2014-09-27 19:00:57

+1

RE:'GNU coreutils printf命令不支持%q格式说明符'coreutils文档现在提到'%q'指令:https://www.gnu.org/software/coreutils/printf – 2017-02-16 14:00:42

+0

@JanusTroelsen : 更新。 – 2017-02-16 18:16:45

0

Keith Thompson在他的回答中给出了很好的建议。但FWIW,你可以强制bash命令名前使用一个内置的命令builtin

builtin printf "%q" "PS1=\[email protected]\h:\w\$ " 

相反,

command printf "%s\n" some stuff

军队的bash使用外部命令(如果可以找一个)。

command可用于当功能具有相同名称的存在是为了在磁盘上调用的命令。然而,command确实是而不是在磁盘上调用一个命令来代替Bash内置的同名,它只能用来禁止调用shell函数。 (感谢Rockallite将此错误引起我的注意)。

可以启用或禁用特定的bash内建函数(也许你的.bashrc正在这样做printf)。详情请参阅help enable。我想我应该提到的是,你可以使用

type printf 

找出什么样的实体(外壳功能,内置或外部命令)的时候,你给它一个裸体printf bash将运行。你可以通过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,让我在将它们写入文件之前查看所做的修改。

+2

我不认为在这种情况下使用'builtin printf'会有所帮助。 bash默认会使用内建的'printf'。如果在这种情况下它没有使用它,那是因为被调用的shell不是bash。 – 2014-09-27 19:58:53

+0

好吧。除非在shell启动期间由于某种奇怪的原因而被'enable -n printf'禁用。但我同意你的理论更可能,我只是把它作为一种可能性提出来。 – 2014-09-27 20:08:34

+0

嗯。不知何故,我已经设法避免直到现在才了解“启用”命令。有趣。 – 2014-09-27 21:39:12