TCL Expect 正在向标准输出注入一个额外的空字符

TCL Expect is injecting an extra null character to stdout

似乎 expect 正在向标准输出添加额外的空字符或其他内容。例如:

$ expect -c 'spawn -noecho echo xyz; expect eof' | wc -c
5
$ echo xyz | wc -c
4

这个多余的字符是什么,我该如何去掉它?

不是空字符。您可以使用 xxd 之类的工具来准确查看 expect 产生的输出:

$ expect -c 'spawn -noecho echo xyz; expect eof' | xxd
00000000: 7879 7a0d 0a                             xyz..

这表明您获得了标准的 CR/LF 行尾终止符。我猜这是因为你的 echo 进程的标准输出连接到一个 tty 设备,这通常涉及额外的过滤来修改行尾字符等等(参见 stty详情)。

您可以通过将 tty 置于 raw 模式来禁用此行为,如下所示:

$ expect -c 'set stty_init raw; spawn -noecho echo xyz; expect eof' |   wc -c
4