web-dev-qa-db-ja.com

bashは変数に16進値0x00を格納できません

私はddでいくつかのトリックをしようとしています。私はそれをddにパイプするために "header"と呼ばれる変数にいくつかの16進値を格納することが可能であると考えました。

変数なしの最初のステップはこれでした:

$ echo -ne "\x36\xc9\xda\x00\xb4" |dd of=hex
$ hd hex

00000000  36 c9 da 00 b4                                    |6....|
00000005

その後私はこれを試しました:

$ header=$(echo -ne "\x36\xc9\xda\x00\xb4") 
$ echo -n $header | hd

00000000  36 c9 da b4                                       |6...|
00000004

ご覧のとおり、私は\x00の値$header変数。誰かがこの動作の説明をしていますか?これは私を夢中にさせています。

11
Frank

代わりに、変数にNUL文字を格納できる唯一のシェルであるzshを使用できます。その文字はたまたまデフォルト値$IFS in zsh

nul=$'\0'

または:

nul=$'\x0'

または

nul=$'\u0000'

または

nul=$(printf '\0')

ただし、引数や環境変数はexecve()システムに渡されるNUL区切りの文字列であるため、このような変数をexecutedのコマンドに引数または環境変数として渡すことはできません。呼び出し(シェルではなく、システムのAPIの制限)。ただし、zshでは、関数または組み込みコマンドの引数としてNULバイトを渡すことができます。

echo $'\0' # works
/bin/echo $'\0' # doesn't
8