我有两个(UNIX)方案A和B,即阅读和写stdin/stdout。

我的第一个问题是如何将标准输出的一个要stdin的B 该stdout的B stdin的A.即, 像A|B,但一个双向管。我怀疑我能解决这个的 使用exec重定向 但我不能得到它的工作。该方案是互动的,因此临时文件中将不会的工作。

第二个问题是,我要重复各个方向和管重复通过一个记录程序,以stdout这样我可以看到的(案文的基线)的流量之间传递的程序。在这里,我可以得到tee>(...)如果我可以解决第一个问题。

这两个问题似乎是他们应该已经众所周知的解决方案,但我们不能找到任何东西。

我会更喜欢一个POSIX壳解决方案,或者至少一些作品在庆典上cygwin。

谢谢你回答我提出了以下解决方案。A/B命令使用的数控听到两个端口。记录程序使用sed(与-u无缓冲处理)。

bash-3.2$ fifodir=$(mktemp -d)
bash-3.2$ mkfifo "$fifodir/echoAtoB"
bash-3.2$ mkfifo "$fifodir/echoBtoA"
bash-3.2$ sed -u 's/^/A->B: /' "$fifodir/echoAtoB" &
bash-3.2$ sed -u 's/^/B->A: /' "$fifodir/echoBtoA" &
bash-3.2$ mkfifo "$fifodir/loopback"
bash-3.2$ nc -l -p 47002 < "$fifodir/loopback" \
          | tee "$fifodir/echoAtoB" \
          | nc -l -p 47001 \
          | tee "$fifodir/echoBtoA" > "$fifodir/loopback"

这听用于连接到口47001和47002和回声的所有交通标准输出。

在壳2:

bash-3.2$ nc localhost 47001

在壳3:

bash-3.2$ nc localhost 47002

现在行进在壳2将被写入壳3,反之亦然和交通记录到壳1,是这样的:

B->A: input to port 47001
A->B: input to port 47002

上文已经过测试Cygwin

更新:剧本上停止工作几天后(!).显然,它可能的僵局。一些建议的答案可能是更可靠。

有帮助吗?

其他提示

命名管道怎么样?

# mkfifo foo
# A < foo | B > foo
# rm foo

对于你的第二部分,我认为tee是正确的答案。所以它变成了:

# A < foo | tee logfile | B > foo

您可能可以使用命名管道:

mkfifo pipe
gawk '$1' < pipe | gawk '$1' > pipe

你可以使用 希望.

希望是一个工具,可用于自动化交互式应用程序,如telnet,ftp,passwd,的,rlogin,尖端,等等。

你可以使用以下代码(采取从 探望 书)作为一个起点--它连接的输出proc1到输入的proc2反之亦然,如你要求:

#!/usr/bin/expect -f
spawn proc1
set proc1 $spawn_id
spawn proc2
interact -u $proc1

我花了很多时间在这上面,放弃了,最后决定使用ksh(Korn shell),这允许这样做。

cmd1 |& cmd2 >&p <&p

其中 |&amp; 是启动协同进程的(管道)运算符,&amp; p 是该协同进程的文件描述符。

我曾经遇到过这个问题,我将这个简单的C程序汇总在一起。

#include <stdio.h>
#include <unistd.h>

#define PERROR_AND_DIE(_x_) {perror(_x_); _exit(1);}

int main(int argc, char **argv) {
    int fd0[2];
    int fd1[2];


    if ( argc != 3 ) {
        fprintf(stdout, "Usage %s: \"[command 1]\" \"[command 2]\"\n", argv[0]);
        _exit(1);
    }

    if ( pipe(fd0) || pipe(fd1) ) PERROR_AND_DIE("pipe")

    pid_t id = fork();
    if ( id == -1 ) PERROR_AND_DIE("fork");

    if ( id ) {
        if ( -1 == close(0) )  PERROR_AND_DIE("P1: close 0");
        if ( -1 == dup2(fd0[0], 0) ) PERROR_AND_DIE("P1: dup 0"); //Read my STDIN from this pipe

        if ( -1 == close(1) )  PERROR_AND_DIE("P1: close 1");
        if ( -1 == dup2(fd1[1], 1) ) PERROR_AND_DIE("P1: dup 1"); //Write my STDOUT here
        execl("/bin/sh", "/bin/sh", "-c", argv[1], NULL);
        PERROR_AND_DIE("P1: exec")
    }

    if ( -1 == close(0) )  PERROR_AND_DIE("P2: close 0");
    if ( -1 == dup2(fd1[0], 0) ) PERROR_AND_DIE("P2: dup 0");

    if ( -1 == close(1) )  PERROR_AND_DIE("P2: close 1");
    if ( -1 == dup2(fd0[1], 1) ) PERROR_AND_DIE("P2: dup 1");


    execl("/bin/sh", "/bin/sh", "-c", argv[2], NULL);
    PERROR_AND_DIE("P2: exec")
}

此问题类似于我之前询问的一个 。其他人提出的解决方案是使用命名管道,但我怀疑你没有在cygwin中使用它们。目前我坚持我自己的(尝试一个)解决方案,但它需要 / dev / fd / 0 ,你可能也没有。

虽然我不太喜欢 twinpipe 的传递 - 命令行 - 字符串方面(由JeeBee提及( 139495 )),它可能是你在cygwin中的唯一选择。

我建议使用“coproc”:

#! /bin/bash
# initiator needs argument

if [ $# -gt 0 ]; then
  a=$1
  echo "Question $a"
else
  read a
fi

if [ $# -gt 0 ]; then
  read a
  echo "$a" >&2
else
  echo "Answer to $a is ..."
fi

exit 0

然后看这个会话:

$ coproc ./dialog
$ ./dialog  test  < /dev/fd/${COPROC[0]}  > /dev/fd/${COPROC[1]}
Answer to Question test is ...
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top