我读过,因为 Bash 中的文件路径可以包含除空字节(零值字节$'\0'
)之外的任何字符,所以最好使用空字节作为分隔符。例如,如果将 的输出find
发送到另一个程序,则建议使用该-print0
选项(对于find
具有它的版本)。
但是,虽然这样的事情工作正常(打印由换行符分隔的文件路径 - 别担心,这只是一个演示,我实际上并没有在实际脚本中这样做):
find -print0 \
| while IFS= read -r -d $'\0' ; do echo "$REPLY" ; done
Run Code Online (Sandbox Code Playgroud)
这样的事情就不会工作:
for file in * ; do echo -n "$file"$'\0' ; done \
| while IFS= read -r -d $'\0' ; do echo "$REPLY" ; done
Run Code Online (Sandbox Code Playgroud)
当我只尝试for
-loop 部分时,我发现它只是将所有文件名打印在一起,中间没有空字节。
为什么是这样?这是怎么回事?
我正在尝试用 dd 做一些技巧。我认为可以将一些十六进制值存储在名为“header”的变量中以将其通过管道传输到 dd。
我没有变量的第一步是这样的:
$ echo -ne "\x36\xc9\xda\x00\xb4" |dd of=hex
$ hd hex
00000000 36 c9 da 00 b4 |6....|
00000005
Run Code Online (Sandbox Code Playgroud)
之后我尝试了这个:
$ header=$(echo -ne "\x36\xc9\xda\x00\xb4")
$ echo -n $header | hd
00000000 36 c9 da b4 |6...|
00000004
Run Code Online (Sandbox Code Playgroud)
如您所见,我\x00
在$header
变量中丢失了值。有没有人对这种行为有解释?这真让我抓狂。