2017-11-02 21 views
0

私はBashのスクリプトでは新しく、私がしたいのは、プロセスを永久に実行して(つまりGulp)、それが行をスクリーニングするために印刷するときに停止させることです。Bashスクリプト、行が印刷されたときにプロセスが永久に実行されないようにする

私の場合、Gulpを起動すると何千もの行が印刷されます(約20秒かかります)。

cd ~/mydir 
gulp serve & 
while read -r line; do 
    if [ "$line"=="[Browsersync] Serving files from: src" ]; then 
    echo 'pid of Gulp before killing it is : ' `pidof gulp` 
    # Get its PID 
    PID=$! 
    kill -INT $PID 
    echo 'pid of Gulp now is : ' `pidof gulp` 
    fi 
done 

しかし、これはゴクゴクプロセスを停止しません:それは印刷し、最後の行は、私は、このスクリプトで自分の目標に到達しようとした

[Browsersync] Serving files from: src 

常に

です。私は間違っているの?

EDIT:これはスクリプト全体の一部です。

+0

[ "$ライン" = "[Browsersync]からファイルをサービング:SRC"]場合は、それが仕事doesntの。 ["$ line" = "[Browsersync]からのファイルの提供:src"]; どちらか – Diego

答えて

1

バックグラウンド実行プログラムの出力をreadの入力と接続する必要があります。コマンドが&制御オペレータで停止させたかのようにコプロセスは、サブシェルで非同期に実行される

を持つ:

それを行うための最も簡単な方法は、bashcoprocessとしてそれを実行することです実行シェルとコプロセッサーの間に確立された双方向パイプ。 COPROC_PID

あなたのコマンドの標準出力( gulp serveが) COPROC[0]でファイルディスクリプタに( COPROC配列の最初の要素)を利用できるようになります

、およびPID。例えば

#!/bin/bash 
coproc gulp serve 
while IFS= read -r line; do 
    if [ "$line" == "[Browsersync] Serving files from: src" ]; then 
     kill -INT "$COPROC_PID" 
    fi 
done <&"${COPROC[0]}" 
+0

私はこの解決策を試しましたが、私はギャルプサーブが開始されるとすぐに停止すると思っています。それとも正常な行動ですか? – Diego

+0

whileとifの間にecho "$ line"を追加して、gulpからの出力を参照してください。たぶん、何も印刷せずに正常に終了するかもしれません。 – randomir

+1

あなたは正しいです! Gulpの出力はまさに期待どおりです、おかげさまで助けてください! – Diego

関連する問題