他の人がすでに述べているように、NUL charを保存/使用することはできません:
ただし、任意のバイナリデータ(NUL文字を含む)を処理できます。
だからあなたの最後の質問に答えるために:
\ 0文字を含む文字列を(メタ)文字を失うことなく効率的に格納または処理する方法について、誰かにヒントを教えてもらえますか?
ファイルまたはパイプを使用して、任意のメタ文字を含む任意の文字列を効率的に格納および処理できます。
データを処理する場合は、さらに次の点に注意する必要があります。
制限を回避する
変数を使用する場合は、NUL charをエンコードして削除する必要があります。ここでの他のさまざまなソリューションは、それを行うための賢い方法を提供します(明らかな方法は、たとえばbase64エンコード/デコードを使用することです)。
メモリや速度が気になる場合は、最小限のパーサーを使用して、NUL文字(および引用符で囲まれた文字)のみを引用することをお勧めします。この場合、これはあなたを助けるでしょう:
quote() { sed 's/\\/\\\\/g;s/\x0/\\x00/g'; }
次に、機密データをにパイプすることにより、変数とコマンドライン引数にデータを格納する前にデータを保護できます。quote
これにより、NUL文字のない安全なデータストリームが出力されます。これを使用すると、元の文字列(NUL文字を含む)を元に戻すことができますecho -en "$var_quoted"
。これを使用すると、標準出力で正しい文字列が送信されます。
例:
## Our example output generator, with NUL chars
ascii_table() { echo -en "$(echo '\'0{0..3}{0..7}{0..7} | tr -d " ")"; }
## store
myvar_quoted=$(ascii_table | quote)
## use
echo -en "$myvar_quoted"
注:| hd
16進数でデータをきれいに表示し、NUL文字が失われていないことを確認するために使用します。
ツールの変更
コマンドラインで変数や引数を使用せずにパイプを使用できることを忘れないでください。たとえば、<(command ...)
名前付きパイプ(一時ファイルの一種)を作成する構造を忘れないでください。
編集:の最初の実装は正しくなく、によって解釈される特殊文字quote
を正しく処理しませんでした。それを見つけてくれてありがとう@xhienne。\
echo -en
EDIT2:の2番目の実装には、実際にはより多くのゼロを、、、と同等に消費するよりも多くを使用するためquote
にバグがありました。したがって、に置き換えられました。これを見つけてくれた@MatthijsSteenに感謝します。\0
\0
\00
\000
\0000
\0
\x00