2012-07-03 4 views
0

В Баш строке, я могу сделать следующее:Как назначить вывод команды переменной в GNU make target rule?

~/repo$ HISTORY_LOG=$(git log $(get_old_version)..$(get_new_version)); [[ ! -z ${HISTOR_LOG} ]] && (echo "Some header"; echo "${HISTORY_LOG}") 

git log Где это явно упрощенная версия того, что я на самом деле есть.

В косметическом файле я имею следующую команду как часть цели:

$(OUTPUT): $(INPUT) 
     ... 
     echo "Some header" > $(LOG_FILE) 
     git log $(shell get_old_version)..$(shell get_new_version) >> $(LOG_FILE) 

Как я могу переписать цель грима вести себя подобно команде баш?

Если я следующие строки-фиды раздевание:

$(OUTPUT): $(INPUT) 
     ... 
     HISTORY_LOG="$(shell git log $(shell get_old_version)..$(shell get_new_version))" ; \ 
      [ -z "$${HISTORY_LOG}" ] && \ 
      true || \ 
      (echo "Some header" ; echo "$${HISTORY_LOG}") 

при запуске выглядит следующим образом:

~/repo $ make 
commit 2b4d87b0e64d129028c1a7a0b46ccde2f42c5e93  Author: Jamie <[email protected]> Date: Mon Jun 25 18:46:27 2012 -0400    Issue #468: This sucker's been sped up. 

и то, что я предпочел бы быть:

~/repo $ make 
commit 2b4d87b0e64d129028c1a7a0b46ccde2f42c5e93  
Author: Jamie <[email protected]> 
Date: Mon Jun 25 18:46:27 2012 -0400 

    Issue #468: This sucker's been sped up. 

Я думаю, проблема заключается в том, что make выполняет команды в /bin/sh a nd не /bin/bash. Независимо от того, что я ищу портативное решение, если оно есть.

+0

Есть ли какой-то причине вы хотите назначить выход в переменную? Обратите внимание, что переменная выходит за пределы области действия в конце команды. – Beta

+0

Потому что я хочу добавить преамбулу только в том случае, если вывод не пуст. Команда, генерирующая вывод, немного громоздка, я не хочу дважды помещать ее в файл make. И тот факт, что переменная выходит из области действия в конце команды, является желательной. Редактирование показывает, что заголовок также печатается, если вывод не пуст. – Jamie

+0

GNUMake позволяет вам выбирать оболочку, но не являясь экспертом по оболочке, я бы просто сохранил вывод во временном файле. – Beta

ответ

5

Марка shell ест ваши символы перевода. Просто прекратите использовать его. Вместо $(shell get_old_version), спасаясь от $:

$$(get_old_version) 
+0

Сработала идея побега; но место, которое вы выбрали, не было преступником, это был '$ (shell git log ...)', который нуждался в обработке '$$ (git log ...)'. Благодарю. – Jamie

Смежные вопросы