私は数千行のBashスクリプトを持っていますが、各行には1つのffmpeg
コマンドが含まれています。私はこれを始めて、source script
素晴らしく運営されています。
ただし、このスクリプトをさまざまな方法で制御しようとすると、状況は完全に間違っています。
Ctrl + Z
すべて一時停止すると現在のffmpeg
一時停止コマンドとNextここに行く!私が欲しいものではありません!- すべてを停止すると、
Ctrl + C
スクリプトは次のffmpeg
コマンドに移動し、最終的にすべてを停止するには、スクリプトの各行に1回押す必要があります。純粋な地獄。 ps -ef
別のシェルで一時停止/終了するコマンドを見つけようとしましたが、source
リストには存在しません。
それでは、私が望む方法で親スクリプトを一時停止/停止するにはどうすればよいですか?または、スクリプトを適切に制御できるようにスクリプトを異なる方法で実行するにはどうすればよいですか?
答え1
スクリプトをインポートするのではなく、スクリプトをスクリプトとして実行してみてください。
$ bash <scriptname>
答え2
問題は、-sent-シグナルffmpeg
をキャプチャしますが、シグナルがそのシグナルにも使用されているかどうかわからないため、bashでは無視されることです。SIGINT
Ctrl+C
この問題を解決する1つの方法は罠スクリプトからシグナルを取得し、ローカルで処理します。
たとえば、ファイルの先頭にトラップを追加するには、コマンドを使用します。次に実行可能にし、次のいずれかを実行して実行します$ bash script_file
。いいえsource
:
trap 'exit' INT
メッセージとメッセージで終わるもう少しエキゾチックな回線終了ステータス130:
trap 'printf "Received SIGINT: Terminating.\n";exit 130' INT
それから:
$ ./file_with_commands
または調達キラースクリプト:
#!/bin/bash
trap 'printf "Received SIGINT: Terminating.\n";exit 130' INT
source "$1"
それから:
$ ./sourcetrap file_with_commands
簡単なサンプルスクリプトは次のとおりです。
#!/bin/bash
if [[ $1 = trap ]]; then
trap 'printf "Received SIGINT: Terminating.\n";exit 130' INT
fi
ping localhost
ping localhost
ping localhost
- トラップなしで実行:
./script_name
- トラップ付き:
./script_name trap
その後、Ctrl+C違いを目撃してください。
それではもう一度やらないでください。source
これらのスクリプトは端末プロンプトで提供されます。