Você pode obter uma saída shell-quoted usando o @Q
modificador de expansão no Bash 4.4 e posterior:
$ echo "$timeStamp" - Executing command: sudo /home/editini.sh "${@@Q}"
Mon 04/16/18 04-05-pm - Executing command: sudo /home/editini.sh 'one' 'two' 'three' 'four' 'five' 'six'
Ele usa aspas simples, em vez de duplas, mas garante que a saída seja válida como entrada de volta para o shell que faz o que você espera. Um exemplo de onde isso é importante está abaixo, mas se o seu formato de log requerer aspas duplas, não é útil.
Um pouco confuso, ${@@Q}
usa o @
para dois significados diferentes em caracteres consecutivos: o primeiro @
representa o array de argumentos, enquanto o segundo introduz um modificador que transforma a saída da expansão do array. O modificador Q
faz com que a saída seja citada. $@
se expande para cada elemento individualmente, diferente de $*
, mas provavelmente não importa neste caso (embora isso possa acontecer se o seu código real for mais complexo).
@Q
e printf %q
, usam aspas simples porque elas inibem outras expansões de shell - se um dos argumentos tiver $
, '
, \
, "
ou !
em qualquer coisa com aspas duplas será suspeita. @Q
garante que o termo every seja citado, mesmo que não exija necessariamente (enquanto printf
não o exige). Os espaços ainda são manipulados corretamente.
$ set -- 'o$ne' "t w o" th\'ree fo\ur five\! s\"i\'x
$ echo "$timeStamp" - Executing command: sudo /home/editini.sh "${@@Q}"
Mon 04/16/18 04-05-pm - Executing command: sudo /home/editini.sh 'o$ne' 't w o' 'th'ree' 'fo\ur' 'five!' 's"i'\''x'
Você poderia copiar esse comando de volta e ele simplesmente funcionaria, não importando o quanto a entrada fosse perversa.