2015-03-16 6 views
0

Я пишу Makefile, который должен работать на Linux и на MacOS-системах. Я использую программу sed. Оказывается, что BSD sed и gnu sed отличаются небольшой, но важной деталью. Я цитирую из искусственных страниц:sed на linux и MacOS в Makefile

BSD: 
-i extension ... 

GNU: 
-i[SUFFIX], --in-place[=SUFFIX] 

Так на Mac я должен позвонить

sed -i '' -e 's/foo/bar/' file.tmp 

где пустая строка после -i является necesary, в то время как на машине Linux я называю

SED -i 's/Foo/бар /' file.tmp

Вот вопрос:

Есть ли безопасный способ отличить две ОС от Makefile?

Я могу, конечно, позвонить по телефону Makefile.mac или Makefile.linux, но я бы предпочел избежать этого.

+1

Функция тестирования команды 'sed'? Выполнить что-то вроде 'sed -i ext 's ///' <<< input' и посмотреть, удастся ли оно или ошибки? Это должно преуспеть с bsd sed и сбой на GNU sed, я считаю. –

ответ

3

Безопасный способ состоит в том, чтобы не использовать -i вариант sed. Этот параметр является неперестраиваемым расширением и не является частью POSIX.

+0

Изучение чего-то повседневного ... Итак, я думаю, что нет временных файлов ... – steffen

+0

Вы также можете попробовать изменить свой скрипт, поэтому 'sed' фильтрует входящие данные по назначению. Трудно сказать, какова лучшая идея, не видя больше вашего Makefile (подсказка подсказки). – fuz

2

Вы можете избежать использования -i на всех, используя такой код:

sed 's/foo/bar/' file > tmp && mv tmp file 

Он будет записывать данные в файл TMP > tmp
Если ошибка не происходит && перемещение файла TMP обратно в исходное file

Приблизительный перевод текста: Вы скоро получите временный файл.
Я не уверен, что это будет медленнее, чем опция -i.

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