linux cli: условная команда зависит от исходной программы в конвейере - PullRequest
2 голосов
/ 13 июля 2011

Если я наберу:

progA | progB && progC

, тогда progC зависит от progB, а не от progA. Есть ли способ, как передать по конвейеру вывод от progA до progB, а затем, после того, как progA будет сделано (и если мне придется ждать, пока progB тоже будет сделано, то это не проблема) progC быть условным на проге A ?

Кроме того, мне нужно держать трубку - как я не могу позволить себе сделать progA > file; ....; progB < file и потерять эффективность времени.

РЕДАКТИРОВАТЬ: Как использовать код возврата первой программы в командной строке канала является аналогичным вопросом, но не имеет ограничения для сохранения канала, и это также предполагает, что у меня есть доступ к код проги.

Ответы [ 2 ]

1 голос
/ 13 июля 2011

Использовать именованную трубу.

С вариациями grep как progA и cat как progB:

$ cat input
foo
bar 
baz
$ grep fool < input > fifo & cat fifo & wait %1 && echo good || echo bad
[1] 13876
[2] 13877
[1]-  Exit 1                  grep fool < input > fifo
bad
[2]+  Done                    cat fifo
$ grep foo < input > fifo & cat fifo & wait %1 && echo good || echo bad
[1] 13878
[2] 13879
foo
[1]-  Done                    grep foo < input > fifo
good
[2]+  Done                    cat fifo

Обратите внимание, что wait без идентификатора задания всегда будет возвращать 0 независимо от состояния выхода фонового задания и что wait %1 в отдельной команде не будет работать при выходе из задания до запуска wait. Я бы не хотел запускать это в производство на самом деле. Все это было проверено на bash кстати и может немного отличаться для других оболочек.

0 голосов
/ 13 июля 2011

Я не знаком с способом сделать это в простой командной строке. Но вы могли бы сделать это в сценарии оболочки, следующее обеспечит успешное завершение каждой предыдущей программы и передачу результатов следующей программе. Вы бы использовали это так myscript.sh progA progB progC. Если вам не нужна прямая зависимость от предыдущего успешного выполнения программы, вы можете использовать счетчик и вручную проверить, какой порядок параметров вы хотите.

#!/usr/bin/env bash

OUTPUT=""

# loop through each argument
while [ $# -ne 0 ]; do

  # run each argument as a command and store output
  OUTPUT=$($1 $OUTPUT)
  RESULT=$?

  # check for success
  if [ "$RESULT" -ne "0" ]; then
    # do whatever else on error here
    exit $RESULT
  fi

  # next arg
  shift
done
...