Linux 在expect脚本中发送不可打印的字符

Linux 在expect脚本中发送不可打印的字符,linux,expect,Linux,Expect,我发现,当我在expect脚本中使用某些字节作为程序的输入时,当一个字节高于0x7f时,就会自动转换为多字节。例如,脚本中的以下行: spawn./myprog[exec perl-e{print”\x7f\x80}] 将实际三个字节而不是两个字节发送到myprog:0x7f 0xc2 0x80 myprog是一个简单的测试程序,可打印其获得的输入: int main(int argc, char** argv) { int i; for (i=0;i<strlen(argv[

我发现,当我在expect脚本中使用某些字节作为程序的输入时,当一个字节高于0x7f时,就会自动转换为多字节。例如,脚本中的以下行:

spawn./myprog[exec perl-e{print”\x7f\x80}]

将实际三个字节而不是两个字节发送到myprog:0x7f 0xc2 0x80

myprog是一个简单的测试程序,可打印其获得的输入:

int main(int argc, char** argv) {
   int i;
   for (i=0;i<strlen(argv[1]);i++) {
      printf("%x\n", (unsigned char)argv[1][i]);
}
我只得到了两个字节——正如预期的那样(与预期脚本行不同的{}是tcl对“”的替换)


如何在expect脚本中强制执行相同的行为?

经过更多的实验后,我发现唯一的方法是将参数转移到expect逻辑之外,例如:

set input [binary format H* 7f80]
exec echo "$input" > input.dat
spawn sh -c "./myprog `cat input.dat`"
请注意,由于$to expect的特殊含义,使用${…}而不是backticks似乎并不容易


当然,直接生成一个shell而不是进程不是一回事,但这对我的大多数用例来说并不重要。

spawn./myprog[binary format H*7f80]
也不起作用。
我发现唯一的方法就是做这个
——本着这个论坛的精神,请将此作为一个答案发布。不要使用“反勾号”,而是使用
$(…)
set input [binary format H* 7f80]
exec echo "$input" > input.dat
spawn sh -c "./myprog `cat input.dat`"