Я читал, что xargs был хорош для обработки вывода команды по одной строке за раз (и это так). У меня есть следующая строка в моем сценарии.
./gen-data | awk '{printf $2 " "; printf $1=$2=$3=""; gsub (" ", "", $0);if(length($0) == 0){ print "0000"} else{print $0}}' | xargs -t -n2 -P1 bash -c 'datatojson "$@"' _
Он производит правильный вывод, в этом нет сомнений. Тем не менее, gen-data выдает что-то вроде 1000 строк, и я действительно хотел бы, чтобы эта команда выполнялась после каждой строки, а не после 1000 строк (она явно останавливается для получения большего ввода).
Вот как выглядит gen-data:
candump $interface &
while true; do
while read p; do
cansend $interface $(echo $p | awk 'NF>1{print $NF}');
done < <(shuf $indoc)
done
( cansend
отправляет данные на интерфейс и candump
читает из этого интерфейса и выводит его на экран, но держу пари, что это не слишком актуально). В любом случае candump
кажется, непрерывно потокового вывода, но когда я трубу, что в awk
а также xargs
Становится кусочками. Это только потому, что я использовал shuf
? Я бы подумал, что, поскольку он проходит через интерфейс и читается с другой стороны, он будет менее частым, чем предоставляет shuf.
источник
shuf
? Этот скрипт работает без его использования? (Я знаю это должен , но это надо исключить)cat
вместоshuf
и он делает то же самое. Не уверен, как еще я могу вставить его в этот цикл, я не очень опытный в написании сценариев.Ответы:
Вы можете попробовать ту же команду, на этот раз используя несколько хаков для избегать буферизации :
Следи за изменением от
awk
вgawk
и использованиеfflush
, Вы также можете попробоватьmawk -Winteractive
, Также учтите, что я добавилstdbuf -o0
до xargs. Вы также можете попробовать последнюю версию с./gen-data
источник
-o0
делать наstdbuf
команда?stdbuf
man
страница : устанавливает буферизацию команды как «unbuffered»