Có cách nào đáng tin cậy để xác định (lập trình) từ trong tập lệnh bash nếu nó được thực thi trên máy tính xách tay hoặc máy tính để bàn không?
Tôi rõ ràng có thể chỉ nhắc người dùng hỏi họ, nhưng điều đó khá là rắc rối.
Có cách nào đáng tin cậy để xác định (lập trình) từ trong tập lệnh bash nếu nó được thực thi trên máy tính xách tay hoặc máy tính để bàn không?
Tôi rõ ràng có thể chỉ nhắc người dùng hỏi họ, nhưng điều đó khá là rắc rối.
Câu trả lời:
Nhìn vào việc hệ thống có pin hay không không đáng tin cậy - một UPS được kết nối với hệ thống (không chỉ để cấp nguồn, mà qua USB cũng như tự động tắt và theo dõi pin) có thể hiển thị dưới dạng pin.
Có một cách đáng tin cậy tuy nhiên:
dmidecode --string chassis-type
Trên máy tính xách tay, điều này sẽ trả về một trong "Máy tính xách tay", "Máy tính xách tay" "Máy tính xách tay" hoặc "Máy tính xách tay phụ" (tùy thuộc vào những gì nhà sản xuất mã hóa vào BIOS). Có một danh sách đầy đủ các giá trị có thể có tại " Xác định loại khung gầm của máy tính " trong Hướng dẫn tập lệnh Windows 2000 - đừng lo lắng về việc nó là trang Microsoft TechNet, đây không phải là hệ điều hành cụ thể.
dmidecode cũng có thể lấy thông tin về nhà sản xuất phần cứng, số sê-ri hệ thống (đôi khi), v.v.
/sys/module/battery
?
Other
.
.bashrc
tệp. Truy vấn nội dung của /sys/class/dmi/id/chassis_type
, chỉ là một số duy nhất, tốt hơn nhiều (như một câu trả lời khác dưới đây đã chỉ ra).
Để tìm hiểu xem máy chạy Debian có phải là máy tính xách tay hay không, hãy thử:
[ -d /sys/module/battery ] && echo "Yes it's a laptop"
Cách tiếp cận này không yêu cầu root
đặc quyền.
Tuy nhiên, trên các bản phân phối khác, thư mục này dường như tồn tại, ít nhất là ở dạng bộ xương, bất kể có hay không có pin. Từ các bình luận (bên dưới), các bản phân phối này bao gồm CentOS, Ubuntu và bản phân phối Linux Mint có nguồn gốc từ Ubuntu.
Mặc dù nó không hoạt động trên các hệ thống Debian của tôi, nhưng giải pháp do Alex đề xuất được báo cáo là hoạt động trên Ubuntu & CentOS. Do đó, cho thấy, cho tính tổng quát cao hơn, một giải pháp kết hợp có thể:
[ -f /sys/module/battery/initstate ] || [ -d /proc/acpi/battery/BAT0 ] && echo "Yes it's a laptop"
Cách tiếp cận này không yêu cầu root
đặc quyền.
Trên hệ thống Debian có pin thực tế, /sys/module/battery
thư mục chứa nhiều tệp. Một tập tin như vậy /sys/module/battery/initstate
chứa văn bản live
. Tuy nhiên, trên Ubuntu, các tệp này không tồn tại ngay cả trên máy tính xách tay thực tế. Do đó, có vẻ như sự hiện diện của tệp /sys/module/battery/initstate
có thể được sử dụng để kiểm tra máy tính xách tay chạy Debian.
Trên các hệ thống Debian mà tôi đã kiểm tra, ngược lại, /proc/acpi/battery
thư mục không tồn tại.
Tôi sẽ kiểm tra xem máy tính có lắp pin không. Và sau đây là một cách để kiểm tra:
if [ -d /proc/acpi/battery/BAT* ]; then
echo has a battery
fi
BAT0
thành BAT*
- nó sẽ phát hiện tất cả các biến thể.
Để tránh sử dụng sudo, bạn có thể đọc nội dung của /sys/class/dmi/id/chassis_type
. Nó xuất hiện phù hợp với bảng sau:
Nếu kiểm tra sự tồn tại của pin là đủ tốt, bạn có thể sử dụng chức năng vỏ này:
# 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
}
Đã sử dụng điều này trên Debian trong nhiều năm. Lưu ý rằng điều này cũng hoạt động đối với Debian chạy trong WSL hoặc hộp ảo.
Chỉnh sửa: khái quát từ các câu trả lời khác trong chủ đề này để bắt nhiều trường hợp hơn.