printf %q
is undefined.(or "In dash, ... is not supported." when using
dash
)
ssh host "cat $(printf "%q" "$remotefile")"
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
.
printf %q
is a bash and ksh extension. It's not
supported on POSIX sh or dash.
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.