将非标准字符写入Linux命令行

时间:2013-12-22 22:54:22

标签: linux unix unicode io ascii

我遇到了一些问题。为了做我正在尝试的事情,我需要能够将纯十六进制值输入到命令行的标准输入中(特别是在程序内部的gets()调用中)而不使用IO重定向。我通常使用ctrl + u + number来输入相当于输入的十六进制值的ascii字符,但是我需要能够输入null chars / backspaces / etc,终端要么忽略或解释为动作而不是字符。如果我使用管道或IO重定向,在初始输入和程序关闭后我无法与程序交互。有人会有任何想法吗?我想可能的解决方案是:

  1. 找到一种手动输入字符并保留字符的方法
  2. 找一种方法输入不是unicode或ascii的字符,但仍会被接受为字节信息
  3. 找到一种方法将输入管道或重定向到从命令行解释的程序,然后以某种方式说服它立即将输入控制权交还给命令行
  4. 第三个我甚至不确定是可行的还是有用的,因为我不完全确定为什么程序不能正常工作如果它从命令行直接获取信息,我只知道我必须手动输入,否则它将无法运行。有没有人对这3个选项中的任何一个有任何想法,或者你能想到的任何其他选项?我很难过。

    (哦,如果有人能解释为什么有时ctrl + u + number输出的字符与输入的数字完全不同的十六进制值,我很好奇,但我不认为它会帮助我当前的问题无论如何。)

1 个答案:

答案 0 :(得分:1)

您可以在tty(未烹饪)模式下切换raw,然后将所有输入的字符传递给程序而不进行任何处理:

$ stty raw
$ command ...
$ stty -raw

键盘完全能够使用 Control @ 发送空00字节,但是,无法使用{读取它{1}}看起来就像你使用的那样,确保你逐个字符处理字符串,而不是像gets一样处理字符串,在后一种情况下作为终结符。

原始模式下

00 Control D Control V Control <熟食模式下的/ kbd> D

04 Control E ,但可能会被您的终端模拟器截获,在这种情况下您必须禁用快捷方式或使用其他模拟器。

原始模式下

05 Control H Control V Control <熟食模式下的/ kbd> H

08只是 t

74不是有效的UTF-8字符。您仍然可以将此字节传递给您的程序,例如:

84