【问题标题】:Is there a linux command that will read a certain number of characters including control chars?是否有一个 linux 命令可以读取一定数量的字符,包括控制字符?
【发布时间】:2015-08-11 11:13:32
【问题描述】:

例如,我希望能够读取 10 个键盘输入字符,并将它们存储到一个文件中。我试过linux命令:

read -n 10

但是如果你按 ctrl-c (0x03) 它会中止。我需要能够读取接下来的 10 个字符,无论它们是什么,包括所有控制字符,所以值 0x00 到 0xFF。这可能吗?

【问题讨论】:

  • 如果输入一个 0x03 字符,您的命令将成功读取。但是,Ctrl-C 默认会发送一个 sigint 并且不会输入 0x03 字符。这有什么用例?
  • 我想为终端仿真器应用程序发明一种将文件传输到远程主机的专有方法。基本上,终端仿真器会告诉 linux 端进入一种特殊模式,在该模式下它模仿用户输入文件的内容,远程 linux 站点将存储这些字节以在远程端创建文件。这有点像终端打印如何使用 [4i, [5i,但方向相反。
  • 您应该能够转储任意二进制数据并使用例如读取它。 cat > file。发送 0x03 字节与按 Ctrl-C 不同。
  • 试试这个:saved=$(stty -g);stty raw pass8;dd of=/your/output/file bs=1 count=10 2>/dev/null;stty $saved
  • @MarkPlotnick 似乎可行!谢谢。

标签: linux terminal stdin


【解决方案1】:

您可以通过(暂时!)将终端置于原始模式来覆盖控制字符的行为。这将让它读取任何可用的内容。但是读取指定个字符将取决于bash在这种情况下决定做什么。

例如,xterm 有几个相当可移植的 shell 脚本,它们将终端设置为原始模式,并从终端读回各种查询的响应(例如当前的字体名称)。在如下所示的脚本中:

exec </dev/tty                       
old=`stty -g`  
stty raw -echo min 0  time 5

$CMD $OPT "${ESC}]4;4;?^G${SUF}" > /dev/tty
read original
stty $old
original=${original}${SUF}

if ( trap "echo exit" EXIT 2>/dev/null ) >/dev/null
then
    trap '$CMD $OPT "$original" >/dev/tty; exit' EXIT HUP INT TRAP TERM
else
    trap '$CMD $OPT "$original" >/dev/tty; exit' 0    1   2   5    15
fi

虽然您必须阅读整个脚本才能了解它是如何工作的。那是来自acolors.sh(见sources)。

还请记住,即使您将终端设置为读取给定数量的字符(除非您强制不超时),那么您将获得终端提供的内容。这可以更少,并且(例如调用 ncurses 中的一些调试代码),读取终端响应的程序必须处理不完整的读取以及超时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-21
    • 2021-11-22
    • 2021-10-03
    • 1970-01-01
    • 2023-03-05
    • 2020-03-03
    相关资源
    最近更新 更多