2013-03-28 3 views
1

Я пытаюсь запустить приложение (допустим, top), поэтому он будет читать из файла для stdin и записывать в другой файл из stdout.Bash: прочитайте stdin из файла и напишите stdout в файл

В настоящее время у меня есть

mkfifo stdin.pipe 
(tail -f stdin.pipe) | top 

, который работает, как ожидалось, так как я могу тогда echo что-то в этот файл и сверху получит. Но я не могу перенаправить вывод сверху. Как я могу это достичь?

EDIT:

Хорошо, давайте царапанию верх. Я тестирую с этим:

cat test.sh 

echo Say something 
read something 
echo you said $something 
+0

Вы уверены, что 'top' читается с' stdin'? Мой нет. Вы можете перенаправить вывод с 'top' с помощью опции' -b' (пакетной): 'top -n 1 -b> gash' – cdarke

+0

@cdarke Извините, вы правы. Я делал тесты с другим приложением. top не работает одинаково. Есть ли способ, которым я могу сопоставить stdin и stdout с файлами и использовать их для управления кли-приложением? – alexandernst

ответ

13

Давайте забудем о top, что, как представляется, отвлекающим маневром.

Для отображения стандартного ввода или стандартный вывод в файл, вы можете использовать перенаправление:

some_program < input_file   # Redirects stdin 

another_program > output_file  # Redirects stdout 

или даже:

yet_another <input_file> output_file 
+0

Является ли это асинхронным или синхронизирующим? Я только что протестировал его с помощью двухстрочного bash, который скажет «Привет», дождитесь ввода, а затем скажет «Bye». Я смог увидеть результат в файле output_file после того, как я перенаправил что-то в файл ввода (также, когда приложение закончило работать). – alexandernst

+0

Если вы комментируете между программами, используйте анонимный канал, это будет более эффективно, чем использование временного файла. Зависит от того, что вы подразумеваете под синхронизацией/асинксом в этом контексте, но все оболочки IO буферизуются. Буфер очищается и файл закрывается после каждого перенаправления, но вы можете получить проблемы, если программа читает во время записи (в файл, а не в трубку). – cdarke

+0

Проблема в том, что я пытаюсь контролировать приложение CLI из PHP, поэтому я не могу сохранить дескриптор в трубке, поэтому мне нужно иметь возможность читать/писать в/из файлов. Как заставить поток сбрасываться, а не собираться в буфер? – alexandernst

3

Есть ли способ, что я могу отобразить стандартный ввод и стандартный вывод для файлов и использования их контролировать приложение cli?

Похоже, что вы ищете coprocesses, добавленный к Bash в 4.0.

coproc cat     # Start cat in background 
echo Hello >&${COPROC[1]}  # Say "Hello" to cat 
read LINE <&${COPROC[0]}  # Read response 
echo $LINE     # cat replied "Hello"! 

До 4.0 вам нужно было использовать две именованные трубы для достижения этого.

Смежные вопросы