top | item 38755694

Let the terminal bells ring out

80 points| hasheddan | 2 years ago |muxup.com

34 comments

order
[+] wolfgang42|2 years ago|reply
The article mentions not wanting to put a bell in their terminal prompt because it would cause too many notifications, but I found it difficult to remember to put `;tput bel` on every command that would be slow, so I compromised by configuring my shell to notify only on commands that took longer than 10 seconds. I also use a popup instead of a straight bell so I'll see a reminder of what it was that was happening (this is for MacOS, on Linux it would use `notify-send` instead):

    function preexec() {
      lrn_timer=${timer:-$SECONDS}
      lrn_command="$1"
    }
    lrn_timer=0
    function precmd() {
      [[ -v lrn_timer ]] || return # preexec() doesn't set timer if no command run (e.g. from ^C before running)
      timer_show=$(($SECONDS - $lrn_timer))
      unset lrn_timer
      # 10 is the notification threshold in seconds
      if (( ${timer_show} > 10 )); then
        terminal-notifier -sound default -message "Exit $? in ${timer_show}s: $lrn_command"
      fi
    }
(Based on https://gist.github.com/petethepig/2d29e8b7e2ebc808bfe760b63...)
[+] mklein994|2 years ago|reply
> [...] but I found it difficult to remember to put `;tput bel` on every command that would be slow [...]

What I do in these situations (assuming the job is still in the foreground, and can be interrupted), is suspend the task with ctrl+z and resume with `fg`, chaining it with some other command:

    fg; notify-send "done"
This uses the "job control" feature of `bash`, so it requires no extra setup. Your approach has the simple advantage however, that once it's set up, it just works, automatically.
[+] JNRowe|2 years ago|reply
One of the smart things with zsh is that the hooks¹ like precmd can be replaced with arrays of functions, so that you can cleanly have multiple hooks per hook point. It even provides a nice tool to work with the the arrays too², which makes editing/enabling/disabling far easier.

It makes life far easier when you see people post useful snippets(like wolfgang42's), but don't want to have to mangle them in to your already messy monolithic function.

¹ https://zsh.sourceforge.io/Doc/Release/Functions.html#Hook-F...

² https://zsh.sourceforge.io/Doc/Release/User-Contributions.ht...

[+] pmarreck|2 years ago|reply
How does this work without `trap` or `PROMPT_COMMAND`?

(I think PROMPT_COMMAND will take an array of functions in later versions of Bash)

[+] pmarreck|2 years ago|reply
is it notify-send, or libnotify, or notify-desktop? (I'm on NixOS and only see the latter 2 options...)
[+] Animats|2 years ago|reply
I'd wanted a bell in the Rust Egui/Winit system. There's no simple cross-platform "beep" or bell feature, short of bringing up a whole audio system.

The original Teletype bell in a Model 15 Teletype is a 3-inch gong with a satisfying "bong" sound. That was intended to be heard across a room of noisy machines. There's also a little end of line bell for typists, but that's not loud.

[+] 10000truths|2 years ago|reply
> The original Teletype bell in a Model 15 Teletype is a 3-inch gong with a satisfying "bong" sound. That was intended to be heard across a room of noisy machines. There's also a little end of line bell for typists, but that's not loud.

What would the machine do if a mischievous prankster ran a program that endlessly outputted ASCII BEL characters in a tight loop?

[+] jraph|2 years ago|reply
> konsole: As far as I can tell it isn't supported. Creating a new profile and setting the "Terminal bell mode" to "Visual Bell" doesn't seem to result in the urgent hint being set.

However, Konsole has a way better solution for the presented problem: it has been possible to "monitor for (in)activity for a long time. It is also now possible to monitor for process termination, which you can (un)check anytime if you decide that you need to be notified.

These features are very convenient, much better than having to hack a solution using the bell in my opinion.

[+] chaps|2 years ago|reply
Difference is that what the author wrote is a fair bit more portable since it doesn't require the use of a separate terminal xlient. Sure, konsole is lightweight and relatively portable, but doing it in a shell this way would work regardless of the terminal.
[+] aaron_m04|2 years ago|reply
It is indeed way better. The only thing is it doesn't work inside "sudo -i".
[+] eviks|2 years ago|reply
> Bells ringing, chiming, or (as is appropriate for the season) jingling all sounds very noisy - but although you can configure your terminal emulator to emit a sound for the terminal bell, I'm actually advocating for configuring a non-intrusive but persistent visual notification.

So, not a bell (remember that noisy awfulness whenever you held backspace for a bit too long and it spammed useless warnings that there is nothing to delete)

> makes it easy to configure behaviour based on the duration of a command and

Glad the article was edited, it's indeed way more reasonable than having the mental overhead to add ;bell every time (though notifications have a benefit that you can add a payload that tells you which command finished and how long it took without having to switch back)

[+] asb|2 years ago|reply
(Article author here). I'm typically executing the same compile command from shell history (or via an alias) so missing off the `'; bell` isn't really a concern, but I agree that automatically triggering it after commands of a certain duration is a nicer way of avoiding that mental overhead if you're executing a wider variety of commands.
[+] efitz|2 years ago|reply
I thought this was going to be an article about how someone used a Raspberry Pi and some maker fu to connect 0x7 on their terminal to a cathedral or something.
[+] pi-rat|2 years ago|reply
A guy at the office has a 3D printed contraption featuring a solenoid striking a bike bell for his terminal.. and there’s a cathedral nearby.. don’t give him ideas..
[+] wanderingjew|2 years ago|reply
[+] snvzz|2 years ago|reply
Can't open because twitter, but here's own explanation:

Control-a inputs byte value 1, control-b 2 and so on.

BEL is mapped to value 7 in ascii, thus C-g.

Note control-space usually does input a NUL (0) in most terminals.

[+] Arch485|2 years ago|reply
This was super cool - I've always wondered why the bell character exists/why it's ctrl+G.
[+] jhaenchen|2 years ago|reply
I use BEL + IFFTT webhooks to trigger a notification on my laptop and my iPhone whenever something finishes. Echo hi; notification

With an alias for notification

[+] jart|2 years ago|reply
The terminal bell is dead; history has killed it.
[+] mprovost|2 years ago|reply
‘Wuff, Wuff!!’
[+] anilakar|2 years ago|reply
Spawning a screen session by default is a good habit indeed. Especially on remote hosts when you are doing something critical.