Por que o Ctrl + G não produz um bipe?

1

Eu li que pressionar Ctrl + G no terminal produz um som de bipe. Eu tentei e nada acontece. Por quê?

Estou usando o Terminal e o Bash do GNOME.

    
por Joseph 29.10.2017 / 06:24

1 resposta

10

Pressionar Ctrl + G no teclado tem o emulador de terminal enviar o byte 0x7, também conhecido como ^G , que em ASCII é o BEL caractere também conhecido como \a (alerta).

A maioria dos terminais emitem um beep (ou campainha visual, como um piscar da tela), quando eles recebem esse caractere, ou seja quando o aplicativo grava esse caractere no arquivo de dispositivo do terminal, ou quando o echo da tty disciplina desse dispositivo terminal o envia de volta sem modificação.

Se você digitar:

printf '\a'

Ou:

printf ''

Você deve ver um flash ou ouvir um bipe.

Se não, verifique a configuração do emulador de terminal, os sinos podem estar desativados por padrão. Você também pode precisar ativá-lo globalmente em seu ambiente de desktop para emuladores de terminal integrados, como o gnome-terminal. Se isso ainda não funcionar, tente com um emulador de terminal adequado como xterm .

No X11, os emuladores de terminal (ou as bibliotecas que eles usam) geralmente chamam a função de biblioteca XBell() padrão X para causar um bipe quando eles não estiverem configurados para fazer a tela piscar.

Esse bip (pitch, volume base, duração) pode ser configurado com o comando xset b .

No Linux e nos PCs, por padrão, o servidor X usará o alto-falante do PC. No entanto, atualmente, o pcspkr é normalmente desativado por padrão.

Em vez disso, os aplicativos podem se registrar no servidor X para lidar com esses sinos. O servidor de som pulseaudio usado em muitos ambientes de área de trabalho pode fazer isso.

Se ainda não estiver configurado para isso, você poderá remover o comentário ou adicionar essas linhas ao arquivo ~/.config/pulse/default.pa (ou /etc/pulse/default.pa para todo o sistema):

load-sample-lazy x11-bell /usr/share/sounds/freedesktop/stereo/bell.oga
load-module module-x11-bell sample=x11-bell

(substitua a amostra de som por uma de sua escolha).

Agora, para ouvir um bipe quando você pressiona Ctrl-G , você precisa do aplicativo para echo que ^G character. Ou para aplicativos que não têm seu próprio editor de linha, tenha a disciplina de linha de dispositivo tty echo quando estiver no modo icanon .

Por padrão, a disciplina de linha no Linux irá ecoá-lo, mas irá ecoá-lo como ^G ( ^ e G caracteres). Isso pode ser alterado com

stty -echoctl

Se você fizer isso:

stty -echoctl; cat

Você ouvirá o bipe ou verá a tela piscando no Ctrl + G . Embora sem o stty -echoctl ou após stty echoctl , você veria ^G sendo exibido em Ctrl + G .

No prompt de um aplicativo de shell interativo como zsh ou bash , ou em um aplicativo visual como vi , emacs , mutt , aptitude ..., o aplicativo pode decidir fazer o que quer que seja, ao ler o caractere BEL / ^G do arquivo do dispositivo de terminal.

Em emacs ^G é para abortar a ação atual do editor . É o mesmo em zsh ou bash quando em emacs mode (com bash ou outros aplicativos usando o GNU readline , que também é afetado pelos parâmetros bell-style e prefer-visible-bell ). Como parte disso, eles enviam um caractere ^G de volta ao terminal, o que deve causar um bipe / flash.

Alguns comandos possivelmente relevantes para consultar a configuração atual (muitos dos quais se aplicam apenas a sistemas GNU / Linux usando um ambiente de desktop baseado em gtk e pulseaudio ):

  • Verifique a disciplina de linha de dispositivo do terminal echo -related parameters (para aplicativos como cat que não implementam sua própria interface de usuário do terminal (TUI)):

    stty -a | grep echo
    
  • Qual ação é mapeada para ^G no prompt do seu shell:

    bindkey '^G' # in zsh or tcsh
    bind -p | grep C-g # in bash
    
  • configurações relacionadas à campainha na configuração readline do GNU:

    grep bell /etc/inputrc ~/.inputrc
    bind -v | grep bell # bash
    
  • configurações relacionadas a bell no emulador de terminal xterm :

    appres XTerm | grep -i bell
    
  • em alguns emuladores ou ambientes de terminal baseados em 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
    
  • Configuração do sino X11:

    xset q | grep bell
    
  • configuração relacionada ao sino no pulseaudio:

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

    (em um sistema Linux Mint Cinnamon aqui, /usr/bin/start-pulseaudio-x11 faz um /usr/bin/pactl load-module module-x11-bell "display=$DISPLAY" "sample=bell.ogg" mas nunca define / carrega a amostra bell.ogg , então o sino não funciona até que você faça pactl upload-sample /usr/share/cinnamon/sounds/bell.ogg bell.ogg por exemplo)

  • se o módulo do kernel pcspkr ou snd-pcsp está carregado:

    lsmod | grep pcsp
    
  • se eles estão explicitamente desativados (na lista negra):

    grep -r pcsp /etc/modprobe*
    
  • carregado, mas desativado?

    find /sys/module -path '*pcsp*/enable' -exec grep -H . {} +
    
  • se o alto-falante do PC está disponível como um dispositivo ALSA:

    alsactl -f alsa.dump store; sed '/pcsp/,/^}/!d'  alsa.dump
    
  • ^G enviado para o console virtual do Linux emite um bipe?

    printf \a | sudo tee /dev/tty0
    
  • A reprodução do x11-bell (assumindo que um está definido) emite um som?

    pactl play-sample x11-bell
    
  • existe um dispositivo de evento de entrada registrado pelo módulo pcspkr ?

    find /sys/class/input -lname '*/pcsp*/event*' -ls
    
por 29.10.2017 / 08:49

Tags