在bash脚本中,是否有任何可靠的方式(以编程方式)确定它是在笔记本电脑还是台式机上执行?
我显然可以提示用户问他们,但这很笨拙。
在bash脚本中,是否有任何可靠的方式(以编程方式)确定它是在笔记本电脑还是台式机上执行?
我显然可以提示用户问他们,但这很笨拙。
Answers:
查看系统是否有电池是不可靠的-与系统连接的UPS(不仅用于供电,还通过USB用于自动关机和电池监视)可能会显示为电池。
但是有一个很好的可靠方法:
dmidecode --string chassis-type
在笔记本电脑上,这将返回“笔记本电脑”,“笔记本”,“便携式”或“子笔记本”之一(取决于制造商在BIOS中编码的内容)。Windows 2000脚本指南的“ 标识计算机的机箱类型 ”中提供了可能值的完整列表-不用担心它是Microsoft TechNet页面,这不是特定于操作系统的。
dmidecode还可以获取有关硬件制造商,系统序列号(有时)等信息。
/sys/module/battery
?
Other
。
.bashrc
文件之类的东西。查询/sys/class/dmi/id/chassis_type
只是一个数字的内容要好得多(如下面的另一个答案所指出)。
要查找运行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
目录不存在。
我会检查计算机是否装有电池。以下是一种测试方法:
if [ -d /proc/acpi/battery/BAT* ]; then
echo has a battery
fi
BAT0
为BAT*
-它应该检测所有变化。
为避免使用sudo,您可以阅读的内容/sys/class/dmi/id/chassis_type
。它似乎符合下表:
如果检查电池是否足够好,可以使用以下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。
编辑:从该线程中的其他答案中总结来捕获更多案例。