У меня есть сценарий оболочки с тремя echo
инструкциями:
echo 'first message'
echo 'second message'
echo 'third message'
Затем я запускаю этот сценарий в узле и собираю выходные данные с помощью этого кода:
var child = process.spawn('./test.sh');
child.stdout.on('data', data => {
data = JSON.stringify(data.toString('utf8'));
console.log(data);
});
Ноединственное число - "first message\nsecond message\nthird message\n"
, что является проблемой.Я ожидал трех выходов, а не одного, взятого вместе из-за некоторой формы буферизации.И я не могу просто разбить на новые строки, потому что отдельные выходы могут содержать новые строки.
Есть ли способ отличить сообщения отдельных операторов echo
?(или другие выходные команды, например, printf
, или что-либо, что приводит к записи данных в stdout или stderror)
Редактировать: я пробовал unbuffer
и stdbuf
, ни одна из них не работает, так как простоТестирование может продемонстрировать.Вот пример попытки stdbuf
, которую я пытался использовать с различными значениями аргументов, по существу со всеми возможными вариантами.
var child = process.spawn('stdbuf', ['-i0', '-o0', '-e0', './test.sh']);
Чтобы было ясно, эта проблема возникает, когда я запускаю скрипт на python изузел тоже всего с тремя простыми print
операторами.Так что это не зависит от языка, а не от bash-скриптинга в частности.Речь идет об успешном обнаружении отдельных выходных данных скрипта на любом языке в системе на основе Unix.Если это то, что может сделать C / C ++, и мне нужно подключиться к этому с узла, я готов пойти туда.Любое работающее решение приветствуется.
Редактировать: Первоначально я решил проблему для себя, отправив вывод скрипта в sed
и используя s/$/uniqueString
для вставки идентификатора вконец каждого отдельного вывода, а затем просто разделение полученных данных по этому идентификатору.
Ответ, который я дал за вознаграждение, будет работать на однострочных выходах, но разбивается на многострочных выходах.Ошибка в моем тестировании заставила меня думать, что это не так, но это так.Принятый ответ является лучшим решением и будет работать на выходах любого размера.Но если вы не можете управлять сценарием и должны обрабатывать сценарии, созданные пользователем, тогда мое решение sed
- единственное, что я нашел работающим.И это работает , очень хорошо.