프로세스가 완료되면 소리를내는 방법?


94

터미널을 통해 긴 프로세스를 시작했습니다. 프로세스가 완료되면 우분투 터미널에서 소리를 내도록 할 수 있습니까? 이렇게하면 계속 확인하지 않아도되지만 대신 소리로 알려줍니다.


프로세스 완료를 통해 무엇을 의미하는지 자세히 설명 할 수 있습니까 ?
Lucio

1
@Lucio 제어 단자로 다시 리턴
Goaler444

1
터미널에서 응용 프로그램을 열고 완료되면 소리를 내 시나요? Ubuntu 서버가 있거나 GUI 소프트웨어를 의미합니까?
Lucio

2
네 맞습니다. 예를 들어 명령 줄 프로그램을 시작하고 종료되고 제어권이 다시 터미널로 돌아 가면 소리가납니다. 저는 현재 우분투 12.10 사용하고
Goaler444

답변:


78

긴 프로세스를 위해 호출 할 수있는 스크립트 끝에 적합한 명령을 넣어서이를 수행하기위한 명령 행 방법은 최소한 세 가지가 있습니다.

  1. 소리를 재생하는 "고전적인"방법 은 PC 스피커를 통해 경고음 을 사용하는 것입니다 경고음 설치. 그러나 이것은 모든 경우에 작동하지 않습니다 (예 : 시스템 PC 스피커가 완전히 비활성화 된 경우). pscpkr을 제거 /etc/modprobe/blacklist.conf하고 pcspkr커널 모듈을 로드해야 합니다.

    sudo sed -i 's/blacklist pcspkr/#blacklist pcspkr/g' /etc/modprobe.d/blacklist.conf
    sudo modprobe pcspkr
    beep [optional parameters]
    
  2. aplay를 사용하여 모든 사운드 파일을 wav 형식으로 재생할 수도 있습니다 (기본적으로 설치됨).

    aplay /usr/share/sounds/alsa/Side_Right.wav
    
  3. 또 다른 방법은 pulseaudio 명령 행 인터페이스를 사용하여 시스템 (에서 libsndfile)이 기본 오디오 출력 에서 인식하는 모든 사운드 파일을 재생할 수 있도록하는 것입니다 .

     paplay /usr/share/sounds/freedesktop/stereo/complete.oga
    

    의 기본 사운드 파일 /usr/share/sounds/이나 다른 위치에있는 다른 사운드 파일을 사용할 수 있습니다.


언급했듯이 우분투 <= 12.04에 기본적으로 설치되는 espeak 를 잘못 사용하여이를 달성하는 또 다른 좋은 방법이 있습니다. 다음 예를 보거나 듣습니다.

#! /bin/bash

c=10; while [ $c -ge 0 ]; do espeak $c; let c--; done; sleep 1 ## here lengthy code
espeak "We are done with counting"

우분투에서> = 12.10 Orca는 발언 디스패처를 사용합니다. 그런 다음 espeak 를 설치 espeak 설치하거나 대신 사용할 수 있습니다 spd-say "Text".


1
@Takkat Ubuntu 12.10을 사용하고 있으며 espeak 가 현재 설치되어 있지 않습니다.
Lucio

@Lucio : 그렇습니다. 이제 당신은 그것을 말하고 있습니다 ... 그들은 말하기 디스패처로 전환했습니다. 이것이 작동하면 (시스템에없는 경우)에 대한 편집을 참조하십시오 spd-say.
Takkat

@Takkat이 spd-say유틸리티는 기본적으로 설치되며 내 시스템에서 작동합니다.
Lucio

또한이 Q / A를
c0rp

1
나는 성공을 거두었 다paplay /usr/share/sounds/freedesktop/stereo/complete.oga
Nicholas DiPiazza

73

나는 사용한다

make; spd-say done

"make"를 장기 실행 명령으로 바꾸십시오.


오늘은 진짜 너 덕분이다!! : D
n0noob

5
spd-say 'get back to work'. 그리고 미리 설치되어 있습니다 : releases.ubuntu.com/trusty/… , 내가 생각하는 맹인을 위해? 그리고 -w무한 루프의 경우 : while true; do spd-say -w 'get back to work you lazy bum'; done.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

내가해야 할 것보다 더 열심히 웃었다.
NelsonGon

15

TL; DR

명령이 완료된 후 소리를 재생하려면

long-running-command; sn3

(단 sn3에 넣고 사운드 수가 3 인) .bashrc:

sound() {
  # plays sounds in sequence and waits for them to finish
  for s in $@; do
    paplay $s
  done
}
sn1() {
  sound /usr/share/sounds/ubuntu/stereo/dialog-information.ogg
}
sn2() {
  sound /usr/share/sounds/freedesktop/stereo/complete.oga
}
sn3() {
  sound /usr/share/sounds/freedesktop/stereo/suspend-error.oga
}

또는 더 많은 옵션을 보려면 아래를 읽으십시오.

오류와 성공에 대한 다른 소리

다음은 내가 정확히 요구하는 것에 사용하는 것입니다. 단 하나의 차이점이 있습니다. 명령이 완료되면 소리를 재생하지만 성공과 오류에 따라 다른 소리를 재생합니다 . 그러나 마음에 들지 않으면 변경할 수 있습니다.

oks장기 실행 명령 끝에 사용 하는 Bash 함수가 있습니다 .

make && make test && make install; oks

이전 명령이 완료되면 소리가 나고 OK 또는 ERROR (오류 코드 포함)가 표시됩니다.

소스 코드

다음은 두 명의 도우미가있는 기능입니다.

sound() {
  # plays sounds in sequence and waits for them to finish
  for s in $@; do
    paplay $s
  done
}
soundbg() {
  # plays all sounds at the same time in the background
  for s in $@; do
    # you may need to change 0 to 1 or something else:
    pacmd play-file $s 0 >/dev/null
  done
}
oks() {
  # like ok but with sounds
  s=$?
  sound_ok=/usr/share/sounds/ubuntu/stereo/dialog-information.ogg
  sound_error=/usr/share/sounds/ubuntu/stereo/dialog-warning.ogg
  if [[ $s = 0 ]]; then
    echo OK
    soundbg $sound_ok
  else
    echo ERROR: $s
    soundbg $sound_error
  fi
}

설치

~ / .bashrc에 직접 넣거나 다른 파일에 넣고 ~ / .bashrc에 다음 줄을 넣을 수 있습니다.

. ~/path/to/file/with/function

구성

변경 sound_oksound_error다른 소리.

당신은 실험 할 수 soundsoundbg변화 sound_ok하고 sound_error당신이 원하는 결과를 얻기 위해 같은 많은 소리의 시퀀스를 사용 할 수 있습니다.

좋은 소리

시스템에서 좋은 소리를 찾으려면 다음을 시도하십시오.

for i in /usr/share/sounds/*/stereo/*; do echo $i; paplay $i; sleep 1; done

다음은 기본적으로 우분투에서 기본적으로 제공되는 알림에 적합한 몇 가지 소리입니다. sn1은 크고 훌륭합니다. sn2는 매우 크고 여전히 훌륭합니다.

sn1() {
  sound /usr/share/sounds/ubuntu/stereo/dialog-information.ogg
}
sn2() {
  sound /usr/share/sounds/freedesktop/stereo/complete.oga
}
sn3() {
  sound /usr/share/sounds/freedesktop/stereo/suspend-error.oga
}

다시 말하지만, 사운드가 끝날 때까지 기다리지 않고 백그라운드에서 재생 하려면 sound로 변경할 수 있습니다 soundbg(예 : 많은 사운드를 재생할 때 스크립트 속도를 늦추지 않기 위해).

무음 버전

그리고 경우에 따라- oks소리가없는 것과 동일한 기능 이 있습니다.

ok() {
  # prints OK or ERROR and exit status of previous command
  s=$?
  if [[ $s = 0 ]]; then
    echo OK
  else
    echo ERROR: $s
  fi
}

용법

사용 방법은 다음과 같습니다.

성공 사례 :

ls / && ls /bin && ls /usr; oks

오류가있는 예 :

ls / && ls /bim && ls /usr; oks

물론 실제로 명령은 다음과 같습니다.

make && make test && make install; oks

그러나 나는 ls그것이 어떻게 작동하는지 빨리 볼 수 있도록 사용 했습니다.

자동 버전 ok대신 사용할 수 있습니다 oks.

또는 다음과 같이 사용할 수 있습니다.

ls / && ls /bim && ls /usr; ok; sn1

OK / ERROR를 인쇄하되 항상 같은 소리를냅니다.

최신 정보

해당 기능을 GitHub에 추가했습니다.

소스는 다음에서 다운로드 할 수 있습니다.

업데이트 2

soundloop위의 repo에 기능을 추가했습니다 . 주석에서 shadi의while true; do paplay file.ogg; done 요청에 따라 소리를 재생하고 Ctrl + C (단순히 작동하지만 작동하지 않는 것과 달리)에 의해 중단 될 수 있습니다 . 다음과 같이 구현됩니다.

soundloop() {
  set +m
  a=`date +%s`
  { paplay $1 & } 2>/dev/null
  wait
  b=`date +%s`
  d=$(($b-$a))
  [ $d -eq 0 ] && d=1
  while :; do
    pacmd play-file $1 0 >/dev/null
    sleep $d
  done
}

복잡하다고 생각되면 불만 사항을 PulseAudio 개발자에게 알려주십시오.


내가 while true; do paplay ...; done때까지 소리가 반복되도록 이것을 넣으려고 Ctrl+C했지만 그럴 때 깨지지 않습니다. man paplay이 작업을 수행하는 방법을 알아낼 수있는 특별한 옵션을 찾을 수 없습니다 . 어떤 아이디어?
shadi

@shadi Ctrl + C를 누를 때까지 반복되는 소리가 나는 솔루션에 대한 업데이트 된 답변을 참조하십시오.
rsp

14

에 따르면 \a 문자는 컴퓨터의 경고음입니다 ASCII 코드 (7), 이스케이프합니다.

따라서 echo $'\a'로컬 컴퓨터에서 PuTTY와 같은 터미널 인터페이스를 통해 연결된 컴퓨터에서 실행되는 bash 쉘에서 실행될 때도 경고음이 울립니다.


3
놀랄 만한! 타사 응용 프로그램을 설치할 필요가 없으며 명령 프롬프트가 초점을 맞춘 후에 프로세스 중간에 입력하거나 붙여 넣을 수도 있기 때문에 가장 쉽고 최상의 솔루션입니다.
hlopetz

2
이 캐릭터의 사운드는 대부분의 현대 터미널에서 기본적으로 비활성화되어 있습니다
phil294

6

Michael Curries의 답변을 확장하여 다음을 통해 Bash를 BEL( \a) 문자로 만들 수 있습니다 PROMPT_COMMAND.

PROMPT_COMMAND='printf \\a'

PROMPT_COMMAND이 방법을 설정 하면 printf \\a각 명령이 끝날 때마다 Bash가 실행 되어 터미널이 소리를 재생합니다 (muru가 지적하더라도 프롬프트의 다시 그리기를 트리거하면 터미널이 소리를 재생합니다. 즉 소리가 재생됩니다) 예를 들어 ENTER) 만해도 새 프롬프트가 표시 될 때마다

이것은 터미널 기능이므로 모든 터미널에서 작동하지 않을 수 있습니다. 예를 들어 콘솔에서 작동하지 않습니다 (그러나 작동합니다 gnome-terminalxterm).


5
(Enter를 누를 때마다 소리가납니다.)
muru


2

이것은 당신이 요구 한 것이 아니지만 그것에 대한 알림을 사용할 수 있습니다.

다른 답변에서 주어진 명령을

notify-send "Process terminated" "Come back to the terminal, the task is over"

1
command && (say done ; echo done) || (echo error ; say error)

예 1 : echo alik && (say done ; echo done) || (echo error ; say error)단어가 완성됩니다.

예 2 : non_existing_command_error && (say done ; echo done) || (echo error ; say error)오류 단어가 발생합니다.

* 요구 사항 gnustep-gui-runtime-

sudo apt-get install gnustep-gui-runtime

건배.


0

나는 소리를 재생하고 우분투를위한 주어진 메시지와 시간 ( Gist ) 으로 알림을 표시하는 간단하고 거의 네이티브 스크립트를 만들었습니다 .

#!/bin/sh

# https://gist.github.com/John-Almardeny/04fb95eeb969aa46f031457c7815b07d
# Create a Notification With Sound with a Given Message and Time
# The Downloaded Sound is from Notification Sounds https://notificationsounds.com/

MSSG="$1"
TIME="$2"

# install wget if not found
if ! [ -x "$(command -v wget)" ]; then 
    echo -e "INSTALLING WGET...\n\n"
    sudo apt-get install wget
    echo -e "\n\n"
fi

# install at package if not found
if ! [ -x "$(command -v at)" ]; then
    echo -e "INSTALLING AT...\n\n"
    sudo apt-get install at
    echo -e "\n\n"
fi

# install sox if not found
if ! [ -x "$(command -v sox)" ]; then
    echo -e "INSTALLING SOX...\n\n"
    sudo apt-get install sox
    sudo apt-get install sox libsox-fmt-all
    echo -e "\n\n"
fi

# download the noti sound if this is first time
# add alias to the bashrc file
if ! [ -f ~/noti/sound.mp3 ]; then
    echo -e "DOWNLOADING SOUND...\n\n"
    touch ~/noti/sound.mp3 | wget -O ~/noti/sound.mp3 "https://notificationsounds.com/wake-up-tones/rise-and-shine-342/download/mp3"
    sudo echo "alias noti=\"sh ~/noti/noti.sh\"" >> ~/.bashrc
    source ~/.bashrc        
    echo -e "\n\n"
fi

# notify with the sound playing and particular given message and time
echo "notify-send \""$MSSG\"" && play ~/noti/sound.mp3" | at $TIME

사용하는 방법?

첫 실행-설정 :

  1. 집에서 새 디렉토리를 만들어 전화 noti

    mkdir ~/noti
    
  2. noti.sh를 다운로드 하여 위의 noti디렉토리로 추출하십시오 .

  3. 터미널을 열고 디렉토리를 noti

    cd ~/noti
    
  4. 다음을 실행하여 noti.sh를 실행 가능하게하십시오.

    sudo chmod +x noti.sh
    
  5. 다음과 같이 테스트를 실행하십시오.

    sh ~/noti/noti.sh "Test" "now"
    

noti "Hello From Noti" "now +1 minute"
noti "Hello From Noti" "now +5 minutes"
noti "Hello From Noti" "now + 1 hour"
noti "Hello From Noti" "now + 2 days"
noti "Hello From Noti" "4 PM + 2 days"
noti "Hello From Noti" "now + 3 weeks"
noti "Hello From Noti" "now + 4 months"
noti "Hello From Noti" "4:00 PM"
noti "Hello From Noti" "2:30 AM tomorrow"
noti "Hello From Noti" "2:30 PM Fri"
noti "Hello From Noti" "2:30 PM 25.07.18"

프로세스 완료 알림 (예)

sudo apt-get update; noti "Done" "now"

0

ffmpeg 사인파

미니멀리스트의 경우 5 초 동안 1000Hz 사인을 재생할 수 있습니다.

sudo apt-get install ffmpeg
ffplay -f lavfi -i "sine=frequency=1000:duration=5" -autoexit -nodisp

또는 Ctrl-C를 할 때까지 영원히 :

ffplay -f lavfi -i "sine=frequency=1000" -nodisp

자세한 내용은 https://stackoverflow.com/questions/5109038/linux-sine-wave-audio-generator/57610684#57610684

우분투 18.04에서 테스트, ffmpeg 3.4.6.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.