LINUX.ORG.RU

pipe внутри system() приводит к непредсказуемому результату

 


0

1

Делаю вот так:

system("echo ${inv_line} | wgrib $in_grib -i -text -o $out_csv &>/dev/null")
И после завершения system счастливо узнаю, что, оказывается, утилита wgrib всё ещё пишет в свой выходной файл, т.е. этот самый выходной файл ещё не может быть использован для чтения из него.
Я сейчас сделал то же самое в 2-х альтернативных вариантах: один с использованием обратных кавычек и один - system, вызывающий bash -c. Но вопрос в том, насколько это корректно: обратные кавычки почему-то не «съедают» STDERR (ведь &>/dev/null же!), выводя его благополучно на экран, а bash -c - это, очевидно, «не самое быстрое» решение.
Есть ещё идеи? :)

★★★★★

Последнее исправление: cetjs2 (всего исправлений: 1)

Я бы порекомендовал тебе перепроверить свое высказывание про «И после завершения system счастливо узнаю, что, оказывается, утилита wgrib всё ещё пишет в свой выходной файл», потому что смысл функции system заключается в вызове интерпретатора.

Твоя проблема может крыться в том, что в роли интерпретатора выступает не bash, а sh, который воспринимает «&>/dev/null» как «запустить в background и перенаправить stdout в /dev/null».

В любом случае, strace -ff -edup,open,execve укажет тебе верный путь.

anonymous
()
Ответ на: комментарий от DRVTiny

обернуть все в скрипт и вызывать его через system ()?

solovey ★★
()
Ответ на: комментарий от alex_custov

system() использует системный интерпретатор

Не всегда. Если массив передать, то не использует. Но ТС хочет пайпы и перенаправления, так что либо bash, либо ковыряться с open().

nikodymus
()
Ответ на: комментарий от nikodymus

Это я поспешил. Наверняка system() не смотрит на SHELL. Значит только bash -c.

nikodymus
()
Ответ на: комментарий от derlafff

Я так и сделал, но это неправильно. В итоге меня устроит вполне SHELL, нужно просто вместо дорогой моему правому желудочку конструкции &>/dev/null использовать >/dev/null 2>&1.
Объективно, было бы лучше, если бы API какой-то был для работы с GRIB'ами, иначе всё равно накладно получается этот написанный, кажись, на Fortran'е, wgrib использовать.

DRVTiny ★★★★★
() автор топика
Ответ на: комментарий от DRVTiny

а ответ так прост

&>/dev/null

непортабельные вундервафли не нужны.

Stil ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.