Мне интересно, как я могу избежать эха в Makefile:
clean:
rm -fr *.o
это правило будет печатать:
$>make clean
rm -fr *.o
$>
Как я могу избежать этого?
Мне интересно, как я могу избежать эха в Makefile:
clean:
rm -fr *.o
это правило будет печатать:
$>make clean
rm -fr *.o
$>
Как я могу избежать этого?
На самом деле я искал что-то еще, добавив эту строку в Makefile:
.SILENT:clean
во время выполнения каждого шага "чистой" цели тихо.
Пока кто-то не укажет на этот недостаток, я использую это как свое любимое решение!
Для начала: фактическая команда должна быть на следующей строке (или, по крайней мере, в случае с GNU Make, это может быть иначе с другим Make - я не уверен в этом)
clean:
rm -rf *.o
(обратите внимание, вам нужно TAB до rm -rf *.o
, как и в каждом правиле)
Замораживание может быть выполнено с помощью префикса @
:
поэтому ваш make файл станет
clean:
@rm -rf *.o
Если нет файлов *.o
для удаления, вы можете получить сообщение об ошибке. Чтобы подавить их, добавьте следующие
clean:
[email protected] -rf *.o 2>/dev/null || true
2>/dev/null
выводит любое сообщение об ошибке в /dev/null - поэтому вы не увидите никаких ошибок.-
перед командой гарантирует, что make
игнорирует ненулевой код возвратаЯ отвечаю на эту древнюю тему, потому что она поднимается высоко в поиске, и ответы сбивают с толку. Чтобы сделать то, что хочет пользователь, все, что вам нужно, это:
clean:
@rm -f *.o
Значение @означает, что make не будет эхо-команды.
Аргумент -f
для rm
сообщает rm
игнорировать любые ошибки, например, отсутствие файлов *.o
и всегда возвращать успех.
Я удалил -r из примера OPs, потому что он означает рекурсивный, и вот мы просто rm
ing .o
файлы, и ничего не нужно возвращать.
Нет необходимости в 2>&1 >/dev/null
, потому что с -f
не будет напечатано никаких ошибок.
.SILENT: clean
работает вместо @
, но он не находится на том же месте в Makefile, что и команда, на которую он влияет, поэтому кто-то, поддерживающий проект позже, может быть запутан. Именно поэтому @является предпочтительным. Это лучшая локальность ссылок.
Если вы поместите @перед командой, она не будет эхом в оболочку. Попробуйте изменить rm на @rm. (Ссылка)
Из руководства: .SILENT
существенно устарел, поскольку @
более гибкий.
Гораздо хуже то, что печатает слишком много информации. Предупреждение/ошибка/личные сообщения помещаются на выходе. С другой стороны, -s
(.SILENT
) подавляет только что-либо. Особенно сообщения "ничего не нужно делать" и "обновлять" могут быть болью. Нет возможности их подавить. Вы должны отфильтровывать их активно или использовать что-то вроде colormake. Вот решение для grep:
make | egrep -hiv 'nothing to be done|up to date'
Но на выходе будут номера строк. Поэтому решение Perl лучше, потому что оно подавляет номера строк и немедленно сбрасывает stdout:
make | perl -ne '$|=1; print unless /nothing to be done|up to date/i'
Сделайте неправильный инструмент. "Что не так с GNU make?" объясняет это лучше, чем я могу.