LINUX.ORG.RU

LFS Разбираюсь со скриптом...

 , , ,


0

2

Не давнее как 12 числа сего месяца я все-таки скомпилил LFS 7.1. Сейчас сижу изучаю вот этот скрипт, который как видно отвечает за установку шрифта и раскладки клавиатуры. Из интересного всплыла такая фишка: даже если удалить подстроку ! is_true «${UNICODE}» в строке 47, Юникодные символы все равно нормально отображаются. Главное, чтобы в файле /etc/sysconfig/console переменная UNICODE равнялась единице. Получается что толку от тех проверок как с козла молока?!

Растолкуйте пожалуйста такое поведение, кто хорошо разбирается в баш скриптах

★★★★★
Ответ на: комментарий от ziemin

Я понял наоборот: если переменная юникод не установлена тогда завершение скрипта. В противном случае:

# Figure out the command to set the console into the
      # desired mode
      is_true "${UNICODE}" &&
         MODE_COMMAND="echo -en '\033%G' && kbd_mode -u" ||
         MODE_COMMAND="echo -en '\033%@\033(K' && kbd_mode -a"

Так как !true=false Не? sudo cast RiD

Twissel ★★★★★
() автор топика
Последнее исправление: Twissel (всего исправлений: 1)
Ответ на: комментарий от Twissel

Упс. Точно.

Этот фрагмент мог остаться от прошлых редакций скрипта. Получается всегда выполняется только первая команда.

ziemin ★★
()
Ответ на: комментарий от ziemin

Ну да. Значит я хоть и нуб, но внимательный нуб :) Ну да хрен с ним со скриптом.

Похоже сами разработчки LFS мало времени уделили разбору инит-скриптов их дистрибутива по принципу «Работает и пофиг».

Кто захочет пусть высказывается в треде:D

Twissel ★★★★★
() автор топика

Хотя все правильно.

if[-z «string»] возвращает истину, если строка имеет нулевую длину. В случае наличия конфигурационного файла с параметрами это не так. Значит прогоняем весь скрипт настройки консоли. Вроде ясно.

Twissel ★★★★★
() автор топика
Последнее исправление: Twissel (всего исправлений: 1)
Ответ на: комментарий от emulek

Ну правильно, логическое И (&&) возвращает истину только если оба операнда истинны. Что ты этим хотел сказать?

Twissel ★★★★★
() автор топика
Ответ на: комментарий от Twissel

Ну правильно, логическое И (&&) возвращает истину только если оба операнда истинны. Что ты этим хотел сказать?

не совсем так. Ты не учитываешь того факта, что некоторые части выражения НЕ ВЫЧИСЛЯЮТСЯ. Называется ленивый оператор. В выражении false && echo ☣ второй операнд НЕ вычисляется.

Т.ч. про «оба» ты не прав. && вычисляет только ОДИН операнд, который слева, и если он ложный, второй не вычисляется. Ну а || тоже вычисляет один операнд, если он истинный. Потому такая вот хрень работает как

if false
then echo "this true"
else echo "this false"
fi

emulek
()
Ответ на: комментарий от emulek

Но, в силу вышеизложенного, зачем тогда сюда

if [ -z "${KEYMAP}"         ] && [ -z "${KEYMAP_CORRECTIONS}" ] &&
         [ -z "${FONT}"           ] && [ -z "${LEGACY_CHARSET}"     ] &&    
         ! is_true "${UNICODE}";
пихать проверку всех переменных?

Twissel ★★★★★
() автор топика
Ответ на: комментарий от Twissel

зачем тогда сюда

if [ -z "${KEYMAP}"         ] && [ -z "${KEYMAP_CORRECTIONS}" ] &&
         [ -z "${FONT}"           ] && [ -z "${LEGACY_CHARSET}"     ] &&    
         ! is_true "${UNICODE}";

пихать проверку всех переменных?

она проверяет последовательно размер всех переменных и останавливается как только встретит переменную с ненулевым размером. Если все переменные равны "", то выполняется is_true (это наверное функция), а результат противоположен тому, что даст функция. Если какая-то из переменных не "", то результат false.

emulek
()
Ответ на: комментарий от emulek

выполняется is_true (это наверное функция)

Совершенно правильно. Она проверяет установлена ли переменная в 1.

Ну и в этом посте LFS Разбираюсь со скриптом... (комментарий) я уже упомянул об этом.Второе предложение, разве нет?

Twissel ★★★★★
() автор топика
Последнее исправление: Twissel (всего исправлений: 1)
Ответ на: комментарий от emulek

В любом случае спасибо, что напомнил о «ленивых» вычислениях :)

Twissel ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.