我有一个应用程序,启动身份validation帮助(我的脚本),并使用STDIN / STDOUT沟通。
我想从这个脚本redirectSTDIN和STDOUT到两个命名pipe道与另一个程序交互。
例如:
SCRIPT_STDIN> pipe1
SCRIPT_STDOUT <pipe2
这是我想要完成的stream程:
[应用] – >启动助手脚本,写入助手STDIN,从助手读取STDOUT(例如:STDIN:用户名,密码; STDOUT:LOGIN_OK)
[Helper Script] – >读取STDIN(数据从应用程序),转发到PIPE1; 从PIPE2读取,将其写回到STDOUT上的应用程序
[其他处理] – >从PIPE1input读取,处理并返回结果到PIPE2
猫命令几乎可以做我想要的。 如果有一个选项将STDIN复制到STDERR,我可以用命令(假设虚拟选项-e作为STDERR而不是STDOUT)执行此操作:
cat -e PIPE2 2> PIPE1(从PIPE2读取并写入到STDOUT,复制input,通常是STDERR到PIPE1)
这是一个脚本,最终做我想要的。 它读取STDIN并将其输出到PIPE1,并从PIPE2取出并输出到STDOUT。
#!/bin/ksh exec 3>../pipes/PIPE1 exec 4<../pipes/PIPE2 { cat; } <&4 >&1 & { cat; } <&0 >&3 wait
这样做的目的是将辅助程序应用程序的input/输出redirect到可由第三方应用程序处理的两个pipe道(这是典型的身份validation帮助程序)。
我以前的回答并不是我后来发现的理想解决scheme。 它有三个缺点:一个closures标准input时不closures(在标准input上是)。 其次,cat(和tee等其他工具)在closures它正在写入的pipe道的读取端时有一些奇怪的特征(如果closures并重新打开该脚本正在写入的pipe道的读取端它会开始缓冲所有的数据,只有当这个过程停止冲洗,显然是一个显示塞为我)。 第三,在这种情况下的后台进程可能是孤儿。
处理这些问题后,我的新脚本解决了上述三个问题。 希望它有一些好的东西。
#!/bin/ksh # # USAGE # helper <path_to_CLIENT_TO_SERVER_pipe> <path_to_SERVER_TO_CLIENT_pipe> # CS=$1 SC=$2 exec 3>&0 trap 'exit;' CHLD { while read LINE; do #STDIN -> CS print $LINE >>$CS; done; } <&3 & while true; do #SC -> STDOUT read IN <$SC; retCode=$? if [[ $retCode -eq 0 ]]; then print $IN; else sleep 1; fi done
在这种情况下,我们只有一个后台进程,一个是标准input。 如果标准inputclosures它将退出,我们陷阱,并退出前台脚本。 前台脚本永远不需要退出,因为它从pipe道读取数据,而不pipepipe道另一端发生了什么。 使用read虽然效率较低,但在读取/写入给定pipe道的外部进程出现或closures时,不会遇到缓冲问题。 这个脚本只在标准inputclosures时才存在。