为什么 Ctrl+G 不产生蜂鸣声?

Jos*_*eph 2 linux

我读过在终端中按Ctrl+G会产生哔声。我试过了,没有任何反应。为什么?

我正在使用 GNOME 终端和 Bash。

Sté*_*las 12

Ctrl+G你的键盘让你的终端模拟器发送0x7 字节,也就是^GASCII 中的 BEL 字符又名\a(警报)。

大多数终端发出蜂鸣声(或视觉钟,像闪烁的屏幕),当他们收到该字符时,即当应用程序写该字符到终端设备的文件,或当回波该终端装置的TTY纪律的将其原封不动地发回。

如果您输入:

printf '\a'
Run Code Online (Sandbox Code Playgroud)

或者:

printf '\7'
Run Code Online (Sandbox Code Playgroud)

您应该看到闪光或听到哔声。

如果没有,请检查您的终端模拟器配置,默认情况下可能会禁用铃声。您可能还需要在桌面环境中为 gnome-terminal 等花哨的集成终端模拟器全局启用它。如果这仍然不起作用,请尝试使用适当的终端模拟器,例如xterm.

在 X11 中,终端仿真器(或它们使用的库)通常会调用XBell()标准 X 库函数以在未配置为进行屏幕闪烁时发出哔声。

可以使用xset b命令配置蜂鸣声(音高、基本音量、持续时间)。

在 Linux 和 PC 上,默认情况下,X 服务器将使用 PC 扬声器。但是现在,pcspkr默认情况下通常是禁用的。

相反,应用程序可以向 X 服务器注册来处理这些铃声。pulseaudio许多桌面环境中使用的声音服务器可以做到这一点。

如果它尚未配置为这样做,您可以取消注释或将这些行添加到您的~/.config/pulse/default.pa文件(或/etc/pulse/default.pa系统范围内):

load-sample-lazy x11-bell /usr/share/sounds/freedesktop/stereo/bell.oga
load-module module-x11-bell sample=x11-bell
Run Code Online (Sandbox Code Playgroud)

(用您选择的一个替换声音样本)。

现在,要在您按下 时听到哔声Ctrl-G,您需要应用程序来回显^G字符。或者对于没有自己的行编辑器的应用程序,在模式下让 tty 设备行规则回显icanon

默认情况下,Linux 上的行规则会回显它,但它会将其回显为^G(^G字符)。这可以改变

stty -echoctl
Run Code Online (Sandbox Code Playgroud)

如果你这样做:

stty -echoctl; cat
Run Code Online (Sandbox Code Playgroud)

您会听到蜂鸣声或看到屏幕闪烁Ctrl+G。虽然没有stty -echoctl或之后stty echoctl,您会看到^G显示在 上Ctrl+G

在交互式 shell 应用程序(如zsh或 )的提示下bash,或在可视化应用程序(如viemacsmuttaptitude... )中,应用程序可以决定在^G从终端设备文件中读取该 BEL/字符时执行其想做的任何事情。

Inemacs ^G用于中止当前的编辑器操作。在mode中zshbash处于emacsmode时是相同的(bash使用 GNU 或其他应用程序readline,这也受bell-styleprefer-visible-bell参数的影响)。作为其中的一部分,他们确实向^G终端发送了一个字符,这应该会引起哔哔声/闪烁。

一些可能相关的查询当前配置的命令(其中许多仅适用于使用基于 gtk 的桌面环境和 的 GNU/Linux 系统pulseaudio):