Bash
在 bash 中使用二進制數據作為參數 - 任何允許 nuls 的方法?
所以我想將 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