bash 脚本中的 Coproc

bash 脚本中的 Coproc

我正在尝试编写一个简单的 shell 脚本,使我的树莓派的蓝牙可被发现,但我遇到了一些问题。我的树莓派运行的是 Raspbian。

通过命令行运行它效果很好:

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

但是当我创建 shell 脚本时执行以下操作:

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

使用命令行“bash test_script.sh”,脚本正确执行,但蓝牙的状态保持不变。

有人可以帮我吗?谢谢!

答案1

bluetoothctl一旦完成,您的脚本就会退出并终止echo,这意味着bluetoothctl可能没有足够的时间来完成它的事情。协进程很可能由于PIPE在尝试将某些内容写入标准输出(由脚本退出而关闭)时接收到信号而退出。

您在这里有两个选择(很可能更多):

  1. 等待协同进程完成后再终止脚本。您可以在wait "$COPROC_PID"脚本结束之前执行此操作。这将导致脚本一直运行,直到bluetoothctl通过其他方式终止(例如,您可以quit使用第二个 向其发送命令echo)。

  2. 只需将字符串bluetoothctl直接通过管道传输到:

    echo discoverable on | bluetoothctl
    

    或者,使用此处字符串

    bluetoothctl <<<'discoverable on'
    

    这将导致bluetoothctl在执行命令后终止。脚本在bluetoothctl完成后终止。

相关内容