Ну, универсальный случай, который работает с любой командой, которая пишет в 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' {} \+
Использовать ssh -t ...
вызвать pseudo-tty выделение (который является тем, что Вы получаете, когда Вы обычно входите в систему через ssh.)
Расшириться немного на ответе Ryan Fox: Много программ (большинство? - это - значение по умолчанию для любой программы C), буфер строки stdout, когда они говорят с терминалом, но полностью буферный это иначе. (Стандарт C указывает, что stdout первоначально полностью буферизуется, когда он "может быть полон решимости не относиться к интерактивному устройству".)
Таким образом, то, что Вы видите, - то, что вывод программы, которую Вы запускаете удаленно (как дали stdout) не с буфером строки; ssh просто проходит через то, что это получает, когда это получает его. (Я думаю, что ssh на самом деле не делает никакой буферизации вообще на ее выводе - который был бы наименее волшебным способом удостовериться, что пользователь видит то, что предназначила удаленная программа.)
-tt
- это работало на меня, когда-t не сделал. – Tom Dalton 26.03.2018, 16:35