だから私はbinaryFile.ddの最初の512バイトをmyProgramの2番目の引数として渡したいのですが、bashはすべてのNUL文字を削除します。 Bashでこれを避ける方法はありますか、それともすべてを隠していますか?
myProgram parameter1 "$(head -c 512 binaryFile.dd)"
ベストアンサー1
コマンドパラメータにNULLバイトを渡すことはできません。 bashにもこれらの制限がありますが、これはbashの制限によるものではありません。これはコマンドを実行するインターフェイスの制限です。 null バイトを引数の末尾として扱います。脱出メカニズムはありません。
ほとんどのシェルは、関数と組み込み関数の変数または引数でNULLバイトをサポートしていません。 Zshは注目すべき例外です。
$ ksh -c 'a=$(printf foo\\0bar); printf "$a"' | od -t x1
0000000 66 6f 6f
0000003
$ bash -c 'a=$(printf foo\\0bar); printf "$a"' | od -t x1
0000000 66 6f 6f 62 61 72
0000006
$ zsh -c 'a=$(printf foo\\0bar); printf "$a"' | od -t x1
0000000 66 6f 6f 00 62 61 72
0000007
ただし、zshを使用してもパラメーターを外部コマンドに渡そうとすると、nullバイト以降のすべての内容はzshではなくカーネルでは無視されます。
$ zsh -c 'a=$(printf foo\\0bar); /usr/bin/printf "$a"' | od -t x1
0000000 66 6f 6f
0000003
プログラムにヌルバイトを渡すには、コマンドライン引数以外の方法を見つける必要があります。
head -c 512 binaryFile.dd | myProgram --read-parameter2-from-stdin parameter1
myProgram --read-parameter2-from-file=<(head -c 512 binaryFile.dd) parameter1