104 votes

Bip dans Shell Shell ne fonctionne pas ?

Je voudrais utiliser un bip sonore dans un Shell Shell. Malheureusement, aucune des méthodes que j'ai trouvées via Google ne fonctionne pour moi.

J'ai essayé

echo -e '\a'

echo -ne '\007'

et la commande beep après l'avoir installé via apt.

Quelle pourrait être la raison ?

2voto

Schalk Points 241

Il est peut-être trop tard, MAIS, pour le gars qui cherchera cela dans le futur :

printf '\x07'

2voto

Kris Points 121

J'ai ajouté cette petite fonction à mon .bashrc en remplacement de beep :

beep () {
    if [ "$1" = --list ]
    then
        find /usr/share/sounds -type f -exec basename {} \; | sort -n | tr '\n' ' '; echo
    else
        paplay $(find /usr/share/sounds -type f -iname "${1:-bell}*" | head -1)
    fi
}

Il recherche un fichier dans /usr/share/sounds commençant par l'argument fourni ou "bell" et le joue. beep --list renvoie la liste des fichiers dans /usr/share/sounds.

# Examples
beep
beep bark
beep trump

1voto

Noel Points 131
paplay /usr/share/sounds/purple/alert.wav

1voto

Gabriel Staples Points 5149

Aujourd'hui, Juin 2020 en Ubuntu 18.04 , l'ensemble sudo modprobe pcspkr et de faire des commentaires sur le blacklist pcspkr partie de la /etc/modprobe.d/blacklist.conf fichier, comme décrit ici ne semble pas être nécessaire.

Le mien est toujours sur la liste noire, mais le son de mon personnage de cloche fonctionne parfaitement !

$cat /etc/modprobe.d/blacklist.conf 
.
.
.
# ugly and loud noise, getting on everyone's nerves; this should be done by a
# nice pulseaudio bing (Ubuntu: #77010)
blacklist pcspkr

Au lieu de cela, assurez-vous simplement que le Cloche terminale le son est activé dans votre gnome-terminal paramètres :

Cliquez avec le bouton droit de la souris sur l'écran dans gnome-terminal --> Préférences --> cochez la case "Cloche de terminal" dans la section "Son". comme indiqué ci-dessous :

enter image description here

Maintenant, exécutez ceci, et entendez le son sourd du caractère de la cloche :

echo -e "\a"

Cela fonctionne également sur les sessions ssh distantes, ce qui est très pratique lorsque vous construisez sur une machine distante, par exemple, afin que le son de la cloche soit émis lorsque la construction est terminée, pour vous alerter :

time bazel build //...; echo -e "\a"

Notez également qu'en appuyant sur Backspace lorsqu'il n'y a rien à supprimer jouera également ce son en gnome-terminal .

En rapport :

  1. Le terminal `terminator` ne joue pas le son de cloche
  2. Mise à jour : voir également la réponse de @jvriesem à ma question dans les commentaires sous cette question ici : Comment activer la sonnerie du terminal ? . Il semble que je réponde à une question légèrement différente.

1voto

itzjackyscode Points 111

Certaines cartes mères n'ont pas de haut-parleur pour le signal sonore. Pour contourner ce problème, j'ai créé un script Python qui utilise à la place la fonction de FFmpeg aevalsrc pour générer des bruits de bip.

Note : vous devrez installer FFmpeg en utilisant sudo apt install ffmpeg

#!/usr/bin/env python3
# This program runs FFPlay to generate beeps.

from argparse import ArgumentParser, ArgumentError, Action
import re
import subprocess

# Custom action for note
class NoteToFrequencyAction(Action):
    _note = re.compile(r"([A-G])(bb|[bx#])?(\d+)")
    _note_factors = {
        "C": lambda x: x / (2 ** (9/12)),
        "D": lambda x: x / (2 ** (7/12)),
        "E": lambda x: x / (2 ** (5/12)),
        "F": lambda x: x / (2 ** (4/12)),
        "G": lambda x: x / (2 ** (2/12)),
        "A": lambda x: x,
        "B": lambda x: x * (2 ** (2/12)),
    }
    _accidental_factors = {
        "x" : lambda x: x * (2 ** (2/12)),
        "#" : lambda x: x * (2 ** (1/12)),
        None: lambda x: x,
        "b" : lambda x: x / (2 ** (1/12)),
        "bb": lambda x: x / (2 ** (2/12))
    }
    def __call__(self, parser, namespace, values, option_string) -> None:
        if not (isinstance(values, str)):
            raise ArgumentError("Should not have multiple values")

        parse = self._note.fullmatch(values);
        parts = parse.groups()

        freq = 440.0
        freq *= 2 ** (int(parts[2]) - 4)
        freq = self._note_factors[parts[0]](freq)
        freq = self._accidental_factors[parts[1]](freq)

        if not type(namespace.__dict__[self.dest]) == list:
            namespace.__dict__[self.dest] = []
        namespace.__dict__[self.dest].append(freq)

parser = ArgumentParser()

freq_group = parser.add_mutually_exclusive_group(required=True)
freq_group.add_argument("-f", "--frequency", type=float, action="append", dest="freqs",
    help="Can be specified more than once, specifies frequencies in Hz of the beeped notes"
)
freq_group.add_argument("-n", "--note", action=NoteToFrequencyAction, dest="freqs",
    help="Can be specified more than once, specifies notes (e.g. A4). You can use b, #, x, bb for accidentals."
)

parser.add_argument("-d", "--duration", type=float, default=1, dest="time",
    help="The duration of the beep in seconds."
)
parser.add_argument("-v", "--volume", type=float, default=0.5,
    help="The volume of the beep, defaults to 0.5"
)

args = parser.parse_args()
del parser, freq_group

aevalsrc_waves = [f"sgn(sin({repr(f)}*2*PI*t))" for f in args.freqs]
aevalsrc_expr = "+".join(aevalsrc_waves)
ffplay_filter = f"aevalsrc=({aevalsrc_expr})/{len(args.freqs)}*{args.volume}:d={args.time}"
print("aevalsrc filter:")
print(ffplay_filter)

subprocess.run([
    "ffplay", "-f", "lavfi", "-i", ffplay_filter, "-autoexit", "-nodisp"
], stderr=subprocess.DEVNULL)

Il suffit de coller dans ~/bin/beep y chmod +x beep pour le rendre disponible. Il ne supporte pas tout à fait les mêmes options, mais faire cela rendrait ce code beaucoup plus long qu'il ne l'est déjà.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X