Programaticamente determinar se um script está sendo executado no laptop ou desktop?

17

Existe alguma maneira confiável de determinar (programaticamente) a partir de um script bash se ele está sendo executado em um laptop ou em um computador desktop?

Eu poderia pedir ao usuário para perguntar, mas isso é muito desajeitado.

    
por PseudoPsyche 13.02.2015 / 21:21

5 respostas

26

Verificar se o sistema possui uma bateria não é confiável - um no-break conectado ao sistema (não apenas para alimentação, mas via USB, bem como para desligamento automático e monitoramento de bateria) pode aparecer como uma bateria.

No entanto, existe uma maneira confiável:

dmidecode --string chassis-type

Em um laptop, isso retornará um dos "Laptop", "Notebook" "Portable" ou "Sub Notebook" (dependendo do que o fabricante codificou no BIOS). Há uma lista completa de valores possíveis em " Identificando o tipo de chassi de um computador " no Guia de Scripts do Windows 2000 - não se preocupe em ser uma página do Microsoft TechNet, isso não é específico do SO.

O

dmidecode também pode obter informações sobre o fabricante do hardware, o número de série do sistema (às vezes), etc.

    
por 14.02.2015 / 04:40
9

Eu verifico se o computador tem uma bateria instalada. E o seguinte é uma maneira de testar:

if [ -d /proc/acpi/battery/BAT* ]; then
  echo has a battery
fi
    
por 13.02.2015 / 21:39
9

Solução Debian:

Para descobrir se uma máquina rodando Debian é um laptop, tente:

[ -d /sys/module/battery ] && echo "Yes it's a laptop"

Essa abordagem não exige root privileges.

Em outras distribuições, no entanto, esse diretório parece existir, pelo menos na forma de esqueleto, independentemente de haver ou não uma bateria. A partir dos comentários (abaixo), essas distribuições incluem CentOS, Ubuntu e a distribuição derivada do Ubuntu do Linux Mint.

Mais solução geral

Embora não funcione em meus sistemas Debian, a solução proposta por Alex supostamente funciona no Ubuntu & CentOS Assim sugere, para maior generalidade, uma solução combinada possível:

[ -f /sys/module/battery/initstate ] || [ -d /proc/acpi/battery/BAT0 ] && echo "Yes it's a laptop"

Essa abordagem não exige root privileges.

Mais detalhes

Em um sistema Debian com uma bateria real, o diretório /sys/module/battery contém muitos arquivos. Um desses arquivos é /sys/module/battery/initstate , que contém o texto live . No Ubuntu, no entanto, esses arquivos não existem mesmo em laptops reais. Assim, parece que a presença do arquivo /sys/module/battery/initstate pode ser usada para testar um laptop rodando Debian.

Nos sistemas Debian que testei, em contraste, o diretório /proc/acpi/battery não existia.

    
por 13.02.2015 / 21:28
5

Para evitar o uso do sudo, você pode ler o conteúdo de /sys/class/dmi/id/chassis_type . Aparece em conformidade com a seguinte tabela:

  • 1 Outro
  • 2 Desconhecido
  • 3 Desktop
  • 4 Desktop de baixo perfil
  • 5 caixas para pizza
  • 6 Mini Tower
  • 7 torre
  • 8 portáteis
  • 9 Laptop
  • 10 caderno
  • 11 Hand Held
  • 12 Docking Station
  • 13 Tudo em um
  • 14 Sub Notebook
  • 15 economia de espaço
  • 16 lancheira
  • 17 Chassi do sistema principal
  • 18 Chassi de expansão
  • 19 sub-chassi
  • Chassi de expansão de 20 ônibus
  • 21 Chassi periférico
  • 22 Chassi de armazenamento
  • 23 Chassi para montagem em rack
  • 24 PC com caixa selada
por 01.08.2016 / 00:53
0

Se a verificação da existência da bateria for boa o suficiente, você poderá usar esta função 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
}

Têm usado isso no Debian há anos. Note que isto funciona também para o Debian em execução no WSL.

Edit: generalizado de outras respostas neste tópico para capturar mais casos.

    
por 29.09.2016 / 16:02