Esiste un modo affidabile per determinare (programmaticamente) dall'interno di uno script bash se viene eseguito su un laptop o un computer desktop?
Ovviamente potrei semplicemente chiedere all'utente di chiedere loro, ma è piuttosto goffo.
Esiste un modo affidabile per determinare (programmaticamente) dall'interno di uno script bash se viene eseguito su un laptop o un computer desktop?
Ovviamente potrei semplicemente chiedere all'utente di chiedere loro, ma è piuttosto goffo.
Risposte:
Controllare se il sistema ha una batteria non è affidabile: un UPS collegato al sistema (non solo per l'alimentazione, ma tramite USB anche per l'arresto automatico e il monitoraggio della batteria) può apparire come una batteria.
Esiste comunque un modo affidabile e affidabile:
dmidecode --string chassis-type
Su un laptop, questo restituirà uno di "Laptop", "Notebook" "Portable" o "Sub Notebook" (a seconda di ciò che il produttore ha codificato nel BIOS). C'è un elenco completo di possibili valori in " Identificazione del tipo di telaio di un computer " nella Guida agli script di Windows 2000. Non preoccuparti che si tratti di una pagina Microsoft TechNet, questo non è specifico del sistema operativo.
dmidecode può anche ottenere informazioni sul produttore dell'hardware, il numero di serie del sistema (a volte), ecc.
/sys/module/battery
?
Other
.
.bashrc
file. Interrogare il contenuto di /sys/class/dmi/id/chassis_type
, che è solo un singolo numero, è molto meglio (come sottolineato un'altra risposta di seguito).
Per scoprire se una macchina che esegue Debian è un laptop, prova:
[ -d /sys/module/battery ] && echo "Yes it's a laptop"
Questo approccio non richiede root
privilegi.
Su altre distribuzioni, tuttavia, questa directory sembra esistere, almeno in forma di scheletro, indipendentemente dal fatto che ci sia o meno una batteria. Dai commenti (sotto), queste distribuzioni includono CentOS, Ubuntu e la distribuzione derivata da Ubuntu di Linux Mint.
Sebbene non funzioni sui miei sistemi Debian, secondo quanto riferito la soluzione proposta da Alex funziona su Ubuntu e CentOS. Pertanto suggerisce, per maggior generalità, una possibile soluzione combinata:
[ -f /sys/module/battery/initstate ] || [ -d /proc/acpi/battery/BAT0 ] && echo "Yes it's a laptop"
Questo approccio non richiede root
privilegi.
Su un sistema Debian con una batteria reale, la /sys/module/battery
directory contiene molti file. Uno di questi file è /sys/module/battery/initstate
che contiene il testo live
. Su Ubuntu, tuttavia, questi file non esistono nemmeno su laptop reali. Quindi, sembra che la presenza del file /sys/module/battery/initstate
possa essere usata per testare un laptop che esegue Debian.
Sui sistemi Debian che ho testato, al contrario, la /proc/acpi/battery
directory non esisteva.
Verificherei se sul computer è installata una batteria. E il seguente è un modo per testare:
if [ -d /proc/acpi/battery/BAT* ]; then
echo has a battery
fi
BAT0
a BAT*
: dovrebbe rilevare tutte le variazioni.
Per evitare di usare sudo, puoi leggere il contenuto di /sys/class/dmi/id/chassis_type
. Sembra conforme alla seguente tabella:
Se il controllo dell'esistenza della batteria è abbastanza buono, puoi usare questa funzione shell:
# 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
}
Lo uso su Debian da anni. Nota che funziona anche con Debian in esecuzione in WSL o virtualbox.
Modifica: generalizzato da altre risposte in questo thread per catturare più casi.