Почему readlink говорит, что такого файла или каталога нет

В 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
-1
11.11.2019, 12:45
2 ответа

Как указал @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"), это не рекомендуется, так как можно наткнуться на имена файлов со специальными символами.

1
28.01.2020, 05:08

~в "~/$file"трактуется буквально из-за окружающих кавычек.

В письменной форме это лучше представить как:

"${HOME}/$file"

Переменная ${HOME}эквивалентна ~и раскрывается в двойных кавычках.

1
28.01.2020, 05:08

Теги

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