标签: tty

为什么从管道读取时 awk 会进行全缓冲

我正在从连接到发送 nmea 字符串的 gps 设备的串行端口读取数据。

一个简单的调用来说明我的观点:

  $ awk '{ print $0 }' /dev/ttyPSC9 
  GPGGA,073651.000,6310.1043,N,01436.1539,E,1,07,1.0,340.2,M,33.3,M,,0000*56
  $GPGSA,A,3,28,22,09,27,01,19,17,,,,,,2.3,1.0,2.0*39
  $GPRMC,073651.000,A,6310.1043,N,01436.1539,E,0.42,163.42,070312,,,A*67
  GPGGA,073652.000,6310.1043,N,01436.1540,E,1,07,1.0,339.2,M,33.3,M,,0000*55
  $GPGSA,A,3,28,22,09,27,01,19,17,,,,,,2.3,1.0,2.0*39
Run Code Online (Sandbox Code Playgroud)

如果我尝试从管道读取,awk 会在将输入发送到 stdout 之前对其进行缓冲。

$ cat /dev/ttyPSC9 | awk '{ print $0 }'
<long pause>
GPGGA,073651.000,6310.1043,N,01436.1539,E,1,07,1.0,340.2,M,33.3,M,,0000*56
$GPGSA,A,3,28,22,09,27,01,19,17,,,,,,2.3,1.0,2.0*39
$GPRMC,073651.000,A,6310.1043,N,01436.1539,E,0.42,163.42,070312,,,A*67
GPGGA,073652.000,6310.1043,N,01436.1540,E,1,07,1.0,339.2,M,33.3,M,,0000*55
$GPGSA,A,3,28,22,09,27,01,19,17,,,,,,2.3,1.0,2.0*39
Run Code Online (Sandbox Code Playgroud)

如何避免缓冲?

编辑:凯尔琼斯建议 cat 正在缓冲它的输出,但这似乎没有发生:

$ strace cat /dev/ttyPSC9 | awk '{ print $0 }'
write(1, "2,"..., 2)                    = 2
read(3, "E"..., 4096)                   = 1
write(1, "E"..., 1)                     = 1
read(3, ",0"..., 4096)                  = 2
Run Code Online (Sandbox Code Playgroud)

当我想到它时:我认为程序在写入终端时使用了行缓冲,而在所有其他情况下使用了“常规缓冲”。那么,为什么 cat 没有缓冲更多呢?串口信号是EOF吗?那为什么 cat 没有被终止呢?

awk tty serial-port

27
推荐指数
3
解决办法
2万
查看次数

如何阻止光标闪烁

blinkingTTY 中如何使光标停止?(或其他任何地方)。

一项通用设置的奖励积分,该设置几乎可以在任何地方停止光标闪烁。

tty

25
推荐指数
5
解决办法
5万
查看次数

终端中的空白空间/背景可以用随机(但漂亮)的 ASCII 字符模式替换吗?

背景和问题

有很多方法可以为终端和外壳环境着色。单个命令的输出(例如lsgrep)也可以着色。在控制台播放媒体的概念虽然没有直接关系但很有趣,但这似乎依赖于窗口系统之上的一些框架(库)。以下问题仅针对bashshell 及其在 Linux 终端框架中的实现及其基础。

请考虑以下 2D游戏场景的 ASCII“渲染”蒙太奇:

矮人要塞游戏中的自然场景(树木、灌木、花卉、草) - 前 2 个屏幕显示游戏没有图块集(仅 ASCII),第三个屏幕使用 Vherid 块集生成,接下来的 2 个屏幕使用CLA 图块集,最后一个屏幕是用 Jolly Bastion 图块集生成的

这些不是随机生成的场景。我选择的所有片段实际上都描绘了某种形式的“草原”地形(树木、灌木和灌木、花、草等),来自使用 ASCII 字符表示此类对象的游戏。最后 4 个场景展示了用户制作的图块集,它们基本上是带有颜色规格的 ASCII 字符的重新映射(这些细节是微不足道的 - 可以说这是我在这里尝试在视觉效果方面实现的视觉灵感,“图案”)。

蒙太奇分享的那些场景的共同特点是:

  • 最多 5-6 个不同的 ASCII 字符(逗号、引号等)
  • 使用2-4种颜色
    • 对于字符
    • 对于某些情况下的字符背景 - 最后一个例子是展示使用很少或没有字符的颜色阴影来创建图案,即彩色马赛克

我目前在 VM 中拥有的是Arch Linux,虽然问题不是特定于发行版的,但我已经查看了他们的文档以自定义/etc/bash.bashrc文件。我可以看到很多解释都用于配置提示的外观以及通常的所有前景元素。除了通常的纯色外,几乎没有关于任何背景配置的信息,例如这些设置和提示

# Background
On_Black='\e[40m'       # Black
On_Red='\e[41m'         # Red
On_Green='\e[42m'       # Green
On_Yellow='\e[43m'      # Yellow
On_Blue='\e[44m'        # …
Run Code Online (Sandbox Code Playgroud)

colors bash terminal tty

25
推荐指数
1
解决办法
3890
查看次数

获取 ssh 转发信号

我希望能够通过 ssh 发送信号(SIGINT 是最重要的)。

这个命令:

ssh server "sleep 1000;echo f" > foo
Run Code Online (Sandbox Code Playgroud)

将在服务器上开始睡眠,并在 1000 秒后将 'f\n' 放在我本地机器上的文件 foo 中。如果我按 CTRL-C(即向 ssh 发送 SIGINT),它将终止 ssh,但不会终止远程服务器上的 sleep。我希望它杀死远程服务器上的睡眠。

所以我试过:

ssh server -t "sleep 1000;echo f" > foo
Run Code Online (Sandbox Code Playgroud)

但如果 stdin 不是终端,我会收到此错误:

Pseudo-terminal will not be allocated because stdin is not a terminal.
Run Code Online (Sandbox Code Playgroud)

然后 SIGINT 仍然没有转发。

所以我试过:

ssh server -t -t "sleep 1000;echo f" > output
Run Code Online (Sandbox Code Playgroud)

但是 foo 中的输出不是 'f\n' 而是 'f\r\n' 这在我的情况下是灾难性的(因为我的输出是二进制数据)。

在上面我使用“sleep 1000;echo f”,但实际上它是由用户提供的,因此它可以包含任何内容。然而,如果我们可以让它适用于“sleep 1000;echo f”,我们很可能让它适用于所有现实情况。

我真的不关心在另一端获得伪终端,但我一直无法找到任何其他方式让 ssh 转发我的 SIGINT。

还有其他方法吗?

编辑:

用户可以给出从 …

ssh remote signals tty

24
推荐指数
1
解决办法
1万
查看次数

使管道中的程序认为它有 tty

测试环境:

$ mkdir testdir
$ cd testdir
$ echo | tee "file 
name"
Run Code Online (Sandbox Code Playgroud)

现在,ls将打印file?name(至少在 Ubuntu GNU bash 下),而ls | cat将在单独的行中打印filename

我想要实现的是,file?name用管道版本打印,所以像

$ something ls | cat` or `ls | something | cat` or `ls | something cat
Run Code Online (Sandbox Code Playgroud)

换句话说,如何让像ls这里这样的命令陷入思考,它有一个 TTY,当它没有时,在 shell 中?

注意: ls这里只是一个示例程序,我正在寻找通用解决方案,而不是特定于程序的解决方案ls -q | cat

shell pipe tty

24
推荐指数
1
解决办法
5619
查看次数

重新绑定/禁用 CTRL+ALT+F# 虚拟终端/控制台切换

我有一个绑定CTRL+ ALT+的应用程序F7,但我的 linux 机器似乎可以捕捉到击键。

有没有办法重新绑定/禁用此密钥?重新编译内核是可以接受的答案。

有问题的发行版是 Fedora 16 和 Ubuntu 11.10。

keyboard-shortcuts x11 tty console virtual-consoles

23
推荐指数
3
解决办法
2万
查看次数

单击时 GNU 屏幕显示奇怪的字符

我在 GNU 屏幕上有一个小问题。GNU 屏幕会话在我的 RaspberryPi 上运行。现在有时,当我加入它时,如果我在终端中单击(我在 Fedora 上使用终结器),我会看到奇怪的字符。这些字符取决于我鼠标的坐标……似乎是对发送到 GNU Screen 的点击事件的错误解码。这些字符包括诸如

kM#kM -  Z3#Z3  -  q-#q-
Run Code Online (Sandbox Code Playgroud)

等等…

我首先认为这是我的问题,tty所以我去在我的 RaspberryPi 上打开了一个新的 GNU Screen 会话:完全没问题。
stty -a在两个会议上都做了一个,发现有区别。然后我stty -g > ~/stty-good-settings在好的会话上做了一个 并将它加载到坏的会话上stty `cat ~/stty-good-settings`(我比较了之后的值,成功加载了设置)但是我在一个屏幕会话中仍然有问题,而不是另一个!

我不确定发生了什么,如果这是由于我的TERM价值(两者相同)、我的tty设置、我的终端......

gnu-screen xterm tty

23
推荐指数
2
解决办法
6304
查看次数

如何将 `watch` 作为后台作业运行?

当我运行时:

watch 'cmd >> output.txt' &
Run Code Online (Sandbox Code Playgroud)

作业被系统暂停:

3569 停止(tty 输出)

有解决方法吗?

command-line shell tty watch background-process

21
推荐指数
3
解决办法
3万
查看次数

为什么我的虚拟控制台完全空白?

当我从图形会话去通过虚拟主机Ctrl+ Alt+ F i(与我在1 - 7和9-12)我看到一个完全黑屏。只有在 F8 上我才能看到 GUI。其他人甚至没有闪烁的光标。当我输入任何东西时,我什么也看不到。

有什么问题,我该如何解决?

我的系统

$ uname -a
Linux pc09 3.13.0-36-generic #63-Ubuntu SMP Wed Sep 3 21:30:07 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
$ cat /etc/issue
Linux Mint 17 Qiana \n \l
$ lspci | grep VGA
01:00.0 VGA compatible controller: NVIDIA Corporation GK110B [GeForce GTX Titan Black] (rev a1)
$ lspci -k | grep -A 2 -i "VGA"
01:00.0 VGA compatible controller: NVIDIA Corporation GK110B [GeForce GTX Titan Black] …
Run Code Online (Sandbox Code Playgroud)

tty

20
推荐指数
2
解决办法
2万
查看次数

20
推荐指数
2
解决办法
5万
查看次数