Два пункта меню в сценарии Bash

Согласно вашим выводам lspci, ваша система имеет два графических процессора :, ЦП -со встроенным iGPU Intel и дискретный графический процессор NVidia. В графических процессорах NVidia это называется технологией «Optimus». Чтобы использовать оба графических процессора, вам необходимо загрузить драйверы для них обоих. У вас установлен пакет xserver-xorg-video-nouveau?

Возможно, только внутренний дисплей ноутбука подключен к Intel iGPU, а все остальные разъемы дисплея подключены к графическому процессору NVidia.

Существует два возможных способа реализации такой системы :либо наличие аппаратного переключателя (, также известного как мультиплексор ), который может переключать некоторые или все выходы дисплея между графическими процессорами, либо аппаратный переключатель опущен, и вместо этого используются программные решения для передачи графических данных между одним графическим процессором и другим, когда это необходимо.

Если имеется аппаратный мультиплексор, совместимый с Optimus -, он должен быть доступен через подсистему vga-switcheroo. Вы можете узнать больше, смонтировав debugfsвиртуальную файловую систему(mount -t debugfs none /sys/kernel/debug)и затем проверив, существует ли /sys/kernel/debug/vgaswitcheroo/switch. Но современные драйверы GPU могут управлять подсистемой vga-switcherooболее или менее автоматически.

После установки NVidia xserver-xorg-video-nouveauи перезагрузки системы она должна автоматически -обнаружить графический процессор NVidia и представить его как второго поставщика в выводе xrandr --listproviders.

С помощью драйвера с открытым -исходным кодом nouveauвы можете использовать xrandr --setprovideroutputsourceдля настройки соединения между графическими процессорами так, как вы хотите :либо с помощью iGPU для выполнения работы, либо просто с помощью Графический процессор NVidia просто как дополнительный набор разъемов дисплея (для экономии заряда батареи ноутбука )или для того, чтобы графический процессор NVidia создавал графику и просто использовал iGPU в качестве еще одного выхода (для повышения производительности графики ).

Добиться оптимальной работы системы с двумя -графическими процессорами не так просто, потому что разные производители делают вещи немного по-разному. В качестве альтернативы, настройки прошивки UEFI («Настройки BIOS» )могут включать возможность переключения с использованием только одного графического процессора, что иногда может переключать все выходы дисплея на единственный активный графический процессор, даже если нет ОС -присутствует управляемый мультиплексор. Если вы столкнулись с проблемами в настройке с двумя -GPU и вам нужна система в пригодной для использования конфигурации как можно скорее, вы можете попробовать переключить систему в режим с одним -GPU и посмотреть, соответствует ли он вашим требованиям на данный момент.

1
28.10.2021, 03:12
1 ответ

Цикл selectустановит optв параметр, выбранный пользователем, и установит $REPLYв то, что напечатал пользователь. Таким образом, если пользователь набрал 1в качестве ответа на ваш первый вопрос, $REPLYбудет 1, а $optбудет Elvis. Ни в коем случае $optне будет Option 1. Это упрощает написание операторов caseдля тестирования $REPLY, а не $opt.

Кроме того, слишком рано приветствовать человека по имени внутри цикла select, так как мы все еще можем не быть уверены, что у нас есть для него настоящее имя. Код между концом оператора caseи doneцикла selectзапускается, когда пользователь выбирает недопустимый выбор из меню (, вы также можете сделать это с помощью *)этикетка корпуса ).

Было бы лучше использовать более описательные имена переменных, такие как nameи family, и нам не нужны два отдельных массива для хранения параметров (на самом деле сомнительно, нужны ли вам массивы вообще в этом случае мы могли бы напрямую перечислить строки ).

В приведенном ниже коде я также заставил код заканчиваться на exit, если пользователь выбираетQuit(breakдля выхода из цикла select, и мы используем его, когда пользователь успешно выбрал имя ). Весь интерактивный диалог происходит в стандартном потоке ошибок, как это обычно бывает.

#!/bin/bash

PS3='Please enter your name from the list: '
options=("Elvis" "John" "Mark" "Manual input" "Quit")
select name in "${options[@]}"; do
    case $REPLY in
        1|2|3)
            break       # user picked name from list
            ;;
        4)
            echo 'Sorry your name is not in the list' >&2
            read -e -r -p "What's your name: " name
            break
            ;;
        5)
            echo 'Bye!' >&2
            exit
            ;;
   esac

   echo 'Try again!' >&2

done
printf 'Hello %s, now select your family name\n' "$name" >&2

PS3='Please enter your family name from the list: '
options=("Smith" "Brown" "Miller" "Manual input" "Quit")
select family in "${options[@]}"; do
    case $REPLY in
        1|2|3)
            break       # user picked name from list
            ;;
        4)
            echo 'Sorry your family is not in the list' >&2
            read -e -r -p "What's your family: " family
            ;;
        5)
            echo 'Bye!' >&2
            exit
            ;;
    esac

    echo 'Try again!' >&2

done

printf 'Welcome, %s %s!\n' "$name" "$family"

Другие мелкие исправления. :Используйте -rс read, чтобы иметь возможность правильно читать обратную косую черту, и вы использовали PS4вместо PS3для установки подсказки выбора во втором цикле.

1
28.10.2021, 14:31

Теги

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