在 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
实用程序。
我觉得问这个问题有点傻,但就是这样。
出于测试目的,我正在尝试在 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
实用程序。