在 bash 中,通过 exec 通过进程替换从套接字读取不起作用,



问这个问题我觉得有点傻,但它来了。

出于测试目的,我试图在bash中实现一个非常简单的ftp客户端,并认为我可以使用一种干净的方法,使用exec和进程替换从套接字读取/写入套接字,如下所示。

exec 3<> /dev/tcp/$host/$port
exec 4< <(dos2unix <&3)
exec 5> >(unix2dos >&3)

然后,我将从fd 4读取并写入fd 5,以便发送命令和接收响应。

唉,虽然写作很有魅力,但阅读却不然:dos2unix只是被卡住了,好像在等待永远不会到来的输入。使用任何其他命令来代替dos2unix显示出相同的行为,但使用真实字符设备来代替/dev/tcp,例如/dev/urandom,可以按预期工作。

我是在做根本错误的事情,还是问题出在哪里?

唉,虽然写作很有魅力,但阅读却不然:

在大多数linux shell中,默认情况下,命令的标准输出流是行缓冲的。在大多数linux shell中,默认情况下,管道中的标准输出命令流是块缓冲的(除了最后一个命令(。

要恢复命令的行缓冲,通常使用stdbuf -oL实用程序。

最新更新