1 SC3050
Vidar Holen edited this page 2020-09-07 20:45:47 -07:00

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.

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