Чи є якийсь надійний спосіб визначити (програмно) зсередини bash-сценарію, якщо він виконується на ноутбуці чи настільному комп'ютері?
Я, очевидно, міг просто запропонувати користувачеві запитати їх, але це досить незграбно.
Чи є якийсь надійний спосіб визначити (програмно) зсередини bash-сценарію, якщо він виконується на ноутбуці чи настільному комп'ютері?
Я, очевидно, міг просто запропонувати користувачеві запитати їх, але це досить незграбно.
Відповіді:
Дивлячись на те, чи є в системі акумулятор, не є надійним - UPS, підключений до системи (не тільки для живлення, але через USB, а також для автоматичного відключення та моніторингу акумулятора), може відображатися як акумулятор.
Однак є приємний надійний спосіб:
dmidecode --string chassis-type
На ноутбуці це поверне один із "Ноутбуків", "Ноутбуків", "Портативних" або "Підручників" (залежно від того, що виробник закодував у BIOS). Повний список можливих значень на сторінці " Визначення типу корпусу комп'ютера " в Посібнику з сценаріїв Windows 2000 - не хвилюйтеся, що це сторінка Microsoft TechNet, це не стосується ОС.
dmidecode також може отримати інформацію про виробника обладнання, серійний номер системи (іноді) тощо.
/sys/module/battery
?
Other
.
.bashrc
файли. Запит на вміст /sys/class/dmi/id/chassis_type
, який є лише одним числом, набагато краще (як вказується інша відповідь нижче).
Щоб дізнатись, чи є машина, на якій працює Debian, ноутбук, спробуйте:
[ -d /sys/module/battery ] && echo "Yes it's a laptop"
Цей підхід не вимагає root
пільг.
Однак в інших дистрибутивах цей каталог, здається, існує, принаймні, в скелетному вигляді, незалежно від того, є чи немає акумулятора. З коментарів (нижче), ці дистрибутиви включають CentOS, Ubuntu та розподілену Ubuntu розподілу Linux Mint.
Хоча це не працює на моїх системах Debian, рішення, запропоноване Alex, як повідомляється, працює на 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
BAT0
на BAT*
- він повинен виявити всі зміни.
Щоб уникнути використання судо, ви можете прочитати вміст /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 або virtualbox.
Редагувати: узагальнено з інших відповідей у цій темі, щоб знайти більше випадків.