เมื่อใช้ bash ฉันจะสร้างเสียงบี๊บของลำโพงในคอมพิวเตอร์ได้อย่างไร
สิ่งที่ชอบecho 'beepsound' > /dev/pcspkrจะดี
เมื่อใช้ bash ฉันจะสร้างเสียงบี๊บของลำโพงในคอมพิวเตอร์ได้อย่างไร
สิ่งที่ชอบecho 'beepsound' > /dev/pcspkrจะดี
คำตอบ:
ฉันมักจะใช้ยูทิลิตี้ตัวเล็ก ๆ ที่beepติดตั้งในหลาย ๆ ระบบ คำสั่งนี้จะลองใช้วิธีการต่าง ๆ ในการสร้างเสียงของระบบ
มี 3 วิธีในการสร้างเสียงจากbeepmanpage:
วิธีการดั้งเดิมของการสร้างเสียงบี๊บในเชลล์สคริปต์คือการเขียนอักขระ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-pcspbeep ก็ทำงานได้แล้ว
เพียงสะท้อน\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 "\007Perl?
printf '\007' echo
ลอง
echo -n Ctrl+ V Ctrl+G
ข้อเสียคือจะใช้งานได้เฉพาะเมื่ออุปกรณ์เอาต์พุตเป็นเทอร์มินัลดังนั้นจึงอาจไม่ทำงานภายในงาน cron เป็นต้น (แต่ถ้าคุณเป็นรูทคุณอาจเปลี่ยนเส้นทางไป/dev/consoleเพื่อส่งเสียงบี๊บได้ทันที)
บน Linux เครื่องมือเช่นbeepสามารถใช้ ioctl บนอุปกรณ์คอนโซลเพื่อเปล่งเสียงที่กำหนด หากต้องการเฉพาะเจาะจงมากขึ้นbeepจะใช้KIOCSOUNDioctl แต่ก็มีKDMKTONEioctl ซึ่งสามารถใช้ในการสร้างเสียงได้
ตามที่ฉันเข้าใจมันอดีตจะเริ่มเสียงซึ่งจะคงอยู่จนกว่าจะถูกยกเลิกอย่างชัดเจนในขณะที่เสียงหลังจะสร้างเสียงบี๊บของระยะเวลาที่กำหนดล่วงหน้า ดู(4) หน้าคนสำหรับรายละเอียดconsole_ioctl
ดังนั้นหากคุณไม่พอใจกับสิ่งที่beepทำคุณสามารถเขียนโค้ดสองสามบรรทัดเพื่อเข้าถึง ioctls เหล่านี้โดยตรง สมมติว่าคุณมีสิทธิ์เข้าถึงแบบเต็ม/dev/consoleซึ่งอาจต้องใช้สิทธิ์รูท
ในเทอร์มินัลกดCtrl+ Gและจากนั้นEnter