Keith Thompson 在他的回答中给出了很好的建议。但是 FWIW,您可以通过在命令名称前加上 builtin 来强制 bash 使用内置命令,例如
builtin printf "%q" "PS1=\u@\h:\w\$ "
反之,
command printf "%s\n" some stuff
强制 bash 使用外部命令(如果可以找到的话)。
command 可用于在存在同名的函数 时调用磁盘上的命令。但是,command 确实不调用磁盘上的命令来代替具有相同名称的 Bash 内置,它仅用于禁止调用 shell 函数。 (感谢 Rockallite 提醒我注意这个错误)。
可以启用或禁用特定的 bash 内置函数(也许您的 .bashrc 正在对 printf 执行此操作)。有关详细信息,请参阅help enable。我想我应该提到你可以使用
type printf
找出当你给它一个赤裸裸的printf 时,bash 会运行什么样的实体(shell 函数、内置或外部命令)。您可以通过将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,让我在将修改写入文件之前查看它们的作用。