Estou no Mac OS X 10.8.2, executando uma cópia compilada da xxdv1.10 ( código fonte ), bem como a cópia xxdque vem pré-instalada no OS X.
Estou tentando gerar uma assinatura SHA1 codificada em Base64 por meio de uma cadeia de comandos canalizados no Terminal.
Normalmente, eu faria algo como o seguinte:
$ echo "foo" | openssl sha1 | xxd -p -r | base64 - > foo_sha1_signature
O arquivo foo_sha1_signaturenormalmente contém um hash SHA1 codificado em Base64 da sequência foo.
O problema é que xxd -p -rnão retorna nenhum dado, portanto o arquivo foo_sha1_signatureestá vazio.
Se eu dividir os comandos para analisar a saída xxd -r, obterá um resultado (conforme impresso abaixo):
$ echo "foo" | openssl sha1 | xxd -p | xxd -r
7b36c94bcdf32bee$
Mas se eu canalizar a saída padrão para um arquivo, o arquivo estará vazio:
$ echo "foo" | openssl sha1 | xxd -p | xxd -r > foo_sha1_bytes
$ ls -al foo_sha1_bytes
-rw-r--r-- 1 alexpreynolds staff 0 Jan 2 23:02 foo_sha1_bytes
Se eu tentar o erro padrão de canalização, a saída padrão mostrará os bytes e o arquivo ainda está vazio:
$ echo "foo" | openssl sha1 | xxd -p | xxd -r 2> foo_sha1_bytes
7b36c94bcdf32bee$
Finalmente, se eu fizer tudo isso no Linux, xxdfuncionará conforme o esperado (recebo a assinatura em um arquivo). Portanto, isso parece ser um erro de como xxdfunciona no OS X 10.8.2.
Existe uma alternativa de código aberto para a xxdqual funciona no Mac OS X e envia uma representação em bytes da entrada padrão para a saída padrão?
$'foo\n'.) Openssl, xxd e base64 são versões pré-instaladas.
xxd -p | xxd -rnão funciona e não deve ser esperado (e não é o mesmo que xxd -p -r). xxd -pfaz um despejo hexadecimal de texto simples (neste caso, de algo que já é um despejo hexadecimal de texto simples); xxd -rtenta fazer uma conversão reversa (hex -> binária), mas espera um despejo formatado (não texto simples) como entrada e ficará confuso ao receber um despejo de texto simples.
xxdnem a que eu compilei. xxd -pfunciona, mas xxd -p -rfornece uma string em branco. Existe uma alternativa para xxdque funcione da mesma maneira xxd -p -r?