Есть ли надежный способ (программно) определить из сценария bash, выполняется ли он на ноутбуке или настольном компьютере?
Очевидно, я мог бы просто попросить пользователя спросить их, но это довольно неуклюже.
Есть ли надежный способ (программно) определить из сценария bash, выполняется ли он на ноутбуке или настольном компьютере?
Очевидно, я мог бы просто попросить пользователя спросить их, но это довольно неуклюже.
Ненадежность проверки того, есть ли в системе аккумулятор, не соответствует действительности - ИБП, подключенный к системе (не только для питания, но и через USB, а также для автоматического отключения и мониторинга аккумулятора), может отображаться в качестве аккумулятора.
Однако есть хороший надежный способ:
dmidecode --string chassis-type
На ноутбуке будет возвращено одно из следующих значений:"Портативный компьютер", "Ноутбук", "Портативный" или "Дополнительный ноутбук" (в зависимости от того, что производитель закодировал в BIOS). Полный список возможных значений см. В разделе « Определение типа корпуса компьютера » в Руководстве по созданию сценариев Windows 2000 - не беспокойтесь, если это страница Microsoft TechNet, это не зависит от конкретной ОС.
dmidecode также может получить информацию о производителе оборудования, серийном номере системы (иногда) и т. д.
Чтобы определить, является ли машина с Debian ноутбуком, попробуйте:
[ -d /sys/module/battery ] && echo "Yes it's a laptop"
Этот подход не требует привилегий root
.
Однако в других дистрибутивах этот каталог, по-видимому, существует, по крайней мере, в виде скелета, независимо от того, есть ли батарея. Из комментариев (ниже) эти дистрибутивы включают CentOS, Ubuntu и производный от Ubuntu дистрибутив Linux Mint.
Хотя это решение не работает на моих системах Debian, решение, предложенное Алексом, работает на Ubuntu & CentOS. Таким образом, для большей общности предлагается возможное комбинированное решение:
[ -f /sys/module/battery/initstate ] || [ -d /proc/acpi/battery/BAT0 ] && echo "Yes it's a laptop"
Этот подход не требует привилегий root
.
В системе Debian с реальной батареей каталог /sys/module/battery
содержит много файлов. Одним из таких файлов является /sys/module/battery/initstate
который содержит текст в live
. Однако в Ubuntu эти файлы не существуют даже на реальных ноутбуках. Таким образом, похоже, что наличие файла /sys/module/battery/initstate
можно использовать для тестирования ноутбука с Debian.
В системах Debian, которые я тестировал, каталог /proc/acpi/battery
не существовал.
Я бы проверил, установлен ли на компьютере аккумулятор. И вот один из способов проверить:
if [ -d /proc/acpi/battery/BAT* ]; then
echo has a battery
fi
Чтобы избежать использования sudo, вы можете прочитать содержимое /sys/class/dmi/id/chassis_type
. Похоже, соответствуют следующей таблице:
Если проверка наличия батареи достаточно хороша, вы можете использовать эту функцию оболочки:
# Checks whether system is a laptop.
#
# @returns {bool} true if system is a laptop.
function is_laptop() {
local d
for d in /sys/class/power_supply /proc/acpi/battery; do
[[ -d "$d" ]] && find $d -mindepth 1 -maxdepth 1 -name 'BAT*' -print0 -quit 2>/dev/null | grep -q . && return 0
done
# note we're checking /sys/class/power_supply/battery/status for WSL
for d in /sys/class/power_supply/battery/status /sys/module/battery/initstate; do
[[ -f "$d" ]] && return 0
done
return 1
}
Использую это в Debian в течение многих лет. Обратите внимание, что это работает также для Debian, работающего в WSL.
Изменить: обобщено из других ответов в этой теме, чтобы поймать больше случаев.