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


18

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

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


1
我会说你为什么要知道?您是否担心电池寿命
Rich Homolka 2015年

3
该脚本正在为用户执行一些系统设置,如果设备是笔记本电脑,则其中一部分将配置一些节能设置。
PseudoPsyche 2015年

Answers:


29

查看系统是否有电池是不可靠的-与系统连接的UPS(不仅用于供电,还通过USB用于自动关机和电池监视)可能会显示为电池。

但是有一个很好的可靠方法:

dmidecode --string chassis-type

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

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


我有一个通过USB控制的UPS,可使用Network UPS Tool自动关机和监视电池。它是不会显示为桌面上的“电池”。您正在使用哪种配置来显示UPS /sys/module/battery
John1024

这比/ sys / module / battery方法更好:我的两个Ubuntu 14.04台式机分别回答“ Desktop”和“ Low Profile Desktop”,而装有CentOS 6.5的台式机回答“ Unknown”。使用CentOS 5.3的用户无法识别关键字“机箱类型”。我试过的笔记本电脑说“笔记本”。但这是您需要root用户访问权限的缺点。
Thomas Padron-McCarthy

我真的很喜欢这个答案!
Lembik

+1表示发行独立性。我在几台机器上成功测试了它。dmidecode给出的答案不那么有用的唯一机器是Aspire上网本,其机箱类型为Other
John1024

这个答案需要sudo,因此不适用于.bashrc文件之类的东西。查询/sys/class/dmi/id/chassis_type只是一个数字的内容要好得多(如下面的另一个答案所指出)。
xdavidliu

9

Debian解决方案:

要查找运行Debian的计算机是否是便携式计算机,请尝试:

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

这种方法不需要root特权。

但是,在其他发行版中,无论是否有电池,该目录似乎都存在,至少以骨架形式存在。从下面的评论中,这些发行版包括CentOS,Ubuntu和Ubuntu衍生的Linux Mint发行版。

更一般的解决方案

尽管它在我的Debian系统上不起作用,据说Alex提出的解决方案可在Ubuntu&CentOS上使用。因此,为了获得更大的普遍性,提出了一种可能的组合解决方案:

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

这种方法不需要root特权。

更多细节

在使用实际电池的Debian系统上,该/sys/module/battery目录包含许多文件。其中一个/sys/module/battery/initstate包含文本的文件live。但是,在Ubuntu上,即使在实际的笔记本电脑上也不存在这些文件。因此,看来该文件的存在/sys/module/battery/initstate可用于测试运行Debian的便携式计算机。

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


1
如果台式机带有UPS,第二个命令是否仍可能返回true?
PseudoPsyche 2015年

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

1
那第一个命令在那里做什么?
AndreKR 2015年

1
显然,我的通过USB插入APC SmartUPS的4U IBM服务器是一台笔记本电脑。我当然不会整天想把那东西放在我的腿上!(即,如果已插入UPS并配置为关机/监视,则该目录将存在)
授予

1
@Chipperyman “ UPS不在墙壁插座和计算机电源插座之间吗?”是的,许多UPS设置(包括消费者级别)都允许您连接USB电缆以获取电池信息和台式机警报。
JakeGould

8

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

if [ -d /proc/acpi/battery/BAT* ]; then
  echo has a battery
fi

这种方法在我尝试过的所有五台计算机上给出了正确的答案:两台装有Ubuntu 14.04的台式机,一台装有CentOS 5.3的台式机,一台装有CentOS 6.5的台式机和一台装有Ubuntu 14.04的笔记本电脑。另外,它不需要root访问。在答案的三种方法中,我的测试表明,这可能是最好的一种方法。
Thomas Padron-McCarthy

这对我有用。
Lembik

这在我测试过的两台Debian笔记本电脑上不起作用,但在其他各种重要发行版上却为+1
John1024

对我不起作用(东芝笔记本电脑),因为我的电池名为BAT1。我不知道还有多少其他可能的名字。
2015年

@Joe更改BAT0BAT*-它应该检测所有变化。
Alex

8

为避免使用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

该表的来源?“午餐盒”是个玩笑吗?
OJFord

1
@OJFord我目前没有被引用。至于“午餐盒”,它是外形的昵称。我之前曾处理过一些午餐盒和披萨盒。虽然此链接可能不过去几年中,你可以看到一些非常现代化的饭盒计算机theportablepc.com/portable-pc.html
娴静

1
格兰特的回答包含Microsoft引文:docs.microsoft.com/en-us/previous-versions/tn-archive/...
娴静

谢谢!现在我想要一个...但是我怀疑我的钱包没有。
OJFord

这是不需要sudo的唯一对我有用的解决方案。基于电池的解决方案要么说我的ubuntu桌面是一台笔记本电脑,要么说我的debian笔记本电脑是一台台式机。
xdavidliu

1

如果检查电池是否足够好,可以使用以下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
}

已经在Debian上使用了多年。请注意,这也适用于在WSL或virtualbox中运行的Debian。

编辑:从该线程中的其他答案中总结来捕获更多案例。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.