BashスクリプトのCoproc

BashスクリプトのCoproc

Raspberry PiのBluetoothを検索可能にするために単純なシェルスクリプトを作成しようとしたところ、いくつかの問題が発生しました。私のRaspberry PiはRaspbianを実行しています。

コマンドラインから実行すると正常に動作します。

coproc bluetoothctl
echo -e 'discoverable on' >&${COPROC[1]}

ただし、次のことを行うシェルスクリプトを作成するとき:

#! /bin/bash
coproc bluetoothctl
echo -e 'discoverable on' >&${COPROC[1]}

"bash test_script.sh"コマンドラインを使用すると、スクリプトは正しく実行されますが、Bluetoothステータスは変更されません。

誰でも私を助けることができますか?ありがとうございます!

答え1

bluetoothctl完了すると、スクリプトは終了して終了します。これは、タスクを完了するのに十分な時間がないことをecho意味します。標準出力に何かを書き込もうとすると、信号の受信によってbluetoothctl補助プロセスが終了した可能性が高くなります(スクリプトの終了により終了しました).PIPE

これには2つのオプションがあります(おそらくそれ以上)。

  1. スクリプトを終了する前に、コルーチンが完了するのを待ちます。wait "$COPROC_PID"スクリプトが終了する前にこれを行うことができます。これにより、別の方法で終了するまでスクリプトが実行されます(たとえば、2番目の方法を使用してコマンドを送信bluetoothctlできます)。quitecho

  2. bluetoothctl文字列を次に直接パイプするだけです。

    echo discoverable on | bluetoothctl
    

    またはこの文字列を使用してください。

    bluetoothctl <<<'discoverable on'
    

    これにより、bluetoothctlコマンドの実行後に終了します。bluetoothctl完了すると、スクリプトは終了します。

関連情報