为什么 Ctrl+G 不发出蜂鸣声?

为什么 Ctrl+G 不发出蜂鸣声?

我读到在终端中按Ctrl+会发出蜂鸣声。G我已经尝试过,但没有任何反应。为什么?

我正在使用 GNOME 终端和 Bash。

答案1

按下Ctrl+G键盘即可打开终端模拟器发送0x7 字节,又名^GASCII 中的 BEL 字符,又名\a(警报)。

大多数终端都会发出(或视觉铃声,如屏幕闪烁),当他们收到该字符,即当应用程序将该字符写入终端设备文件时,或者当回声该终端设备的 tty 规则将其原封不动地发回。

如果您输入:

printf '\a'

或者:

printf '\7'

您应该看到闪光或听到蜂鸣声。

如果没有,请检查您的终端仿真器配置,铃声可能默认被禁用。您可能还需要在桌面环境中全局启用它,以使用 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

(将声音样本替换为您选择的声音样本之一)。

现在,要在按下 时听到蜂鸣声Ctrl-G,您需要应用程序回声那个^G角色。或者对于没有自己的行编辑器的应用程序,请使用 tty 设备行规则回声处于icanon模式时。

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

stty -echoctl

如果你这样做:

stty -echoctl; cat

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

zsh在交互式 shell 应用程序(如或)的提示下bash,或者在可视化应用程序(如viemacsmutt、 ...)中,应用程序可以决定在从终端设备文件aptitude读取该 BEL/ 字符后执行任何操作。^G

emacs ^G是为了中止当前编辑器操作。它在zsh或模式bash下是相同的emacs(与bash或其他使用 GNU 的应用程序readline,也受bell-styleprefer-visible-bell参数的影响)。作为其中的一部分,他们确实将一个^G字符发送回终端,这应该会引起蜂鸣声/闪烁。

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

  • 检查终端设备线路规则echo相关参数(对于cat此类不实现自己的终端用户界面(TUI)的应用程序):

    stty -a | grep echo
    
  • ^Gshell 提示符下映射到的操作:

    bindkey '^G' # in zsh or tcsh
    bind -p | grep C-g # in bash
    
  • GNUreadline配置中与响铃相关的设置:

    grep bell /etc/inputrc ~/.inputrc
    bind -v | grep bell # bash
    
  • 终端模拟器中响铃相关设置xterm

    appres XTerm | grep -i bell
    
  • 在一些基于 gtk 的终端模拟器或环境中:

    gsettings list-recursively | grep -i bell
    dconf dump / | awk '/^\[/{p=$0};/bell/{print p ORS $0}'
    gconftool -R /apps/gnome-terminal/profiles | grep bell
    
  • X11铃配置:

    xset q | grep bell
    
  • 脉冲音频中与铃声相关的配置:

    pactl list | awk -vRS= -vORS='\n\n' '/bell|pcsp/'
    

    (在此处的 Linux Mint Cinnamon 系统上,/usr/bin/start-pulseaudio-x11执行 a/usr/bin/pactl load-module module-x11-bell "display=$DISPLAY" "sample=bell.ogg"但从未定义/上传bell.ogg示例,因此除非您执行此操作,否则铃声不会工作pactl upload-sample /usr/share/cinnamon/sounds/bell.ogg bell.ogg

  • pcspkr或内核模块是否snd-pcsp已加载:

    lsmod | grep pcsp
    
  • 它们是否被明确禁用(列入黑名单):

    grep -r pcsp /etc/modprobe*
    
  • 已加载但已禁用?

    find /sys/module -path '*pcsp*/enable' -exec grep -H . {} +
    
  • PC 扬声器是否可用作 ALSA 设备:

    alsactl -f alsa.dump store; sed '/pcsp/,/^}/!d'  alsa.dump
    
  • ^G发送到Linux虚拟控制台会发出蜂鸣声吗?

    printf \\a | sudo tee /dev/tty0
    
  • 播放x11-bell(假设已定义)会发出声音吗?

    pactl play-sample x11-bell
    
  • 模块是否注册了输入事件设备pcspkr

    find /sys/class/input -lname '*/pcsp*/event*' -ls
    

相关内容