SC3050 – ShellCheck Wiki

See this page on GitHub

Sitemap


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.


ShellCheck is a static analysis tool for shell scripts. This page is part of its documentation.