มีวิธีใดที่เชื่อถือได้ในการพิจารณา (โดยทางโปรแกรม) จากภายในสคริปต์ทุบตีถ้ามันถูกดำเนินการบนแล็ปท็อปหรือคอมพิวเตอร์เดสก์ท็อป?
เห็นได้ชัดว่าฉันเพียงแค่แจ้งให้ผู้ใช้ถามพวกเขา แต่นั่นเป็น clunky สวย
มีวิธีใดที่เชื่อถือได้ในการพิจารณา (โดยทางโปรแกรม) จากภายในสคริปต์ทุบตีถ้ามันถูกดำเนินการบนแล็ปท็อปหรือคอมพิวเตอร์เดสก์ท็อป?
เห็นได้ชัดว่าฉันเพียงแค่แจ้งให้ผู้ใช้ถามพวกเขา แต่นั่นเป็น clunky สวย
คำตอบ:
ดูว่าระบบมีแบตเตอรี่ไม่น่าเชื่อถือหรือไม่ - 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 และการกระจาย Linux ที่ได้รับจาก 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
บนระบบเดเบียนที่ฉันทดสอบในทางตรงกันข้าม/proc/acpi/battery
ไดเรกทอรีไม่มีอยู่
ฉันจะตรวจสอบว่าคอมพิวเตอร์มีแบตเตอรี่ติดตั้งอยู่หรือไม่ และต่อไปนี้เป็นวิธีหนึ่งในการทดสอบ:
if [ -d /proc/acpi/battery/BAT* ]; then
echo has a battery
fi
BAT0
to 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 มานานหลายปี โปรดทราบว่าวิธีนี้ใช้ได้สำหรับ Debian ที่ทำงานใน WSL หรือกล่องเสมือน
แก้ไข: สรุปจากคำตอบอื่น ๆ ในชุดข้อความนี้เพื่อจับรายกรณีเพิ่มเติม