18

Есть ли надежный способ (программно) определить из сценария bash, выполняется ли он на ноутбуке или настольном компьютере?

Очевидно, я мог бы просто попросить пользователя спросить их, но это довольно неуклюже.

5 ответов5

27

Ненадежность проверки того, есть ли в системе аккумулятор, не соответствует действительности - ИБП, подключенный к системе (не только для питания, но и через USB, а также для автоматического отключения и мониторинга аккумулятора), может отображаться в качестве аккумулятора.

Однако есть хороший надежный способ:

dmidecode --string chassis-type

На ноутбуке будет возвращено одно из следующих значений:"Портативный компьютер", "Ноутбук", "Портативный" или "Дополнительный ноутбук" (в зависимости от того, что производитель закодировал в BIOS). Полный список возможных значений см. В разделе « Определение типа корпуса компьютера » в Руководстве по созданию сценариев Windows 2000 - не беспокойтесь, если это страница Microsoft TechNet, это не зависит от конкретной ОС.

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

9

Решение Debian:

Чтобы определить, является ли машина с 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 не существовал.

9

Я бы проверил, установлен ли на компьютере аккумулятор. И вот один из способов проверить:

if [ -d /proc/acpi/battery/BAT* ]; then
  echo has a battery
fi
6

Чтобы избежать использования sudo, вы можете прочитать содержимое /sys/class/dmi/id/chassis_type . Похоже, соответствуют следующей таблице:

  • 1 Другое
  • 2 Неизвестный
  • 3 Рабочий стол
  • 4 Низкопрофильный рабочий стол
  • 5 Pizza Box
  • 6 Мини Тауэр
  • 7 Башня
  • 8 Портативный
  • 9 Ноутбук
  • 10 ноутбуков
  • 11 Ручной
  • 12 док-станция
  • 13 все в одном
  • 14 Sub Notebook
  • 15 Экономия места
  • 16 Ланч-бокс
  • 17 Основное системное шасси
  • 18 шасси расширения
  • 19 SubChassis
  • 20 Шасси Расширения Шины
  • 21 периферийное шасси
  • 22 Шасси для хранения
  • 23 Шасси для монтажа в стойку
  • 24 Герметичный ПК
0

Если проверка наличия батареи достаточно хороша, вы можете использовать эту функцию оболочки:

# 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.

Изменить: обобщено из других ответов в этой теме, чтобы поймать больше случаев.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .