bash ファイルを起動すると、ターミナル内では正常に実行されますが、最初のコマンドの後に「終了しました」というメッセージが表示されて終了します。

bash ファイルを起動すると、ターミナル内では正常に実行されますが、最初のコマンドの後に「終了しました」というメッセージが表示されて終了します。

私は Ubuntu 22.04 プラットフォームを使用しています。C で簡単なプッシュ ボタン GUI を作成しt2s~/.local/binそのパスをPATH環境変数に追加して配置しました。ボタンを押している間、マイクからの音声が一時ファイルに録音されます。ボタンを放すと GUI が終了します。ターミナル内で適切に機能する次の行を実行します。

 t2s && notify-send -u normal  -t 10000 "$( whispercpp -m /home/****/Desktop/2022-10/whisper.cpp/models/ggml-small.bin -nt -l tr -f /dev/shm/mic.wav )"

音声は音声テキストエンジンに送信されwhispercpp、文字起こしされます。結果は画面上の通知に表示されます。

しかし、その行をファイルに配置して起動すると、次のようになります。

 #!/bin/bash

 t2s && notify-send -u normal  -t 10000 "$( whispercpp -m /home/****/Desktop/2022-10/whisper.cpp/models/ggml-small.bin -nt -l tr -f /dev/shm/mic.wav )"

 exit 0

GUIボタンのみを実行し、ボタンを離した後にGUIを終了すると実行されません。

 notify-send -u normal  -t 10000 "$( whispercpp -m /home/****/Desktop/2022-10/whisper.cpp/models/ggml-small.bin -nt -l tr -f /dev/shm/mic.wav )"

一部

何が間違っているのでしょうか?

編集:

次のようにも試してみました:

#!/bin/bash

t2s
TEXT=$( whispercpp -m /home/****/Desktop/2022-10/whisper.cpp/models/ggml-small.bin -nt -l tr -f /dev/shm/mic.wav )"
notify-send -u normal  -t 10000 $TEXT

何も変わっていません。

編集:

シェルの内部に関連していることに気づきました。

どうやって克服すればいいのかまだ分からない。

答え1

以下のリンクを読んでください:

ffmpeg内で実行された行の終了によりGUI button、GUI の後に bash シェルが終了することがわかりましたt2s。ブロック内でチャット アップSIGINTSIGTERMシグナルを行いtrap、その後に残りのコマンドを配置することで問題を回避しましたt2s

#!/bin/bash

trap_with_arg() { # from https://stackoverflow.com/a/2183063/804678
  local func="$1"; shift
  for sig in "$@"; do
    trap "$func $sig" "$sig"
  done
}

stop() {
  trap - SIGINT EXIT
  printf '\n%s\n' "received $1, killing child processes"
  notify-send -u normal  -t 10000 "$(whispercpp -m /home/**/Desktop/2022-10/whisper.cpp/models/ggml-small.bin -nt -l tr -f /dev/shm/mic.wav )"
  kill -s SIGINT 0
}

trap_with_arg 'stop' EXIT SIGINT SIGTERM SIGHUP

t2s

exit 0

関連情報