¿Hay alguna forma confiable de determinar (mediante programación) desde un script bash si se ejecuta en una computadora portátil o de escritorio?
Obviamente, podría pedirle al usuario que les pregunte, pero eso es bastante torpe.
¿Hay alguna forma confiable de determinar (mediante programación) desde un script bash si se ejecuta en una computadora portátil o de escritorio?
Obviamente, podría pedirle al usuario que les pregunte, pero eso es bastante torpe.
Respuestas:
Observar si el sistema tiene o no una batería no es confiable: un UPS conectado al sistema (no solo por alimentación, sino también por USB para apagado automático y monitoreo de batería) puede aparecer como una batería.
Sin embargo, hay una buena manera confiable:
dmidecode --string chassis-type
En una computadora portátil, esto devolverá uno de "Laptop", "Notebook", "Portable" o "Sub Notebook" (según lo que el fabricante haya codificado en el BIOS). Hay una lista completa de posibles valores en " Identificación del tipo de chasis de una computadora " en la Guía de secuencias de comandos de Windows 2000; no se preocupe por ser una página de Microsoft TechNet, esto no es específico del sistema operativo.
dmidecode también puede obtener información sobre el fabricante del hardware, el número de serie del sistema (a veces), etc.
/sys/module/battery
?
Other
.
.bashrc
archivos. Consultar el contenido de /sys/class/dmi/id/chassis_type
, que es solo un número, es mucho mejor (como señaló otra respuesta a continuación).
Para saber si una máquina que ejecuta Debian es una computadora portátil, intente:
[ -d /sys/module/battery ] && echo "Yes it's a laptop"
Este enfoque no requiere root
privilegios.
Sin embargo, en otras distribuciones, este directorio parece existir, al menos en forma de esqueleto, independientemente de si hay o no una batería. De los comentarios (a continuación), estas distribuciones incluyen CentOS, Ubuntu y la distribución de Linux Mint derivada de Ubuntu.
Aunque no funciona en mis sistemas Debian, la solución propuesta por Alex funciona en Ubuntu y CentOS. Por lo tanto, sugiere, para una mayor generalidad, una posible solución combinada:
[ -f /sys/module/battery/initstate ] || [ -d /proc/acpi/battery/BAT0 ] && echo "Yes it's a laptop"
Este enfoque no requiere root
privilegios.
En un sistema Debian con una batería real, el /sys/module/battery
directorio contiene muchos archivos. Uno de esos archivos es el /sys/module/battery/initstate
que contiene el texto live
. Sin embargo, en Ubuntu, estos archivos no existen incluso en las computadoras portátiles reales. Por lo tanto, parece que la presencia del archivo /sys/module/battery/initstate
se puede utilizar para probar una computadora portátil con Debian.
En los sistemas Debian que probé, por el contrario, el /proc/acpi/battery
directorio no existía.
Verificaría si la computadora tiene una batería instalada. Y la siguiente es una forma de probar:
if [ -d /proc/acpi/battery/BAT* ]; then
echo has a battery
fi
BAT0
to BAT*
: debería detectar todas las variaciones.
Para evitar usar sudo, puede leer el contenido de /sys/class/dmi/id/chassis_type
. Parece cumplir con la siguiente tabla:
Si verificar la existencia de la batería es lo suficientemente bueno, puede usar esta función de 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
}
He estado usando esto en Debian durante años. Tenga en cuenta que esto también funciona para Debian ejecutándose en WSL o virtualbox.
Editar: generalizado de otras respuestas en este hilo para capturar más casos.