プロセスが完了したら音を出す方法は?


94

私はターミナルを介して長いプロセスを開始しました。プロセスが完了したら、Ubuntuターミナルで音を出すことは可能ですか?このように、チェックを続ける必要はありませんが、代わりに音で通知されます。


プロセス完了とはどういう意味ですか?
ルシオ

1
@Lucioコントロールがターミナルに戻される
Goaler444

1
ターミナルからアプリケーションを開き、終了したら音を出しますか?Ubuntuサーバーをお持ちですか、それともGUIソフトウェアですか?
ルシオ

2
はい、正確に。たとえば、コマンドラインプログラムを起動し、終了して制御が端末に戻されると、音が鳴ります。現在、Ubuntu 12.10
Goaler444

回答:


78

長いプロセスのために呼び出すことができるスクリプトの最後に適切なコマンドを配置することにより、これを達成するためのコマンドラインの方法が少なくとも3つあります。

  1. サウンドを再生する「古典的な」方法は 、PCスピーカーからビープ音 を使用することビープ音をインストールするです。ただし、これはすべての場合に機能するわけではありません(たとえば、私のシステムのPCスピーカーは完全に無効になっています)。pscpkrを削除し/etc/modprobe/blacklist.confpcspkrカーネルモジュールをロードする必要があります。

    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. もう1つの方法は、pulseaudioコマンドラインインターフェイスを使用して、システム(でlibsndfile)が既定のオーディオ出力で認識するサウンドファイルの再生を有効にすることです。

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

    のデフォルトのサウンドファイル/usr/share/sounds/、または別の場所にあるその他のサウンドファイルを使用できます。


言及しただけで、Ubuntu <= 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"

Ubuntu> = 12.10では、Orcaはspeak-dispatcherを使用します。espeak をインストールするespeakをインストール、代わりにを使用しますspd-say "Text"


1
@Takkat Ubuntu 12.10を使用していますが、espeakは現在インストールされていません。
ルシオ

@Lucio:ええ、あなたはそれを言ったので...彼らは話し合いディスパッチャに切り替えました。これが機能する場合(私のシステムでは機能しません)を使用して編集を参照してspd-sayください
Takkat

@Takkat spd-sayユーティリティはデフォルトでインストールされ、システム上で動作します。
ルシオ

また、これに見てとるQ / A
c0rp

1
私は大成功を収めましたpaplay /usr/share/sounds/freedesktop/stereo/complete.oga
ニコラスディピアッツ

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
}

または、以下のオプションをご覧ください。

エラーと成功時に異なる音

ここに、私があなたが求めるものに正確に使用するものがあります-1つの違いは、コマンドが終了したときにサウンドを再生するだけでなく、成功時とエラー時に異なるサウンドを再生することです。(ただし、気に入らない場合は変更できます。)

oks実行時間の長いコマンドの最後に使用するBash関数があります。

make && make test && make install; oks

前のコマンドが終了すると、サウンドが再生され、OKまたはERROR(エラーコード付き)が表示されます。

ソースコード

次に、2つのヘルパーを持つ関数を示します。

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ます。

soundvs. soundbgを試して、変更しsound_oksound_error好みの結果を得るために好きな多くのサウンドのシーケンスを使用することができます。

いい音

システムで良いサウンドを見つけるには、次を試してください。

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

以下に、通知に適したデフォルトでUbuntuで利用できるよく使用するサウンドをいくつか示します。sn1は大きくていい、sn2は非常に大きくてまだいい、sn3は非常に大きくてあまり良くない:

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上記のレポに機能を追加しました。コメントでshadiwhile 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

マイケル・カリーズの答えを拡張すると、次の方法でBashをBEL\a)キャラクターに印刷できますPROMPT_COMMAND

PROMPT_COMMAND='printf \\a'

PROMPT_COMMANDこの方法を設定するprintf \\aと、各コマンドの最後にBashが実行され、端末がサウンドを再生します(muruが指摘しているように、プロンプトの再描画をトリガーするだけでターミナルがサウンドを再生します。つまり、サウンドが再生されます。新しいプロンプトが描画されるたびに(たとえば、単にヒットした場合でもENTER)。

これは端末機能であるため、すべての端末で機能するとは限りません。たとえば、コンソールでは機能しません(ただし、gnome-terminalおよび で機能するはずですxterm)。


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

サウンドを再生し、Ubuntu(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サイン波

ミニマリストのために、1000 Hzのサインを5秒間演奏できます。

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

Ubuntu 18.04、ffmpeg 3.4.6でテスト済み。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.