Есть ли надежный способ (программно) определить из сценария bash, выполняется ли он на ноутбуке или настольном компьютере?
Очевидно, я мог бы просто попросить пользователя спросить их, но это довольно неуклюже.
Есть ли надежный способ (программно) определить из сценария bash, выполняется ли он на ноутбуке или настольном компьютере?
Очевидно, я мог бы просто попросить пользователя спросить их, но это довольно неуклюже.
Ответы:
Ненадежность проверки того, есть ли в системе аккумулятор, не соответствует действительности - ИБП, подключенный к системе (не только для питания, но и через 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, решение, предложенное Алексом, работает на 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*
- это должно обнаружить все изменения.
Чтобы не использовать 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 или virtualbox.
Изменить: обобщено из других ответов в этой теме, чтобы поймать больше случаев.