シェルスクリプト:入力をバックグラウンドプロセスに送信します。

シェルスクリプト:入力をバックグラウンドプロセスに送信します。

次のスクリプトを使用してフォルダを監視しており、サイズが変更され、ファイルが存在しない場合はスクリプトが実行されます。

#!/usr/bin/sh
SCRIPT="dim_import/xdir"

while true;
do
    size=$(du -s dim_import | cut -b 1-2)
    if [ $size -gt 32 ]; then
        if [ ! -f files ]; then
          $SCRIPT
        fi
    fi
    sleep 2
done

私はそうスクリプトを実行します。

>watcher &

問題は、ウォッチャーで実行されるスクリプトに入力が必要であることです。プロンプトをエコーし​​ますが、入力はそのスクリプトではなく現在のシェルに送信されます。したがって、1234を入力すると、次のような結果が得られます。

sh: 1234:  not found.

入力が正しい場所に送信されているかどうかを確認できますか?

私はいろいろな方法を試しましたが、私がするユニークな方法のためにそれらの何も動作しないようです。また、より良いアプローチ/解決方法で開いています。スクリプトは、パラメーターに送信する入力を処理することもできます。

編集:62918と同じ番号を送信しようとしています。

編集:これを行うこともできますが、同じエラーが発生します。

    SCRIPT="dim_import/xdir"

    while true;
    do
        size=$(du -s dim_import | cut -b 1-2)
        if [ $size -gt 32 ]; then
            if [ ! -f files ]; then
              echo "SR Number: "; read srNum
              $SCRIPT $srNum
            fi
        fi
        sleep 2
    done

メモ:私はBashを使用しません。私はShを使用しています。

ベストアンサー1

さて、実際の質問は、実際にスクリプトにどのような入力を送信したいのかということです。空の入力が必要な場合は、次を実行します。

$SCRIPT < /dev/null

$sizeの内容などの特定の入力を提供するには、次のようにします。

echo "$size" | $SCRIPT

入力を入力するには、入力を入力するために前景に戻し、バックグラウンドに戻す必要があります。これを行う能力は、シェルにジョブ制御機能があるかどうかによって異なります(ほとんどはありますが、元のBourneシェルにはありません)。以下を行います。

  • 実行するfg %watcherfg %1(実行後に表示されるジョブ番号を使用してjobs -l)プロセスをフォアグラウンドにインポートします。
  • 必要な内容を入力してEnterを押します。
  • Ctrl-Zと入力してバックグラウンドに戻ります(または停止文字が何であるかを確認するstty -aために使用してチェックします)。susp
  • bg %1Ctrl-Z(または任意の数字)を押してプログラムを停止し、バックグラウンドに戻ります。

もう一つの答えは、名前付きパイプを使用することです。例は次のとおりです(tr表示にスクリプトの代わりに使用されます)。

$ mkfifo my_fifo
$ tr a-z A-Z < my_fifo &
$ exec 6> my_fifo
$ echo here is some input for the fifo >&6
$ HERE IS SOME INPUT FOR THE FIFO

まず、スクリプトを実行してfifoから入力を受け取ります(最初にスクリプトを実行することが重要です)。次に、exec 6> ...シェルのファイル記述子6をfifoに書き込みます。次に、出力を送信したいときはいつでも(経由で>&6)ファイル記述子6に書き込みます。最後の「HERE IS...」は私が入力したものではなく、単にtrの出力です。

おすすめ記事