2016-12-06 2 views
0

Я пытаюсь создать часть скрипта сборки, который создает файл, содержащий информацию о git repo. Как получить результат команд 2+ в виде строки.using bash/node для извлечения командного вывода

var fs = require('fs'); 
var exec = require('child_process').exec; 

var cmd = 'echo $(git rev-parse --abbrev-ref HEAD)|$(git log -1 --format=%cd)|$(git rev-parse HEAD)'; 

exec(cmd, function(error, stdout, stderr) { 
    fs.writeFile("src/test.js", stdout, function(err) { 
     if(err) return console.log(err); 
     console.log(stdout); 
    }); 
}); 

Я знаю, проблема в моем cmd. Я просто не знаю, как должно выглядеть строка, например <branch>|<date>|<commit-hash>

ответ

0

Проблема в том, что аргумент, который вы передаете echo, не цитируется. После того, как ваши git Подкоманд оцениваются, команда, которую вы выполнение выглядит так:

echo my-branch-name|Mon Dec 5 09:23:00 2016 -0600|d1a9da04125fd67edea6062e99d0be960220d2a4 

Оболочка правильно интерпретировать символы трубы здесь, как, ну, труба. Другими словами, он считает, что вы хотите вывести вывод echo my-branch-name в команду под названием Mon и так далее. Вы можете это исправить, добавив кавычки аргумента echo:

var cmd = 'echo "$(git rev-parse --abbrev-ref HEAD)|$(git log -1 --format=%cd)|$(git rev-parse HEAD)"'; 

Я попытался это локально и написал следующее в файл:

my-branch-name|Mon Dec 5 09:23:00 2016 -0600|d1a9da04125fd67edea6062e99d0be960220d2a4 

Edit: Это не работает с bash на Windows, по-видимому, потому что child_process.exec использует cmd.exe по умолчанию. Может быть, можно указать его на Баше с опцией shell, но вместо изменения команды следующего работал OP:

var cmd = 'bash -c \'echo "$(git rev-parse --abbrev-ref HEAD)|$(git log -1 --format=%cd)|$(git rev-parse HEAD)"\''; 
+0

эта команда работает, если я запускаю ее непосредственно в терминале. Это не работает, если я поместил его в свой скрипт и запустил его, 'node write_git_info.js'. Он буквально помещает '' $ (git rev-parse -abbrev-ref HEAD) | $ (git log -1 --format =% cd) | $ (git rev-parse HEAD) "в файл. Нет никаких изменений. – David

+0

, делая это как @chepner, выводит только последнюю команду. Я ищу некоторую конкатенацию строк. – David

+0

Да, вы правы, я поспешил принять подход @ chepner. Я вернул эту часть своего ответа. Я попробовал это прямо сейчас в REPL, и он работает точно так, как указано. –

-1

Вам не нужна подстановка команд. Просто подключите вывод одной команды непосредственно к следующей.

var cmd = 'git rev-parse --abbrev-ref HEAD | git log -1 --format=%cd | git rev-parse HEAD'; 
Смежные вопросы