เมื่อใช้ bash ฉันจะสร้างเสียงบี๊บของลำโพงในคอมพิวเตอร์ได้อย่างไร
สิ่งที่ชอบecho 'beepsound' > /dev/pcspkr
จะดี
เมื่อใช้ bash ฉันจะสร้างเสียงบี๊บของลำโพงในคอมพิวเตอร์ได้อย่างไร
สิ่งที่ชอบecho 'beepsound' > /dev/pcspkr
จะดี
คำตอบ:
ฉันมักจะใช้ยูทิลิตี้ตัวเล็ก ๆ ที่beep
ติดตั้งในหลาย ๆ ระบบ คำสั่งนี้จะลองใช้วิธีการต่าง ๆ ในการสร้างเสียงของระบบ
มี 3 วิธีในการสร้างเสียงจากbeep
manpage:
วิธีการดั้งเดิมของการสร้างเสียงบี๊บในเชลล์สคริปต์คือการเขียนอักขระASCII BEL
( \007
) ไปยังเอาต์พุตมาตรฐานโดยใช้คำสั่งเชลล์เช่น
echo -ne '\007'
ใช้งานได้เฉพาะในกรณีที่เอาต์พุตมาตรฐานของเชลล์การโทรถูกส่งไปยังอุปกรณ์ปลายทางในบางประเภทเท่านั้น หากไม่ส่งเสียงบี๊บจะไม่มีเสียงและอาจทำให้เกิดความเสียหายที่ไม่ต้องการในไฟล์ใด ๆ ที่ไฟล์นั้นถูกส่งไปยัง
มีวิธีอื่นที่จะทำให้เกิดเสียงบี๊บ วิธีการที่น่าเชื่อถือมากขึ้นเล็กน้อยคือการเปิด/dev/tty
และส่งตัวละครของคุณที่นั่น สิ่งนี้มีความทนทานต่อการเปลี่ยนทิศทาง I / O แต่ยังคงล้มเหลวในกรณีที่เชลล์สคริปต์ที่ต้องการสร้างเสียงบี๊พนั้นไม่มีเทอร์มินัลการควบคุมยกตัวอย่างเช่นเพราะมันรันจาก X window manager
วิธีที่สามคือการเชื่อมต่อกับจอแสดงผล X ของคุณและส่งคำสั่งระฆัง สิ่งนี้ไม่ได้ขึ้นอยู่กับอุปกรณ์เทอร์มินัล Unix แต่ (แน่นอน) ต้องการการแสดง X
beep
จะลองใช้ทั้ง 3 วิธี
beep
คำสั่ง: johnath.com/beep ในอูบุนตู / Debian apt-get install beep
คุณสามารถติดตั้งด้วย
pcspkr
โมดูลโหลดsnd-pcsp
และตอนนี้คุณมีการ์ดเสียง alsa ที่ใช้ลูกเล่นโรงเรียนเก่าในการป้อนเสียงดิจิตอลไปยังลำโพงภายในของคุณ มันให้ผลลัพธ์ที่แย่มากกับลำโพงภายใน piezoelectric แต่สำหรับลำโพงภายในแบบคลาสสิกคุณภาพค่อนข้างดีสำหรับสิ่งที่มันเป็น วิธีนี้คุณจะได้รับมากขึ้นความคิดสร้างสรรค์สำหรับเสียงเตือนของคุณเสียง;)
pcspkr
และsnd-pcsp
เป็นโมดูลไม่ใช่แพ็คเกจ ใช้modprobe
/ modprobe -r
/ lsmod
เพื่อจัดการพวกมัน สำหรับข้อมูลของคุณพวกเขาอยู่ในlinux-image-something
แพ็คเกจซึ่งหวังว่าจะได้รับการติดตั้งแล้ว (หรืออย่างอื่นคุณจะไม่มีเคอร์เนล linux)
modprobe snd-pcsp
beep ก็ทำงานได้แล้ว
เพียงสะท้อน\a
หรือ\07
ทำงานให้ฉัน
$ echo -e "\a"
นี่อาจจะต้องpcspkr
โหลดโมดูลเคอร์เนล ฉันเพิ่งทดสอบสิ่งนี้กับ RHEL ดังนั้น YMMV
เนื่องจาก Warren ชี้ให้เห็นในความคิดเห็นสิ่งนี้อาจไม่ทำงานเมื่อลงชื่อเข้าใช้จากระยะไกลผ่าน SSH วิธีแก้ปัญหาอย่างรวดเร็วคือการเปลี่ยนเส้นทางเอาต์พุตไปยังอุปกรณ์ TTY ใด ๆ (โดยเฉพาะอย่างยิ่งอุปกรณ์ที่ไม่ได้ใช้) เช่น:
$ echo -en "\a" > /dev/tty5
sudo modprobe pcspkr
ก็เพียงพอที่จะเปิดใช้งานเสียงบี๊บภายใต้ VT ไม่ว่าจะผ่านทางprintf "\a"
หรือbeep
ยูทิลิตี้
Ubuntu 16.04.1 LTS
หมายเหตุ: การแก้ปัญหานี้ส่งเสียงดังขึ้นจากลำโพงไม่เมนบอร์ด
ALSA มาพร้อมกับการทดสอบลำโพงตัวสร้างเสียงทดสอบลำโพงบรรทัดคำสั่งซึ่งสามารถใช้ในการสร้างเสียงเตือน:
$ speaker-test -t sine -f 1000 -l 1
อย่างไรก็ตามระยะเวลาการส่งเสียงบี๊บจะเป็นแบบสุ่ม แต่สามารถควบคุมได้ดังนี้:
$ ( speaker-test -t sine -f 1000 )& pid=$! ; sleep 0.1s ; kill -9 $pid
เราสามารถทำขั้นตอนต่อไปและส่งเสียงบี๊บด้วยฟังก์ชั่นนี้:
_alarm() {
( \speaker-test --frequency $1 --test sine )&
pid=$!
\sleep 0.${2}s
\kill -9 $pid
}
ซึ่งเรียกว่ามีการถกเถียงเรื่องความถี่และระยะเวลา:
$ _alarm 400 200
speaker-test
กับในใจมันเป็นไปได้ที่จะสร้างเพลงที่เรียบง่ายด้วย ดูเชลล์สคริปต์นี้
timeout ${2} speaker-test --frequency ${1} --test sine
speaker-test -t sine -f 1000 -l 1 & sleep .2 && kill -9 $!
ทำสิ่งเดียวกัน อย่างไรก็ตามวิธีของ @ user569825 นั้นดีกว่า
tput bel
เพราะterminfoกำหนดbel
เป็น
Variable Cap- TCap Description
String name Code
bell bel bl audible signal
(bell) (P)
สำหรับการใช้การ์ดเสียงหากsox
ติดตั้งไว้และลำโพงสำหรับพีซีถ้าไม่ใช่:
$ play -q -n synth 0.1 sin 880 || echo -e "\a"
sox
มีให้สำหรับ distros ส่วนใหญ่
then
บล็อกภายในwatch
เพื่อแจ้งให้ฉันทราบเมื่อพบเงื่อนไขบางประการ แม้แต่ให้ฉันเปิดหูฟังเอาไว้ มันมีประโยชน์มากสำหรับฉัน
sudo -u USER play...
play
ใช้ pulseaudio เป็นผู้ใช้ ฉันเดาว่ามันขึ้นอยู่กับการกำหนดค่าระบบ
บาง distros มีโปรแกรมอรรถประโยชน์บรรทัดคำสั่งเพื่อให้บรรลุนี้ บางทีคุณอาจบอกเราได้ว่าคุณอยู่บน distro หรือค้นหา (เช่นemerge -s beep
ใน gentoo)
นอกเหนือไปจาก utils "ว่าง" คุณสามารถสร้างสคริปต์ Perl ที่ส่งเสียงบี๊บสิ่งที่คุณต้องทำคือ:
<SomeCodeBefore>
print "\007";
<SomeCodeAfter>
หากคุณได้รับ 'beep' ให้ลองทำดังนี้:
#! /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"
ทำงานในทุบตีแทนที่จะเป็นprint "\007
Perl?
printf '\007'
echo
ลอง
echo -n Ctrl+ V Ctrl+G
ข้อเสียคือจะใช้งานได้เฉพาะเมื่ออุปกรณ์เอาต์พุตเป็นเทอร์มินัลดังนั้นจึงอาจไม่ทำงานภายในงาน cron เป็นต้น (แต่ถ้าคุณเป็นรูทคุณอาจเปลี่ยนเส้นทางไป/dev/console
เพื่อส่งเสียงบี๊บได้ทันที)
บน Linux เครื่องมือเช่นbeep
สามารถใช้ ioctl บนอุปกรณ์คอนโซลเพื่อเปล่งเสียงที่กำหนด หากต้องการเฉพาะเจาะจงมากขึ้นbeep
จะใช้KIOCSOUND
ioctl แต่ก็มีKDMKTONE
ioctl ซึ่งสามารถใช้ในการสร้างเสียงได้
ตามที่ฉันเข้าใจมันอดีตจะเริ่มเสียงซึ่งจะคงอยู่จนกว่าจะถูกยกเลิกอย่างชัดเจนในขณะที่เสียงหลังจะสร้างเสียงบี๊บของระยะเวลาที่กำหนดล่วงหน้า ดู(4) หน้าคนสำหรับรายละเอียดconsole_ioctl
ดังนั้นหากคุณไม่พอใจกับสิ่งที่beep
ทำคุณสามารถเขียนโค้ดสองสามบรรทัดเพื่อเข้าถึง ioctls เหล่านี้โดยตรง สมมติว่าคุณมีสิทธิ์เข้าถึงแบบเต็ม/dev/console
ซึ่งอาจต้องใช้สิทธิ์รูท
ในเทอร์มินัลกดCtrl+ Gและจากนั้นEnter