Skip to content
Vidar Holen edited this page Sep 8, 2020 · 1 revision

In POSIX sh, printf %q is undefined.

(or "In dash, ... is not supported." when using dash)

Problematic code:

ssh host "cat $(printf "%q" "$remotefile")"

Correct code:

There is not really a good, built-in way to escape a string for a remote shell in POSIX sh. However, you can replace each ' in the input with '\'' and then wrap the whole results in single quotes:

escape() { printf "'%s'\\n" "$(printf '%s' "$1" | sed -e "s/'/'\\\\''/g")"; }
ssh host "cat $(escape "$remotefile")"

Alternatively, switch to a shell that does support printf %q like ksh or bash.

Rationale:

printf %q is a bash and ksh extension. It's not supported on POSIX sh or dash.

Exceptions:

If the command is gated by a check for the correct shell, you can ignore this warning.

Related resources:

  • Help by adding links to BashFAQ, StackOverflow, man pages, POSIX, etc!

ShellCheck

Each individual ShellCheck warning has its own wiki page like S001. Use GitHub "Pages" feature above to find a specific one, or see Checks.

Clone this wiki locally