Bashスクリプトの名前付きパイプ

Bashスクリプトの名前付きパイプ

信号()を実験するCプログラムがあります./signal。標準入力を処理してaを読み取ると終了し、'q'信号に応答します。

名前付きパイプ(fifo)を使用してbashスクリプトでテストしたいと思います。現在私はこれを持っています:

#!/bin/bash

rm mypipe
mkfifo mypipe

./signal <> mypipe &

echo f > mypipe
echo hello
echo f > mypipe
echo q > mypipe

rm mypipe

これを実行すると、プログラムの期待される出力が表示されますが、echo hello入力に対するプログラムの2つの応答の間に出力は表示されません'f'

修正する

申し訳ありません。以前のバージョンを貼り付けました。アンパサンドはここにあります。./signal <> mypipe &上記のコードを修正しました。

アップデート2

roaimaが提案したようにandを追加しましたが、wait何も変更されませんでした。私も試してみましたが、結果は同じでした。-fexit 0./signal < mypipe &

ベストアンサー1

&バックグラウンドでコマンドを実行するようにシェルに指示します。あなたのスクリプトはmkfifo mypipeパイプデバイスを作成するためにバックグラウンドで実行されますが、これは私にとって無意味に見えますが、バックグラウンド./signal <> mypipeでは実行されません。このCプログラムが分岐して親プログラムがすぐに返されることを許可しない限り、スクリプトが続行するのを防ぎ、終了するechoまで後続のコマンドに到達しません。signal

#!/bin/bash

# Create the pipe
rm -f mypipe
mkfifo mypipe

# Run the application in the background
./signal <> mypipe &

# Apply tests
echo f > mypipe
echo hello
echo f > mypipe
echo q > mypipe

# Wait for the application to terminate (a no-op if it's already gone)
wait

# Tidy up
rm -f mypipe
exit 0

プログラム(およびこの修正プログラム)はFIFOから読み取られないため、signalアプリケーションがパイプに書き込むとブロックされる可能性があります。

テストツールが期待どおりに機能しない場合は、デバッグを有効にしてください。

bash -x testscript    # run the script

FIFOへの書き込みの1つがブロックされていることを確認してください。これは、アプリケーションがパイプからデータを取得できないことを意味します。

おすすめ記事