linuxbashsedprintfps1

Bash printf %q invalid directive


I want to change my PS1 in my .bashrc file. I've found a script using printf with %q directive to escape characters :

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

The problem is that I get this error :

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

Any idea ? Maybe an other way to escape the characters ?


Solution

  • The printf command is built into bash. It's also an external command, typically installed in /usr/bin/printf. On most Linux systems, /usr/bin/printf is the GNU coreutils implementation.

    Older releases of the GNU coreutils printf command do not support the %q format specifier; it was introduced in version 8.25, released 2016-10-20. bash's built-in printf command does -- and has as long as bash has had a built-in printf command.

    The error message implies that you're running script.sh using something other than bash.

    Since the #!/bin/bash line appears to be correct, you're probably doing one of the following:

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

    Instead, just execute it directly (after making sure it has execute permission, using chmod +x if needed):

    ./script.sh
    

    Or you could just edit your .bashrc file manually. The script, if executed correctly, will add this line to your .bashrc:

    PS1=\\u@\\h:\\w\$\ 
    

    (The space at the end of that line is significant.) Or you can do it more simply like this:

    PS1='\u@\h:\w\$ '
    

    One problem with the script is that it will replace every line that mentions PS1. If you just set it once and otherwise don't refer to it, that's fine, but if you have something like:

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

    then the script will thoroughly mess that up. It's just a bit too clever.