Как перенаправить стандартный ввод / вывод, когда у меня есть последовательность команд в Bash? - PullRequest
3 голосов
/ 16 апреля 2010

В настоящее время выполняется команда Bash (через Python subprocess.Popen), которая читает из stdin, что-то делает и выводит в stdout. Что-то вроде:

pid = subprocess.Popen( ["-c", "cmd1 | cmd2"],
                       stdin = subprocess.PIPE, 
                       stdout = subprocess.PIPE, 
                       shell =True )
output_data = pid.communicate( "input data\n" )

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

cmd0; cmd1 | cmd2

Можно ли в этом сценарии отправлять входные данные на cmd1 вместо cmd0? Я предполагаю, что вывод будет включать вывод cmd0 (который будет пустым), а затем вывод cmd2.

cmd0 на самом деле ничего не должен читать из stdin, имеет ли это значение в этой ситуации?

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

Ответы [ 3 ]

4 голосов
/ 16 апреля 2010

выполнить cmd0 и cmd1 в подоболочке и перенаправить / dev / null как стандартный для cmd0:

(cmd0 </dev/null; cmd1) | cmd2
1 голос
/ 16 апреля 2010

Не думаю, что вам нужно делать что-то особенное. Если cmd0 не касается stdin, он будет не поврежден для cmd1. Попробуйте сами:

ls | ( echo "foo"; sed 's/^/input: /')

(Использование ls в качестве произвольной команды для создания нескольких строк ввода для конвейера)

И дополнительный канал к cmd2, конечно, тоже не влияет на ввод.

0 голосов
/ 16 апреля 2010

Хорошо, я думаю, что могу скопировать дескриптор файла stdin во временный, закрыть его, запустить cmd0, а затем восстановить его перед запуском cmd1:

exec 0>&3; exec 0<&-; cmd0 ; exec 3>&0 ; cmd1 | cmd2

Не уверен, что возможно перенаправить stdin таким образом, и не могу проверить это в данный момент.

http://tldp.org/LDP/abs/html/io-redirection.html

http://tldp.org/LDP/abs/html/x17601.html

...