Bash

在 bash 中使用二進制數據作為參數 - 任何允許 nuls 的方法?

  • February 17, 2017

所以我想將 binaryFile.dd 的前 512 個字節作為第二個參數傳遞給 myProgram,但 bash 會刪除所有 NUL 字元。有什麼辦法可以在 bash 中避免這種情況,還是我一無所有?

myProgram parameter1 "$(head -c 512 binaryFile.dd)"

無法在命令的參數中傳遞空字節。這不是因為 bash 的限制,儘管 bash 也有這個限制。這是執行命令的介面的限制:它將空字節視為參數的結尾。沒有逃避機制。

大多數 shell 不支持變數或函式和內置函式的參數中的空字節。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,如果您嘗試將參數傳遞給外部命令,那麼空字節後面的任何內容都會被忽略——不是 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

引用自:https://unix.stackexchange.com/questions/344829