В чистом разделе Makefile
я пытаюсь проверить, существует ли файл перед окончательным удалением. Я использую этот код, но я получаю ошибки.
Что с этим не так?
if [ -a myApp ]
then
rm myApp
fi
Я получаю это сообщение об ошибке
if [ -a myApp ]
/bin/sh: Syntax error: end of file unexpected (expecting "then")
make: *** [clean] Error 2
rm -rf myApp
может быть альтернативой. Или, предшествуя команде с помощью dash (-rm myApp
), make заставит игнорировать ошибку от rm (однако она выведет некрасивое сообщение).Ответы:
Во втором верхнем ответе упоминается
ifeq
, однако, не упоминается, что они должны быть на том же уровне, что и имя цели, например, чтобы загрузить файл, только если он в настоящее время не существует, можно использовать следующий код:источник
Странно видеть так много людей, использующих сценарии оболочки для этого. Я искал способ использовать собственный синтаксис makefile, потому что я пишу это вне какой-либо цели. Вы можете использовать
wildcard
функцию, чтобы проверить, существует ли файл:Обновить:
Я нашел способ, который действительно работает для меня:
источник
Makefile:133: *** unterminated call to function `wildcard': missing `)'. Stop.
$(wildcard pattern)
самом деле делает. См. Ссылку .FILE_EXISTS := $(or $(and $(wildcard $(PATH_TO_FILE)),1),0)
Проблема в том, что вы разбиваете команду на несколько строк. Итак, вы можете использовать либо
\
в конце строк для продолжения, как указано выше, либо вы можете поместить все в одну строку с&&
оператором в bash.Затем вы можете использовать
test
команду, чтобы проверить, существует ли файл, например:или нет:
Это
test
эквивалентно[
команде.и он будет работать как в вашем исходном примере.
Смотрите:
help [
илиhelp test
для дальнейшего синтаксиса.источник
-s
это особый случай дляexists and has a size greater than zero
. Вопрос в том виде, в котором он написан, не зависит от размера, поэтому наличие должно быть проверено сtest -e
помощью файла или-d
каталога. Пустые файлы могут быть особенно полезны в качестве (если не сказать лучшего термина) индикаторов / стражей, которые могут быть весьма актуальны дляmake
.-f
по умолчанию, так как используется чаще.test
на Windows?|| true
в конце, чтобы команда возвращала true, когда файл не существует.test -f myApp || CMD
, обратите внимание||
, поэтому, если-f
произойдет сбой - не существует (||
), затем выполните команду. Имеет ли это смысл?Для продолжения может потребоваться обратная косая черта в конце строки (хотя, возможно, это зависит от версии make):
источник
make
новой строке будет новая команда bash. Главное предостережение этого, помимо раздражения, связанного с наличием большого количества\
символов в конце строк, заключается в том, что каждая команда должна заканчиваться символом,;
который в противном случае был бы неявным в bash.Или просто поместите в одну строчку, как
make
нравится:источник
Отсутствует точка с запятой
Однако я предполагаю, что вы проверяете существование перед удалением, чтобы предотвратить появление сообщения об ошибке. Если это так, вы можете просто использовать те,
rm -f myApp
которые «принудительно» удаляют, т.е. не выдают ошибку, если файл не существует.источник
Результаты исполнения:
источник
echo -n yes
успехtest
в строкеyes
без NL. Затемifeq
можно сравнить его с жестко закодированнымyes
. Все потому, чтоifeq
требуется строка для сравнения, а не статус успеха команды оболочки.Однострочное решение:
Однострочное решение с ошибкой:
Пример, используемый в моих
make clean
директивах:И
make clean
всегда работает без каких-либо сообщений об ошибках!источник
-rm myfile
ведущее тире говорит заставить игнорировать любую ошибку.@[ -f 'myfile' ] && rm myfile
«Если README.md не существует, ничего не делать (и успешно завершить работу). В противном случае добавьте текст в конец».
Если вы используете
&&
вместо||
этого, вы генерируете ошибку, когда файл не существует:источник
Я пытался:
И положительный случай сработал, но моя оболочка ubuntu bash называет это ИСТИННЫМ и прерывает копию:
После получения этой ошибки я гуглил, как проверить, существует ли файл в make, и вот ответ ...
источник
Это решение, опубликованное выше, работает лучше всего. Но убедитесь, что вы не привязываете к назначению PATH_TO_FILE. Например,
Это должно быть
источник
Ответы наподобие ответа @ mark-wilkins, использующего \ для продолжения строк и; чтобы завершить их в оболочке или как те, что из @kenorb, изменение этой строки на одну - это хорошо и решит эту проблему.
есть более простой ответ на исходную проблему (как указал @ alexey-polonsky). Используйте флаг -f для rm, чтобы он не вызывал ошибку
это проще, быстрее и надежнее. Только будьте осторожны, чтобы не получить косую черту и пустую переменную.
rm -f / $ (myAppPath)#НИКОГДАНЕ ДЕЛАЙТЕ ЭТОГОвы можете в конечном итоге удалить свою систему.
источник
rm
; Кстати, я почти уверен, что этоrm -f /$(myAppPath)
тоже не повредит, потому что/
это каталог, а его-r
нет.rm -f
, например, они могут захотетьrm
переменную.