进程替换命名管道转换

Process Substitution to named pipe conversion

我是 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

请帮我找到解决办法。

<(...) 是一个 Bash-ism 并且 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 被重定向到标准输入,这与 - 冲突并且意味着标准输入不再连接到键盘。

此外,我可能会将管道固定在 /run 中,它适用于 ephemeral runtime files——非常适合管道。 (或者,/var/run/tmp。)我会给它一个 .fifo 扩展名以表明它不是常规文件。