Czy istnieje jakiś niezawodny sposób na określenie (programowo) z poziomu skryptu bash, czy jest wykonywany na laptopie czy komputerze stacjonarnym?
Mógłbym oczywiście zachęcić użytkownika do zadawania pytań, ale jest to dość niezręczne.
Czy istnieje jakiś niezawodny sposób na określenie (programowo) z poziomu skryptu bash, czy jest wykonywany na laptopie czy komputerze stacjonarnym?
Mógłbym oczywiście zachęcić użytkownika do zadawania pytań, ale jest to dość niezręczne.
Odpowiedzi:
Sprawdzanie, czy system ma baterię, nie jest niezawodne - zasilacz UPS podłączony do systemu (nie tylko w celu zasilania, ale także przez USB, a także w celu automatycznego wyłączania i monitorowania baterii) może pojawić się jako bateria.
Istnieje jednak niezawodny sposób:
dmidecode --string chassis-type
Na laptopie zwróci jeden z „Laptop”, „Notebook”, „Portable” lub „Sub Notebook” (w zależności od tego, co producent zakodował w systemie BIOS). Pełna lista możliwych wartości znajduje się w „ Identyfikowaniu typu obudowy komputera ” w Przewodniku skryptów Windows 2000 - nie martw się, że jest to strona Microsoft TechNet, nie jest to specyficzne dla systemu operacyjnego.
Kod dmidecode może również uzyskać informacje o producencie sprzętu, numerze seryjnym systemu (czasami) itp.
/sys/module/battery?
Other.
Aby sprawdzić, czy komputer z systemem Debian jest laptopem, spróbuj:
[ -d /sys/module/battery ] && echo "Yes it's a laptop"
To podejście nie wymaga rootuprawnień.
Jednak w innych dystrybucjach ten katalog wydaje się istnieć, przynajmniej w formie szkieletu, niezależnie od tego, czy jest bateria. Z komentarzy (poniżej), te dystrybucje obejmują CentOS, Ubuntu i pochodzącą z Ubuntu dystrybucję Linux Mint.
Chociaż nie działa na moich systemach Debian, rozwiązanie zaproponowane przez Alexa podobno działa na Ubuntu i CentOS. Dlatego sugeruje, dla większej ogólności, możliwe połączone rozwiązanie:
[ -f /sys/module/battery/initstate ] || [ -d /proc/acpi/battery/BAT0 ] && echo "Yes it's a laptop"
To podejście nie wymaga rootuprawnień.
W systemie Debian z rzeczywistą baterią /sys/module/batterykatalog zawiera wiele plików. Jednym z takich plików jest /sys/module/battery/initstatetekst live. Jednak w Ubuntu pliki te nie istnieją nawet na rzeczywistych laptopach. Wygląda więc na to, że obecność pliku /sys/module/battery/initstatemoże być użyta do przetestowania laptopa z systemem Debian.
Natomiast w testowanych systemach Debian /proc/acpi/batterykatalog nie istniał.
Sprawdziłbym, czy komputer ma zainstalowaną baterię. Oto jeden ze sposobów testowania:
if [ -d /proc/acpi/battery/BAT* ]; then
echo has a battery
fi
BAT0na BAT*- powinien wykryć wszystkie odmiany.
Aby uniknąć używania sudo, możesz przeczytać zawartość /sys/class/dmi/id/chassis_type. Wygląda na to, że jest zgodny z następującą tabelą:
Jeśli sprawdzanie obecności baterii jest wystarczające, możesz użyć tej funkcji powłoki:
# 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
}
Używam tego na Debianie od lat. Zauważ, że działa to również dla Debiana działającego w WSL.
Edycja: uogólniona na podstawie innych odpowiedzi w tym wątku, aby złapać więcej przypadków.