ฉันจะทำให้ลำโพงคอมพิวเตอร์พีซีส่งเสียงบี๊บได้อย่างไร


171

เมื่อใช้ bash ฉันจะสร้างเสียงบี๊บของลำโพงในคอมพิวเตอร์ได้อย่างไร

สิ่งที่ชอบecho 'beepsound' > /dev/pcspkrจะดี



คำตอบ:


124

ฉันมักจะใช้ยูทิลิตี้ตัวเล็ก ๆ ที่beepติดตั้งในหลาย ๆ ระบบ คำสั่งนี้จะลองใช้วิธีการต่าง ๆ ในการสร้างเสียงของระบบ

มี 3 วิธีในการสร้างเสียงจากbeepmanpage:

  1. วิธีการดั้งเดิมของการสร้างเสียงบี๊บในเชลล์สคริปต์คือการเขียนอักขระASCII BEL( \007) ไปยังเอาต์พุตมาตรฐานโดยใช้คำสั่งเชลล์เช่น

    echo -ne '\007'
    

    ใช้งานได้เฉพาะในกรณีที่เอาต์พุตมาตรฐานของเชลล์การโทรถูกส่งไปยังอุปกรณ์ปลายทางในบางประเภทเท่านั้น หากไม่ส่งเสียงบี๊บจะไม่มีเสียงและอาจทำให้เกิดความเสียหายที่ไม่ต้องการในไฟล์ใด ๆ ที่ไฟล์นั้นถูกส่งไปยัง

  2. มีวิธีอื่นที่จะทำให้เกิดเสียงบี๊บ วิธีการที่น่าเชื่อถือมากขึ้นเล็กน้อยคือการเปิด/dev/ttyและส่งตัวละครของคุณที่นั่น สิ่งนี้มีความทนทานต่อการเปลี่ยนทิศทาง I / O แต่ยังคงล้มเหลวในกรณีที่เชลล์สคริปต์ที่ต้องการสร้างเสียงบี๊พนั้นไม่มีเทอร์มินัลการควบคุมยกตัวอย่างเช่นเพราะมันรันจาก X window manager

  3. วิธีที่สามคือการเชื่อมต่อกับจอแสดงผล X ของคุณและส่งคำสั่งระฆัง สิ่งนี้ไม่ได้ขึ้นอยู่กับอุปกรณ์เทอร์มินัล Unix แต่ (แน่นอน) ต้องการการแสดง X

beep จะลองใช้ทั้ง 3 วิธี


9
หน้าแรกไปที่beepคำสั่ง: johnath.com/beep ในอูบุนตู / Debian apt-get install beepคุณสามารถติดตั้งด้วย
Riccardo Murri

14
บน linux มีวิธีที่สี่สำหรับการส่งเสียงบี๊บ: ยกเลิกการโหลดpcspkrโมดูลโหลดsnd-pcspและตอนนี้คุณมีการ์ดเสียง alsa ที่ใช้ลูกเล่นโรงเรียนเก่าในการป้อนเสียงดิจิตอลไปยังลำโพงภายในของคุณ มันให้ผลลัพธ์ที่แย่มากกับลำโพงภายใน piezoelectric แต่สำหรับลำโพงภายในแบบคลาสสิกคุณภาพค่อนข้างดีสำหรับสิ่งที่มันเป็น วิธีนี้คุณจะได้รับมากขึ้นความคิดสร้างสรรค์สำหรับเสียงเตือนของคุณเสียง;)
BatchyX

8
@ isomorphismes: pcspkrและsnd-pcspเป็นโมดูลไม่ใช่แพ็คเกจ ใช้modprobe/ modprobe -r/ lsmodเพื่อจัดการพวกมัน สำหรับข้อมูลของคุณพวกเขาอยู่ในlinux-image-somethingแพ็คเกจซึ่งหวังว่าจะได้รับการติดตั้งแล้ว (หรืออย่างอื่นคุณจะไม่มีเคอร์เนล linux)
BatchyX

3
เสียงบี๊บมักจะออกมาสำหรับเดเบียน แต่ฉันจำเป็นต้องโหลดโมดูลเพื่อใช้กับ Ubuntu
mchid

4
อย่างที่ mchid พูดหลังจากเพิ่มโมดุล: modprobe snd-pcspbeep ก็ทำงานได้แล้ว
lepe

72

เพียงสะท้อน\aหรือ\07ทำงานให้ฉัน

$ echo -e "\a"

นี่อาจจะต้องpcspkrโหลดโมดูลเคอร์เนล ฉันเพิ่งทดสอบสิ่งนี้กับ RHEL ดังนั้น YMMV

UPDATE

เนื่องจาก Warren ชี้ให้เห็นในความคิดเห็นสิ่งนี้อาจไม่ทำงานเมื่อลงชื่อเข้าใช้จากระยะไกลผ่าน SSH วิธีแก้ปัญหาอย่างรวดเร็วคือการเปลี่ยนเส้นทางเอาต์พุตไปยังอุปกรณ์ TTY ใด ๆ (โดยเฉพาะอย่างยิ่งอุปกรณ์ที่ไม่ได้ใช้) เช่น:

$ echo -en "\a" > /dev/tty5

5
หากคุณกำลังใช้เทอร์มินัล X หรือ ssh'd ลงในเครื่องสิ่งนี้อาจทำให้เทอร์มินัลกะพริบเนื่องจากโปรแกรมประเภท xterm / vt100 จำนวนมากได้รับการกำหนดค่าให้ทำเช่นนั้นสำหรับตัวอักษร BEL
Warren Young

2
มันสมเหตุสมผล แต่มันไม่ได้ผลสำหรับฉันบน Ubuntu 12.04
isomorphismes

2
@ isomorphismes: สำหรับคอนโซลไม่ใช่เทอร์มินัล X11 สำหรับเสียงบี๊บที่ต่ำกว่า X คุณอาจลองทำสิ่งนี้: askubuntu.com/a/587311/11015
MestreLion

1
@ isomorphismes: ฉันยังใช้ Ubuntu 12.04 และสำหรับฉันsudo modprobe pcspkrก็เพียงพอที่จะเปิดใช้งานเสียงบี๊บภายใต้ VT ไม่ว่าจะผ่านทางprintf "\a"หรือbeepยูทิลิตี้
MestreLion

3
ไม่มีวิธีใดที่เหมาะกับฉัน Ubuntu 16.04.1 LTS
ar2015

67

หมายเหตุ: การแก้ปัญหานี้ส่งเสียงดังขึ้นจากลำโพงไม่เมนบอร์ด

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กับในใจมันเป็นไปได้ที่จะสร้างเพลงที่เรียบง่ายด้วย ดูเชลล์สคริปต์นี้


1
ฟังก์ชั่นของคุณเป็นหนึ่งซับ (และเข้ากันได้กับ Ctrl-C):timeout ${2} speaker-test --frequency ${1} --test sine
user569825

1
ไม่จำเป็นต้องมีการบันทึก pid ที่แท้จริงเพียงแค่speaker-test -t sine -f 1000 -l 1 & sleep .2 && kill -9 $! ทำสิ่งเดียวกัน อย่างไรก็ตามวิธีของ @ user569825 นั้นดีกว่า
erm3nda


17

สำหรับการใช้การ์ดเสียงหากsoxติดตั้งไว้และลำโพงสำหรับพีซีถ้าไม่ใช่:

$ play -q -n synth 0.1 sin 880 || echo -e "\a"

sox มีให้สำหรับ distros ส่วนใหญ่


2
+1 ฉันไม่ทราบว่าการเล่นมีคุณลักษณะนี้ ฉันลงเอยด้วยการใช้สิ่งนี้ในthenบล็อกภายในwatchเพื่อแจ้งให้ฉันทราบเมื่อพบเงื่อนไขบางประการ แม้แต่ให้ฉันเปิดหูฟังเอาไว้ มันมีประโยชน์มากสำหรับฉัน
andyortlieb

จากการเล่น bash sh อาจจำเป็นต้องมีsudo -u USER play...
intika

ในระบบของฉันplayใช้ pulseaudio เป็นผู้ใช้ ฉันเดาว่ามันขึ้นอยู่กับการกำหนดค่าระบบ
Alexander

13

บาง 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?
Stefan

1
@tefan - ส่งเสียงบี๊บ 'สากล' สวยมาก อย่างไรก็ตามคุณสามารถยังคงเป็นผู้ไม่เชื่อเรื่องพระเจ้า distro โดยใช้ 'echo -e "\ a"' หรือ 'echo -e "\ 07" ไชโย!
Wormintrude

2
มันจะเป็นแบบพกพามากขึ้นเพื่อใช้แทนprintf '\007' echo
Dennis Williamson

3

" ส่งเสียงเตือนจะทำงานเฉพาะในกรณีที่พีซีของคุณมี" ลำโพง " แล็ปท็อป / อุปกรณ์ขนาดเล็กที่ทันสมัยหลายเครื่องไม่มี" - ทรีเดกา

ลองเล่นเสียงแทน:

$ play xxxxx.wav

ทำงานให้ฉันเมื่อทุกอย่างล้มเหลว

อ้างอิง


2

ลอง

echo -n Ctrl+ V Ctrl+G

ข้อเสียคือจะใช้งานได้เฉพาะเมื่ออุปกรณ์เอาต์พุตเป็นเทอร์มินัลดังนั้นจึงอาจไม่ทำงานภายในงาน cron เป็นต้น (แต่ถ้าคุณเป็นรูทคุณอาจเปลี่ยนเส้นทางไป/dev/consoleเพื่อส่งเสียงบี๊บได้ทันที)


1

บน Linux เครื่องมือเช่นbeepสามารถใช้ ioctl บนอุปกรณ์คอนโซลเพื่อเปล่งเสียงที่กำหนด หากต้องการเฉพาะเจาะจงมากขึ้นbeepจะใช้KIOCSOUNDioctl แต่ก็มีKDMKTONEioctl ซึ่งสามารถใช้ในการสร้างเสียงได้

ตามที่ฉันเข้าใจมันอดีตจะเริ่มเสียงซึ่งจะคงอยู่จนกว่าจะถูกยกเลิกอย่างชัดเจนในขณะที่เสียงหลังจะสร้างเสียงบี๊บของระยะเวลาที่กำหนดล่วงหน้า ดู(4) หน้าคนสำหรับรายละเอียดconsole_ioctl

ดังนั้นหากคุณไม่พอใจกับสิ่งที่beepทำคุณสามารถเขียนโค้ดสองสามบรรทัดเพื่อเข้าถึง ioctls เหล่านี้โดยตรง สมมติว่าคุณมีสิทธิ์เข้าถึงแบบเต็ม/dev/consoleซึ่งอาจต้องใช้สิทธิ์รูท


-1

ในเทอร์มินัลกดCtrl+ Gและจากนั้นEnter


1
ในเทอร์มินัลของฉัน (gnome-terminal) มันทำงานได้โดยไม่ต้องกด Enter เหมือนกับการทดสอบลำโพง PC มันดูดีสำหรับฉัน แม้ว่ามันจะไร้ประโยชน์อย่างเต็มที่ในสคริปต์
Palec

downvotes ที่น่าแปลกใจ สิ่งนี้ใช้ได้กับพีซีบางเครื่อง แต่อาจใช้งานไม่ได้กับทุกเครื่อง
Zzzach ...

มันใช้งานไม่ได้กับ rxvt, urxvt, xterm, lxterm หรือ lxterminal อย่างน้อยที่สุดเทอร์มินัลของฉันก็ควรจะกระพริบอย่างน้อยถ้ามันมีกระดิ่งภาพ?
วิลเล็ม

มันใช้งานได้กับ xterm
Chris
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.