Todos os seus problemas são explicados em Por que meu script de shell sufoca em espaços em branco ou outros caracteres especiais? , mas vou repetir as partes relevantes aqui.
Primeiro, $var
em um script de shell não significa "o valor da variável var
", isso significa "pegar o valor da variável var
, dividi-lo em palavras e interpretar cada palavra como um caractere curinga padronizar". Para evitar essas etapas extras, coloque aspas duplas em torno das substituições de variáveis: "$var"
significa “o valor da variável var
”. Sempre coloque aspas duplas em torno de substituições de variáveis e substituições de comandos , a menos que você saiba e entenda por que precisa deixá-las de fora.
Segundo, echo
não imprime exatamente seu argumento: ele interpreta algumas opções e, em alguns shells, interpreta sequências de escape de barra invertida. Além disso, echo
imprime uma nova linha à direita, que você pode remover com a opção -n
. Os dados compactados com gzps nunca são uma opção e o echo
de bash trata as barras invertidas literalmente por padrão, mas, em geral, não use echo
em dados desconhecidos, use printf %s
.
printf %s "$ARCHIVE_CONTENTS" | tar xzv -C "$TMPDIR"
Isso garante o valor da variável ARCHIVE_CONTENTS
a tar
exatamente.
O problema restante, e um que você não pode resolver sem usar uma abordagem fundamentalmente diferente, é que a maioria das shells (todas as shells que eu vi separadas de zsh) truncam o valor das variáveis no primeiro byte nulo (isto é porque eles usam seqüências C terminadas por nulo sob o capô). Portanto, a variável ARCHIVE_CONTENTS
na verdade contém apenas o início do archive, até o primeiro byte nulo. Você não pode usar um shell para manipular dados binários.