A idéia é codificar a lista de strings arbitrárias em uma variável escalar em um formato que possa ser usado posteriormente para reconstruir a lista ou cadeias arbitrárias.
$ save_pseudo_array x "y z" $'x\ny' "a'b"
'x' \
'y z' \
'x
y' \
'a'\''b' \
$
Quando você coloca set -- na frente disso, ele cria um código de shell que reconstrói essa lista de x , y z strings e a armazena na matriz $@ , que você precisa apenas de eval uate .
O sed cuida de citar corretamente cada string (adiciona ' no início da primeira linha, no final da última linha e substitui todos os ' s por '\'' ).
No entanto, isso significa executar um comando printf e sed para cada argumento, por isso é bastante ineficiente. Isso poderia ser feito de uma forma mais direta com apenas uma invocação awk:
save_pseudo_array() {
LC_ALL=C awk -v q=\' '
BEGIN{
for (i=1; i<ARGC; i++) {
gsub(q, q "\" q q, ARGV[i])
printf "%s ", q ARGV[i] q
}
print ""
}' "$@"
}