У меня была такая же проблема, как и у вас. Настоящее сообщение об ошибке находится в вашем файле config.log. Выясните это и попытайтесь решить проблему. В моем случае я изменил другую версию gcc, чтобы решить проблему.
Это зависит от того, насколько сложным является вывод и насколько необходимо поддерживать форматирование (например, всегда ли первый столбец имеет длину 8 символов? и т.д.). Однако цикл while
может сработать
cat source.tab | while read -r name id
do
echo "$name $id $(dbstream .... code=$id)"
done
Вы можете изменить то, что происходит внутри цикла для форматирования, как вам нравится. например
cat source.tab | while read -r name id
do
res=$(dbstream ... code=$id)
printf "%10s %5d %s" $name $id $res
done
Согласно комментарию, вы хотите вызвать dbstream
только один раз. Это требует, чтобы dbstream
сохранял вывод в том же порядке, что и ввод.
Вот простой пример dbstream
программы:
#!/bin/sh
for a in "$@"
do
echo dbstream $$ sees $a
done
Мы включаем PID в вывод, чтобы показать, что он вызывается только один раз.
Теперь мы можем использовать paste
и подстановку процесса:
$ paste source.tab <(./dbstream $(awk '{print $2}' source.tab ))
alice 1 dbstream 20671 sees 1
bob 2 dbstream 20671 sees 2
Теперь, если source.tab
- медленный процесс, я бы рекомендовал использовать временный файл
например
#!/bin/bash
tmp=`mktemp`
trap '/bin/rm -f $tmp ; exit' 0 1 2 3 15
cat source.tab > $tmp
paste $tmp <(./dbstream $(awk '{print $2}' $tmp ))
Правильный способ, похоже, заключается в использовании именованной трубы
Пример:
function datastreamWrapper() {
mypipe=$(mktemp -u)
mkfifo -m 600 "$mypipe"
tee >( cut -f2 | datastream ... > "$mypipe") | paste - "$mypipe"
rm "$mypipe"
}
Тогда вы можете поместить datastreamWrapper в ваш трубопровод:
cat source.tab | datastreamWrapper | foo