В UEFI есть стандартный способ для операционной системы указать, что пользователь хочет получить доступ к настройке микропрограммы при следующей перезагрузке системы. Внутри Windows использует этот стандартный метод. Как сказал Остин Хеммельгарн в своем ответе, это делается с использованием переменных EFI.
Несколько лет назад я написал скрипт для вызова этого стандартного метода:
#!/bin/sh
EFIVARFS=/sys/firmware/efi/efivars
EFI_OSINDSUPP=OsIndicationsSupported-8be4df61-93ca-11d2-aa0d-00e098032b8c
EFI_OSIND=OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8c
if [ ! -d $EFIVARFS ]
then
echo "ERROR: no efivarfs present"
exit 72 # EX_OSFILE
fi
cd $EFIVARFS
if [ ! -f $EFI_OSINDSUPP ]
then
echo "ERROR: no support for EFI OsIndications"
exit 72 # EX_OSFILE
fi
FWSUP=$(od -An -t x4 $EFI_OSINDSUPP | cut -c 18)
case $FWSUP in
[02468ace])
echo "ERROR: no support for boot-to-fw-ui OsIndication" >&2
exit 69 # EX_UNAVAILABLE
;;
esac
# grab OsIndications header (4 bytes)
EFI_OSINDHDR=$(head -c 4 $EFI_OSIND)
printf '%s\x01\x00\x00\x00\x00\x00\x00\x00' "$EFI_OSINDHDR" > $EFI_OSIND
if [ $? -eq 0 ]
then
echo "Success. The system will boot to UEFI setup at next reboot."
exit 0 # EX_OK
else
echo "FAIL: could not update the OsIndications UEFI variable."
exit 69 # EX_UNAVAILABLE
fi
Как указал @UmairKhan, расширение тильды не работает внутри двойных -кавычек, поэтому оператор
if is_symlink_to "~/$file" "$dir/$file" ; then
будет искать файл (в вашем примере).bash_profile
внутри каталога буквально с именем ~
внутри вашего текущего каталога, а не внутри вашего домашнего каталога.
Это должно работать, если вы заключите в круглые скобки только фактическую «переменную часть bash», как в
if is_symlink_to ~/"$file" "$dir/$file"; then
Хотя полное отсутствие двойных скобок вокруг первого аргумента также сработает (is_symlink_to ~/$file "$dir/$file"
), это не рекомендуется, так как можно наткнуться на имена файлов со специальными символами.
~
в "~/$file"
трактуется буквально из-за окружающих кавычек.
В письменной форме это лучше представить как:
"${HOME}/$file"
Переменная ${HOME}
эквивалентна ~
и раскрывается в двойных кавычках.