bashにはバイナリセーフな「トリプル未満」<<<演算子がありますか?


27

これはかなり仮説的な質問ですので、なぜ私がこれをしたいのか尋ねないでください。

Iが可変有すると仮定するとGIF、バイナリデータが含まれており、私はパイプを使用することができないと仮定すると|、オペレータは、次のようにすべきである「トリプル小なり」演算子を使用するための正しい方法です。

openssl enc -base64 <<< $GIF

ただし、バイナリセーフ<<<はないため、バイナリデータが破損しているように見えます。

バイナリセーフな同等物はありますか?


bash変数にNUL文字を含めることはできません。その$GIFため、開始時の変数は、開始前でもフルバイナリを保持していません。ただし、NUL文字を除き、他のすべてを保持しています。(参照として:vaab.blog.kal.fr/2014/05/03/…
vaab

回答:


31

ここでは、文字列のリダイレクトは、( <<<)のシンプルな形でここにドキュメントリダイレクト(<<)。ここで、文字列のリダイレクトは「バイナリセーフ」ではありません。Bashはhere文字列で展開を実行します。さらに、Bashはhere文字列の最後に改行を追加します(コマンドxxd -p <<< "foo"を発行すると666f6f0a、代わりに返されます)。

パイプを除く唯一の安全な方法は、I / Oリダイレクトです。

ここでは、バイナリセーフでない質問に似ています。エンコードされたデータを保存してこれを試すことができます

COMMAND_WITH_BIN_INPUT <(uudecode <(echo "$uuEncodedData")) 

しかし、これはそう遠くない

echo "$uuEncodedData"|uudecode|COMMAND_WITH_BIN_INPUT

しかし、パイプメタチャーはありません。


1
または、してみてくださいod -a <<< ""、あなたが表示されますnl進値の代わりに。
jcalfee314

@Wesley archive.orgもあります。:)オリジナルリンク:web.archive.org/web/20120126213653/http://tldp.org/LDP/abs/html/...
ジェイソンC

4

Bashは一般にバイナリセーフではないため、置換中にバイナリコンテンツを含む変数のヌルと改行が破損します。

したがって、答えは「いいえ」ですが、より根本的には「シェルスクリプト言語ではない」と思います。これらはすべてバイナリに問題があるようだからです。

ただし、データを$ GIFに入れるか、ファイルに入れるか、バイナリデータを問題なく処理する代替スクリプト言語としてpythonを使用することを計画していると思います。


1
参照や精度、または単純な例は、あなたの側からの乱暴な推測や一般的な感覚よりも役立ちます。bashを介してバイナリデータを解析する方法があります。
vaab
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.