Согласно вашим выводам 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 и посмотреть, соответствует ли он вашим требованиям на данный момент.
Цикл 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
для установки подсказки выбора во втором цикле.