Makefile и .oneshell

Ошибка была вызвана этим параметром в моей строке ядра:

rootflags=noload,subvol=@

Значение этого параметра передается непосредственно на mount как параметры файловой системы для монтирования корневой файловой системы . Вставив операторы отладки в / scripts / local (сгенерированный из / usr / share / initramfs-tools / scripts / local ), я смог определить, что пошло не так с параметрами монтирования. и смог затем исправить мою загрузочную командную строку.

4
17.10.2018, 12:54
1 ответ

.ONESHELL— это специфичное для поставщика GNU расширение, которое не является переносимым и не является частью стандарта POSIX.

Причина, по которой этого нет в стандарте POSIX, скорее всего, заключается в том, что пока существует только одна реализация, которая его поддерживает.

Легче объяснить причину, по которой это не стандарт по умолчанию:

POSIX tries to standardize existing behavior and POSIX does not like to make existing original UNIX implementations being in conflict with the standard - except when a specific behavior can be seen as a clear design bug.

Первоначальная реализация makeСтюарта Фельдмана в 1977 году вызывала каждую строку из списка действий в отдельной оболочке, используя sh -ce cmdline, и она стала основной для всех последующих makeреализаций.

Но даже реализация GNU (, рассматриваемая отдельно ), не лишена проблем, когда действует .ONESHELL. Причина в том, что GNU make не устанавливает флаг оболочки -eпри вызове команд. Это приводит к тому, что многострочный сценарий оболочки, вызванный .ONESHELL, не завершается при возникновении ошибки.

Помимо этого, я вижу мало пользы для.ONESHELL:

  • Многострочные сценарии оболочки могут использоваться внутри makeс помощью обратной косой черты в последовательности новой строки в файлах make.

  • Аргумент производительности не применяется к современным makeреализациям, поскольку современные реализации стараются избегать вызова оболочки в случае, если командная строка не содержит метасимволов, специфичных для оболочки.

  • Моя реализация smakeдаже реализует встроенную поддержку команды echoв случае, если это первая команда в строке echo, за которой следует только одна точка с запятой и простая другая команда. Это позволяет избежать необходимости вызывать оболочку более чем в 90% случаев.

5
27.01.2020, 20:47

Теги

Похожие вопросы