bash 中的双向管道?

bash 中的双向管道?

我有一个二进制文件,它的 stdout 被重定向到 python 脚本的 stdin,我想知道是否有任何方法可以将 python 脚本的 stdout 发送到二进制文件的 stdin,以获得类似这样的效果(请原谅我的糟糕的 ascii 图):


 |->-binary -- python -->-|
/|\                      \|/
 |-<---<---<---<---<---<--|

我当前的 bash 代码只是binary | python3 pythonscript.py

谢谢!

答案1

您应该能够使用命名管道来实现您想要的效果。您可以将每个进程的输入和输出重定向到另一个进程。

binary < npipe1 > npipe2
python3 pythonscript.py < npipe2 > npipe1

命名管道已经设置好了:

mkfifo /dev/shm/npipe1
mkfifo /dev/shm/npipe2

命名管道被放置到共享内存目录,但该位置不是强制性的。

这是一个使用 bash 和 dash 脚本的简单示例:

doug@s19:~/temp$ cat test-fifo-job-control
#! /bin/dash
#
# test-fifo-job-control Smythies 2023.09.03
#       A simple example of using named pipes.
#       See https://askubuntu.com/questions/1484568/two-way-pipe-in-bash
#

# If they do not already exist, then create the named pipes.
# Note: sometimes they might need to be deleted and recreated.
#       i.e. if garbage was left in one, or both.

if [ ! -p /dev/shm/npipe1 ]
then
   mkfifo /dev/shm/npipe1
fi
if [ ! -p /dev/shm/npipe2 ]
then
   mkfifo /dev/shm/npipe2
fi

# Launch the first task
./test-fifo-part-1 < /dev/shm/npipe1 > /dev/shm/npipe2 &
#
# and supply the first input
echo 1000 >> /dev/shm/npipe1
#
# Now launch the second task
#./test-fifo-part-2 < /dev/shm/npipe2 > /dev/shm/npipe1
./test-fifo-part-2 < /dev/shm/npipe2 | tee /dev/shm/npipe1

#
# It'll go until stopped via ^C.

和:

doug@s19:~/temp$ cat test-fifo-part-1
#!/bin/bash

while :
  do
# Note: No error checking
  read next_number
  echo "$next_number"
# Slow things down.
  sleep 1
done

和:

doug@s19:~/temp$ cat test-fifo-part-2
#!/bin/bash

while :
  do
# Note: No error checking
  read next_number
  next_number=$((next_number+1))
  echo "$next_number"
# Slow things down.
  sleep 1
done

示例会话:

doug@s19:~/temp$ ./test-fifo-job-control
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
^C
doug@s19:~/temp$

对于评论中的附加问题:

如果我使用 bash 脚本进行管道传输,而不是使用 python 代码,是否还有办法可以将其打印到 stdout 而不进入管道?

不是我给出的简单示例。请注意,我通常在 C 程序中使用这些东西,并将输出直接写入命名管道,从而使 stdout 可用于其他输出。

相关内容