Вывод SSH не является буферизованной строкой?

Ну, универсальный случай, который работает с любой командой, которая пишет в stdout, должен использовать xargs, который позволит Вам присоединить любое количество параметров командной строки в конец команды:

$ find … | xargs grep 'search'

Или встроить команду в Ваш grep строка с обратными галочками или $(), который выполнит команду и заменит ее выводом:

$ grep 'search' $(find …)

Обратите внимание, что эти команды не работают, если имена файлов содержат пробел или определенные другие “странные символы” (\'" для xargs, \[*? для $(find …)).


Однако в конкретном случае find способность выполнить программу на данных аргументах встроена:

$ find … -exec grep 'search' {} \;

Все между -exec и ; команда должна выполниться; {} заменяется именем файла, найденным find. Это выполнит отдельное grep для каждого файла; с тех пор grep может взять много имен файлов и искать их всех, можно измениться ; кому: + для сообщения находят для передачи всех имен файлов соответствия grep сразу:

$ find … -exec grep 'search' {} \+
35
03.10.2011, 05:48
2 ответа

Использовать ssh -t ... вызвать pseudo-tty выделение (который является тем, что Вы получаете, когда Вы обычно входите в систему через ssh.)

45
27.01.2020, 19:36
  • 1
    не помог, к сожалению. Это также могло бы быть проблемой с MTU, но ни один из него не помог победителю –  Nick Roz 10.09.2016, 02:48
  • 2
    См. комментарий Magnus ниже касательно использования -tt - это работало на меня, когда-t не сделал. –  Tom Dalton 26.03.2018, 16:35

Расшириться немного на ответе Ryan Fox: Много программ (большинство? - это - значение по умолчанию для любой программы C), буфер строки stdout, когда они говорят с терминалом, но полностью буферный это иначе. (Стандарт C указывает, что stdout первоначально полностью буферизуется, когда он "может быть полон решимости не относиться к интерактивному устройству".)

Таким образом, то, что Вы видите, - то, что вывод программы, которую Вы запускаете удаленно (как дали stdout) не с буфером строки; ssh просто проходит через то, что это получает, когда это получает его. (Я думаю, что ssh на самом деле не делает никакой буферизации вообще на ее выводе - который был бы наименее волшебным способом удостовериться, что пользователь видит то, что предназначила удаленная программа.)

23
27.01.2020, 19:36
  • 1
    Анонимный пользователь предполагает, что stdout полностью буферизуется, не буферизованная строка –  Michael Mrozek♦ 03.10.2011, 06:53
  • 2
    сказал мне внеполосный, что был тем, который сделал редактирование, и что это корректно (т.е., stdout первоначально полностью буферизуется, не буферизованная строка). –  David Wolever 03.10.2011, 09:05

Теги

Похожие вопросы