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

In bash, reading from a socket through exec, via process substitution, doesn't work,

我觉得问这个问题有点傻,但就是这样。

出于测试目的,我正在尝试在 bash 中实现一个非常简单的 ftp 客户端,我认为我可以在 reading/writing from/to 中使用一种干净的方法使用 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,可以工作不出所料。

我是不是做错了什么,或者有什么问题?

Alas, whilst writing works like a charm, reading doesn't:

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

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