Używając bash, jak mogę wydać sygnał dźwiękowy z komputera?
Coś jak echo 'beepsound' > /dev/pcspkr
byłoby miło.
Używając bash, jak mogę wydać sygnał dźwiękowy z komputera?
Coś jak echo 'beepsound' > /dev/pcspkr
byłoby miło.
Odpowiedzi:
Zwykle używam małego narzędzia beep
zainstalowanego na wielu systemach. To polecenie spróbuje zastosować różne podejścia do stworzenia dźwięku systemowego.
Istnieją 3 sposoby tworzenia dźwięku ze strony beep
podręcznika:
Tradycyjna metoda generowania sygnału dźwiękowego w skrypcie powłoki polega na zapisaniu znaku ASCII BEL
( \007
) na standardowym wyjściu za pomocą polecenia powłoki, takiego jak
echo -ne '\007'
Działa to tylko wtedy, gdy standardowe wyjście powłoki wywołującej jest obecnie kierowane do jakiegoś urządzenia końcowego; jeśli nie, sygnał dźwiękowy nie wyda dźwięku, a nawet może spowodować niepożądane uszkodzenie w jakimkolwiek pliku, do którego skierowane jest wyjście.
Istnieją inne sposoby wywołania sygnału dźwiękowego. Nieco bardziej niezawodną metodą jest otwarcie /dev/tty
i wysłanie tam postaci BEL. Jest to odporne na przekierowanie We / Wy, ale nadal zawiedzie w przypadku, gdy skrypt powłoki, który chce wygenerować sygnał dźwiękowy, nie ma kontrolnego terminala, na przykład ponieważ jest uruchamiany z menedżera okien X.
Trzecie podejście polega na połączeniu się z wyświetlaczem X i wysłaniu komendy dzwonka. Nie zależy to od terminalowego urządzenia Unix, ale (oczywiście) wymaga wyświetlacza X.
beep
wypróbuje te 3 metody.
beep
polecenia to: johnath.com/beep W systemie Ubuntu / Debian można go zainstalować za pomocą apt-get install beep
.
pcspkr
moduł, załaduj snd-pcsp
i masz teraz kartę dźwiękową Alsa, która używa sztuczek oldschoolowych do faktycznego przesyłania cyfrowego dźwięku do wewnętrznego głośnika. Daje to kiepskie rezultaty z wewnętrznymi głośnikami piezoelektrycznymi, ale w klasycznych głośnikach wewnętrznych jakość jest całkiem dobra jak na to, co to jest. W ten sposób możesz uzyskać znacznie więcej kreatywności w zakresie dźwięków;)
pcspkr
i snd-pcsp
są modułami, a nie pakietami. użyj modprobe
/ modprobe -r
/, lsmod
aby nimi manipulować. Dla twojej informacji, są one w linux-image-something
pakiecie, który, mam nadzieję, jest już zainstalowany (inaczej nie miałbyś jądra Linuksa).
modprobe snd-pcsp
sygnał dźwiękowy teraz działa!
Po prostu echo \a
lub \07
działa dla mnie.
$ echo -e "\a"
Prawdopodobnie będzie to wymagało pcspkr
załadowania modułu jądra. Testowałem to tylko na RHEL, więc YMMV.
Jak zauważył Warren w komentarzach, może to nie działać po zalogowaniu zdalnym przez SSH. Szybkim obejściem byłoby przekierowanie wyjścia na dowolne urządzenie TTY (najlepiej takie, które nie jest używane). Na przykład:
$ echo -en "\a" > /dev/tty5
sudo modprobe pcspkr
wystarczyło, aby włączyć sygnały dźwiękowe w VT, za pośrednictwem printf "\a"
lub beep
narzędzia.
Ubuntu 16.04.1 LTS
UWAGA: To rozwiązanie emituje sygnały dźwiękowe z głośników , a nie z płyty głównej .
ALSA jest wyposażony w test głośników, generator dźwięków testowych z wiersza poleceń, którego można użyć do wygenerowania sygnału dźwiękowego:
$ speaker-test -t sine -f 1000 -l 1
Zobacz ten wątek na forum arch linux .
Jednak czas trwania sygnału dźwiękowego będzie dowolny, ale można go kontrolować w następujący sposób:
$ ( speaker-test -t sine -f 1000 )& pid=$! ; sleep 0.1s ; kill -9 $pid
Za pomocą tej funkcji możemy pójść o krok dalej i wygenerować sygnał dźwiękowy:
_alarm() {
( \speaker-test --frequency $1 --test sine )&
pid=$!
\sleep 0.${2}s
\kill -9 $pid
}
który jest wywoływany z argumentami częstotliwości i czasu trwania:
$ _alarm 400 200
Mając to na uwadze, można tworzyć proste utwory muzyczne speaker-test
. Zobacz ten skrypt powłoki .
timeout ${2} speaker-test --frequency ${1} --test sine
speaker-test -t sine -f 1000 -l 1 & sleep .2 && kill -9 $!
robi to samo. W każdym razie metoda @ user569825 jest lepsza.
tput bel
ponieważ terminfo definiuje bel
jako
Variable Cap- TCap Description
String name Code
bell bel bl audible signal
(bell) (P)
Aby użyć karty dźwiękowej, jeśli sox
jest zainstalowana, i głośnika PC, jeśli nie:
$ play -q -n synth 0.1 sin 880 || echo -e "\a"
sox
jest dostępny dla większości dystrybucji.
then
bloku wewnątrz, watch
aby powiadomić mnie, gdy spełniony zostanie określony warunek. Nawet pozwala mi pozostawić włączone słuchawki. To było dla mnie bardzo przydatne.
sudo -u USER play...
play
używa pulseaudio jako użytkownika. Myślę, że to zależy od konfiguracji systemu.
Niektóre dystrybucje mają do tego celu narzędzia wiersza poleceń. Może mógłbyś nam powiedzieć, na jakiej dystrybucji jesteś, lub wyszukać (np. emerge -s beep
W Gentoo).
Wychodząc poza „dostępne” narzędzia, możesz również utworzyć skrypt Perla, który emituje sygnał dźwiękowy, wszystko co musisz zrobić, to:
<SomeCodeBefore>
print "\007";
<SomeCodeAfter>
Jeśli w końcu usłyszysz „dźwięk”, wypróbuj następujące czynności:
#! /bin/sh
beep -f 500 -l 700
beep -f 480 -l 400
beep -f 470 -l 250
beep -f 530 -l 300 -D 100
beep -f 500 -l 300 -D 100
beep -f 500 -l 300
beep -f 400 -l 600
beep -f 300 -l 500
beep -f 350 -l 700
beep -f 250 -l 600
echo -e "\007"
działałoby w bashu zamiast print "\007
w perlu?
printf '\007'
zamiast echo
.
„ Sygnał dźwiękowy działa tylko wtedy, gdy komputer ma„ głośnik ”. Wiele współczesnych laptopów / małych urządzeń go nie ma.” - tredegar .
Zamiast tego spróbuj odtworzyć dźwięk:
$ play xxxxx.wav
Pracował dla mnie, kiedy wszystko inne zawiodło.
W systemie Linux narzędzia takie jak beep
mogą używać ioctl na konsoli do emitowania danego dźwięku. Mówiąc dokładniej, beep
użyje KIOCSOUND
ioctl, ale jest też KDMKTONE
ioctl, którego można użyć do generowania dźwięku.
Jak rozumiem, ten pierwszy uruchamia dźwięk, który trwa, dopóki nie zostanie wyraźnie anulowany, a drugi wygeneruje sygnał dźwiękowy o określonym czasie trwania. Szczegółowe informacje można znaleźć na stronie podręcznika console_ioctl
(4) .
Więc jeśli nie jesteś zadowolony z tego beep
, co robi, możesz napisać kilka wierszy kodu, aby uzyskać bezpośredni dostęp do tych plików ioctls. Zakładając, że masz pełny dostęp do /dev/console
, co może wymagać uprawnień roota.
W terminalu naciśnij Ctrl+, Ga następnieEnter