\ é usado várias vezes:
- para a forma
'...'de substituição de comando. Melhor é usar$(...). - para escapar de caracteres como
$,'e\entre aspas duplas. Melhor usar aspas simples em vez disso. - para escapar de
\no argumento de formato deprintf - para introduzir essa sequência de
\xHHno argumento de formato do outroprintf(embora não padrão).
Por isso, deve ser:
printf 'printf "\\\\x%x" 255 255 255 0'
printf 'printf '\\x%x' 255 255 255 0'
printf $(printf '\x%x' 255 255 255 0)
Ou seja, você precisa transmitir \ para a direita printf para gerar \ , mas com '...' , você precisará escapar de cada \ com \ e isso novamente por "..." .
Isso ainda está invocando o operador split + glob que não queremos aqui. Então:
printf "$(printf '\x%x' 255 255 255 0)"
Ou portavelmente:
printf "$(printf '\%o' 255 255 255 0)"
Com algumas implementações de awk (nem todas com o trabalho com 0):
LC_ALL=C awk 'BEGIN{printf "%c%c%c%c", 255, 255, 255, 0}'
com perl :
perl -e 'print pack "C*", @ARGV' 255 255 255 0
zsh alternativa que evita o bifurcação de um subshell:
(){setopt localoptions nomultibyte; printf %s ${(#)@}} 255 255 255 0
bash alternativa que evita bifurcar um subshell (também funciona em versões recentes de zsh ):
printf -v x '\%o' 255 255 255 0
printf "$x"