В bash чтение из сокета через exe c через подстановку процесса не работает, - PullRequest
0 голосов
/ 13 апреля 2020

Я чувствую себя немного глупо, спрашивая об этом, но здесь все идет.

Я пытаюсь реализовать очень простой ftp-клиент в bash, для целей тестирования, и подумал, что могу использовать чистый подход при чтении / записи из / в сокет с использованием 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, работает как ожидалось.

Am Я делаю что-то в корне неправильно, или в чем проблема?

1 Ответ

1 голос
/ 28 апреля 2020

Увы, хотя запись работает как талисман, чтение не делает:

В большинстве linux оболочек по умолчанию стандартный поток вывода команд буферизуется строкой. В большинстве linux оболочек по умолчанию стандартный выходной поток команд в конвейере является блочной буферизацией (кроме последней команды).

Для восстановления буферизации строки команды обычно используется stdbuf -oL utilitye.

...