ラップトップまたはデスクトップコンピューターで実行されている場合、bashスクリプト内から(プログラムで)判断する信頼できる方法はありますか?
私は明らかにユーザーにそれらを尋ねるように促すことができますが、それはかなり不格好です。
ラップトップまたはデスクトップコンピューターで実行されている場合、bashスクリプト内から(プログラムで)判断する信頼できる方法はありますか?
私は明らかにユーザーにそれらを尋ねるように促すことができますが、それはかなり不格好です。
回答:
システムにバッテリーがあるかどうかを確認することは信頼できません-システムに接続されたUPS(電源だけでなく、USB経由で自動シャットダウンとバッテリー監視にも)がバッテリーとして表示されることがあります。
しかし、素晴らしい信頼できる方法があります:
dmidecode --string chassis-type
ラップトップでは、これは「ラップトップ」、「ノートブック」、「ポータブル」、または「サブノートブック」のいずれかを返します(製造元がBIOSにコーディングしたものに応じて)。Windows 2000スクリプティングガイドの「コンピュータのシャーシタイプの識別」に可能な値の完全なリストがあります。MicrosoftTechNetページであるかどうかは心配しないでください。これはOS固有ではありません。
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 MintのUbuntu派生ディストリビューションが含まれています。
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
ディレクトリに多くのファイルが含まれています。そのようなファイルの1つ/sys/module/battery/initstate
に、テキストが含まれていますlive
。ただし、Ubuntuでは、これらのファイルは実際のラップトップ上にも存在しません。したがって、このファイルの存在は、/sys/module/battery/initstate
Debianを実行しているラップトップのテストに使用できるようです。
対照的に、私がテストしたDebianシステムでは、/proc/acpi/battery
ディレクトリは存在しませんでした。
コンピューターにバッテリーが取り付けられているかどうかを確認します。そして、以下はテストする1つの方法です。
if [ -d /proc/acpi/battery/BAT* ]; then
echo has a battery
fi
BAT0
先BAT*
-すべてのバリエーションを検出するはずです。
sudoの使用を避けるために、の内容を読むことができます/sys/class/dmi/id/chassis_type
。次の表に準拠しているようです。
バッテリーの存在を確認するだけで十分であれば、次のシェル関数を使用できます。
# 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でも機能することに注意してください。
編集:より多くのケースをキャッチするために、このスレッドの他の回答から一般化。