过程替换到命名管道转换

时间:2021-04-21 04:58:59

标签: shell sh busybox

我是 Busybox 的新手,我发现进程替换在 Busybox 中不起作用。谁能帮我在 Busybox 中使用命名管道模拟以下命令。

cat <(echo 0 0 1 /config/camConfig.txt 0 3840 2160 8 0 0) - | ~/tools/camera/stream

我正在开发一款在 Busybox 上运行的相机。为了流式传输相机进行分析,我需要启动一个应用程序/tools/camera/stream,但每次运行此应用程序时,我都需要手动向应用程序插入相同的信息集,然后它将开始流,分析完成后,我需要在应用程序中输入数字 13 来停止相机。所以我想自动化这个任务,我尝试了上面的命令。后来我发现我不能这样做。我尝试了下面的命令,但只有第一个输入 0 被传递给应用程序。

[ -p ~/config/settings.txt ] || mkfifo ~/config/settings.txt
echo 0 0 1 /config/camConfig.txt 0 3840 2160 8 0 0 > ~/config/settings.txt &
cat <~/config/settings.txt - | ~/tools/camera/stream

请帮助我找到解决方案。

1 个答案:

答案 0 :(得分:2)

<(...) 是一种 Bash 主义,Busybox 只支持普通的 sh 语法。一种与 sh 兼容的方法是在大括号内运行 echocat,并将结果 compound command 通过管道传输到您的工具。

{ echo 0 0 1 /config/camConfig.txt 0 3840 2160 8 0 0; cat; } | ~/tools/camera/stream

我什至会在 Bash 中这样做,因为它更直接,因此更有效地表达了您正在尝试做的事情。


就其价值而言,如果您从最后一行中删除 < 重定向,我认为您的解决方案会起作用。

cat ~/config/settings.txt - | ~/tools/camera/stream

为什么不使用 <?您正在尝试 cat 管道和标准输入。如果您使用 < 会导致 settings.txt 被重定向到 stdin,这与 - 冲突并意味着 stdin 不再连接到键盘。

此外,我可能会将管道粘在 /run 中,这对于 ephemeral runtime files 来说是完美的选择。 (或者,/var/run/tmp。)我会给它一个 .fifo 扩展名以表明它不是一个常规文件。

相关问题