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 root
uprawnień.
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 root
uprawnień.
W systemie Debian z rzeczywistą baterią /sys/module/battery
katalog zawiera wiele plików. Jednym z takich plików jest /sys/module/battery/initstate
tekst live
. Jednak w Ubuntu pliki te nie istnieją nawet na rzeczywistych laptopach. Wygląda więc na to, że obecność pliku /sys/module/battery/initstate
może być użyta do przetestowania laptopa z systemem Debian.
Natomiast w testowanych systemach Debian /proc/acpi/battery
katalog 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
BAT0
na 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.