O Bash fornece um printf
integrado com o especificador de formato %q
, que executa o shell escape para você, mesmo em versões mais antigas (< 4.0) do Bash:
printf '[%q]\n' "Ne'er do well"
# Prints [Ne\'er\ do\ well]
printf '[%q]\n' 'Sneaky injection $( whoami ) 'ls /root''
# Prints [Sneaky\ injection\ \$\(\ whoami\ \)\ \'ls\ /root\']
Esse truque também pode ser usado para retornar matrizes de dados de uma função:
function getData()
{
printf '%q ' "He'll say hi" 'or 'whoami'' 'and then $( byebye )'
}
declare -a DATA="( $( getData ) )"
printf 'DATA: [%q]\n' "${DATA[@]}"
# Prints:
# DATA: [He\'ll\ say\ hi]
# DATA: [or\ \'whoami\']
# DATA: [and\ then\ \$\(\ byebye\ \)]
Observe que o Bash printf
builtin é diferente do utilitário printf
, fornecido com a maioria dos sistemas operacionais semelhantes ao Unix. Se, por algum motivo, o comando printf
invocar o utilitário em vez do incorporado, você sempre poderá executar builtin printf
.