以编程方式确定脚本是在笔记本电脑还是台式机上执行?

Pse*_*che 18 linux shell-script

是否有任何可靠的方法可以从 bash 脚本中(以编程方式)确定它是在笔记本电脑还是台式计算机上执行的?

我显然可以提示用户询问他们,但这很笨拙。

Gra*_*ant 29

查看系统是否有电池是不可靠的 - 连接到系统的 UPS(不仅用于电源,而且通过 USB 以及用于自动关闭和电池监控)可能会显示为电池。

然而,有一个很好的可靠方法:

dmidecode --string chassis-type
Run Code Online (Sandbox Code Playgroud)

在笔记本电脑上,这将返回“笔记本电脑”、“笔记本电脑”、“便携式”或“子笔记本电脑”之一(取决于制造商在 BIOS 中编码的内容)。Windows 2000 脚本指南中的“识别计算机的机箱类型”中有可能值的完整列表- 不要担心它是 Microsoft TechNet 页面,这不是特定于操作系统的。

dmidecode 还可以获取有关硬件制造商、系统序列号(有时)等的信息。


dem*_*ure 11

为避免使用 sudo,您可以阅读/sys/class/dmi/id/chassis_type. 它似乎符合下表:

  • 1 其他
  • 2 未知
  • 3 桌面
  • 4 低调桌面
  • 5 披萨盒
  • 6 迷你塔
  • 7 塔
  • 8 便携
  • 9 笔记本电脑
  • 10 笔记本
  • 11 手持
  • 12 扩展坞
  • 13 合一
  • 14 子笔记本
  • 15 节省空间
  • 16 饭盒
  • 17 主系统机箱
  • 18 扩展机箱
  • 19 子机箱
  • 20总线扩展机箱
  • 21 外围机箱
  • 22 存储机箱
  • 23 机架式机箱
  • 24 密封外壳 PC

  • 表的来源?“饭盒”是个笑话吗? (2认同)
  • @OJFord 我目前没有引用。至于“午餐盒”,它是一种外形尺寸的昵称。我以前曾使用过一些午餐盒和披萨盒。虽然此链接可能不会持续几年,但您可以看到一些非常现代的午餐盒计算机http://www.theportablepc.com/portable-pc.html (2认同)

Joh*_*024 9

Debian 解决方案:

要确定运行 Debian 的机器是否是笔记本电脑,请尝试:

[ -d /sys/module/battery ] && echo "Yes it's a laptop"
Run Code Online (Sandbox Code Playgroud)

这种方法不需要root特权。

然而,在其他发行版上,这个目录似乎存在,至少以骨架形式存在,无论是否有电池。从评论(下面)来看,这些发行版包括 CentOS、Ubuntu 和 Linux Mint 的 Ubuntu 衍生发行版。

更通用的解决方案

虽然它不适用于我的 Debian 系统,据报道Alex 提出的解决方案适用于 Ubuntu 和 CentOS。因此,为了更一般性,建议一种可能的组合解决方案:

[ -f /sys/module/battery/initstate ] || [ -d /proc/acpi/battery/BAT0 ] && echo "Yes it's a laptop"
Run Code Online (Sandbox Code Playgroud)

这种方法不需要root特权。

更多细节

在带有实际电池的 Debian 系统上,该/sys/module/battery目录包含许多文件。一个这样的文件是/sys/module/battery/initstate包含文本live. 然而,在 Ubuntu 上,这些文件甚至在实际的笔记本电脑上也不存在。因此,该文件的存在似乎/sys/module/battery/initstate可用于测试运行 Debian 的笔记本电脑。

相比之下,在我测试的 Debian 系统上,该/proc/acpi/battery目录不存在。

  • @PseudoPsyche 我刚刚在带有 UPS 的台式机上对其进行了测试,结果返回 false(不是笔记本电脑)。 (3认同)

Ale*_*lex 8

我会检查计算机是否安装了电池。以下是一种测试方法:

if [ -d /proc/acpi/battery/BAT* ]; then
  echo has a battery
fi
Run Code Online (Sandbox Code Playgroud)