Как GRUB 2 работает с несколькими разделами Linux с UEFI

${var+foo} расширяется до foo, если переменная var установлена (даже если пуста), и ничего в противном случае. В данном случае переменной является первый позиционный параметр, $1. Таким образом, ${1+"$@"} проверяет, установлен ли $1, и соответственно расширяется до "$@", а в противном случае - ничего.

Что касается $@ и "$@", то $@ подвергается разделению полей и расширению имени файла после расширения до позиционных параметров, а "$@" - нет:

$ sh -c 'cd /usr; printf "%s\n" $@' _ 'a b' '*'  
a
b
bin
include
…
$ sh -c 'cd /usr; printf "%s\n" "$@"' _ 'a b' '*'
a b
*

Вы почти всегда захотите использовать "$@" вместо $@.

Что касается ${1+"$@"} против просто "$@", то в POSIX-совместимых оболочках оба варианта будут иметь одинаковый эффект. Согласно этому посту на Stack Overflow:

"Истерический изюм", он же "Исторические причины".

Когда-то, 20 или около того лет назад, некоторые сломанные незначительные варианты Bourne Shell заменяли пустую строку "" на "$@" при отсутствии аргументов, вместо правильного, текущего поведения подстановки ничего. Вопрос о том, используются ли такие системы до сих пор, остается открытым.

Раздел руководства autoconf по Shell Substitutions также посвящен этому:

Существуют также проблемы переносимости с определенными расширениями:

$@

Одна из самых известных проблем переносимости shell связана с ‘"$@"’. Когда нет позиционных аргументов, Posix говорит, что '"$@"' должно быть эквивалентно ничему, но оригинальный Bourne shell 7 версии Unix рассматривал это как эквивалент '"" вместо этого, и это поведение сохранилось в более поздних реализациях, таких как Digital Unix 5.0.


Также смотрите:

4
20.07.2017, 14:10
1 ответ

My question is, when there are multiple bootloaders (.efi) reside in ESP, are they identical? since they are all grub2. Can all of them discover all the kernel in the system?

Если на диске есть несколько установок UEFI Linux, они обычно используют один и тот же системный раздел EFI (ESP ), но их соответствующие исполняемые файлы EFI находятся в разных подкаталогах ESP в форме EFI/bootloader-id. Исполняемые файлы EFI имеют такое же имя; для 64-битных установок это grubx64.efi. Таким образом, переменные EFI будут расположены по адресу EFI/bootloader-id/grubx64.efi

.

Эти исполняемые файлы устанавливаются grub-installв соответствующих системах, хотя вам, возможно, придется указать grub-installна этот раздел с помощью --efi-directory. И, возможно, вам также придется выбрать значение bootloader-idс --bootloader-id. Различные дистрибутивы Linux имеют разные значения по умолчанию для bootloader-id. Например, в Debian по умолчанию используется debian. Для получения дополнительной информации об опциях grub-installсм. man grub-install.

grub-installhard -связывает имя загрузочного/корневого устройства с этими исполняемыми файлами, используя UUID.

Эти исполняемые файлы EFI выполняются микропрограммой EFI на материнской плате. Поскольку исполняемый файл EFI знает загрузочные/корневые устройства для своей установки Linux и поскольку по определению grub.cfgимеет фиксированное расположение относительно загрузочных/корневых устройств, исполняемый файл EFI может выполнять /boot/grub/grub.cfg, соответствующий этой установке. И, конечно же, grub.cfgсодержит всю информацию, необходимую для загрузки, включая имена ядер, установленных в системе.

Страница Arch Wiki GRUB хорошо освещает эти вопросы. См. также страницу Debian Wiki UEFI .

5
27.01.2020, 20:53

Теги

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