Как использовать канал для применения текста к программе

Другой вариант - передавать слова по одному в xargs , чтобы он запускал grep для файла. xargs можно заставить выйти, как только вызов grep вернет ошибку, вернув ему 255 (см. Документацию xargs ). Конечно, порождение оболочек и разветвление, задействованное в этом решении, скорее всего, значительно замедлит его

printf '%s\n' one two three | xargs -n 1 sh -c 'grep -q $2 $1 || exit 255' _ file

и зациклит

for f in *; do
    if printf '%s\n' one two three | xargs -n 1 sh -c 'grep -q $2 $1 || exit 255' _ "$f"
    then
         printf '%s\n' "$f"
    fi
done
3
07.02.2017, 00:05
1 ответ

Прежде всего, труба соединяет два процесса, а не файлы (включая текстовые файлы), так, что выход одного идет на вход другого. Предполагается, что процесс, "генерирующий" вывод, отправляет его на STDOUT, который становится источником для трубы, а процесс, "получающий" ввод, считывает его с STDIN, который становится местом назначения трубы. Вы не можете подключить трубу к текстовому или любому другому файлу, только к процессам.

Во-вторых, при использовании трубы процесс на левой стороне трубы - это тот, который использует STDOUT, а процесс на правой стороне трубы использует STDIN. Поэтому ваша команда будет пытаться отправить вывод моей_программы в трубу, а не читать из нее.

Если вы правильно представили инструкцию, которую вам дали, то она все равно не может работать. Инструкция заканчивается словами "...работающая программа берет тестовые примеры из входного файла". Если программа принимает входные данные из файла, то она не читает из STDIN, и в любом случае игнорирует данные из трубы.

Чтобы заставить его работать с трубой, моя_программа должна быть написана для чтения из STDIN, т.е. ожидая, что вы будете набирать тестовые примеры вручную в приглашении. Тогда вы можете переписать командную строку так

cat text_cases.txt | jave my_program

cat - это процесс, который будет читать текстовый файл и отправлять его содержимое в STDOUT, тогда my_program будет "читать" данные из STDIN с помощью трубы вместо того, чтобы вы вводили их вручную. Поскольку я не знаю, как java взаимодействует с трубами, это основано на предположении, что она будет вести себя стандартным образом, поскольку преподаватель попросил вас использовать этот метод.

IMHO было бы лучше, в смысле меньшего использования ресурсов, использовать перенаправление, а не трубу.

java my_program < test_cases.txt

То есть, если только это не один шаг, который будет включен в большую цепочку процессов позже в курсе, где использование трубы станет необходимым.

6
27.01.2020, 21:13

Теги

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