Lập trình xác định nếu một tập lệnh đang được thực thi trên máy tính xách tay hoặc máy tính để bàn?


18

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.


1
Tôi muốn nói tại sao bạn cần biết? Bạn có lo lắng về thời lượng pin
Rich Homolka

3
Kịch bản đang thực hiện một số thiết lập hệ thống cho người dùng và một phần trong đó là định cấu hình một số cài đặt tiết kiệm năng lượng nếu thiết bị là máy tính xách tay.
PseudoPsyche 17/2/2015

Câu trả lời:


29

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.


Tôi có một UPS được điều khiển qua USB để tự động tắt và theo dõi pin với Công cụ Network UPS . Nó không hiển thị dưới dạng "pin" trên Bàn làm việc. Bạn đang sử dụng cấu hình nào mà theo đó UPS xuất hiện /sys/module/battery?
John1024

Cách này hoạt động tốt hơn so với phương pháp / sys / mô-đun / pin: Hai máy tính để bàn Ubuntu 14.04 của tôi lần lượt trả lời "Máy tính để bàn" và "Máy tính cấu hình thấp" và máy có CentOS 6.5 nói "Không xác định". Phiên bản có CentOS 5.3 không nhận ra từ khóa "kiểu khung gầm". Máy tính xách tay tôi đã thử nó nói "Notebook". Nhưng đó là một nhược điểm mà bạn cần quyền truy cập root.
Thomas Padron-McCarthy

Tôi thực sự thích câu trả lời này!
Lembik

+1 cho độc lập phân phối. Tôi đã thử nghiệm nó thành công trên một số máy. Máy duy nhất mà dmidecode đưa ra câu trả lời ít hữu ích hơn là netbook Aspire trả về loại khung Other.
John1024

Câu trả lời này yêu cầu sudo, vì vậy không khả thi đối với những thứ như .bashrctệ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).
xdavidliu

9

Giải pháp Debian:

Để 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.

Giải pháp tổng quát hơn

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.

Thêm chi tiết

Trên hệ thống Debian có pin thực tế, /sys/module/batterythư mục chứa nhiều tệp. Một tập tin như vậy /sys/module/battery/initstatechứ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/initstatecó 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/batterythư mục không tồn tại.


1
Không phải là lệnh thứ hai vẫn có thể trở lại đúng trong trường hợp máy tính để bàn có UPS?
PseudoPsyche

3
@PseudoPsyche Tôi vừa thử nó trên máy tính để bàn với một UPS và nó trả về sai (không phải máy tính xách tay).
John1024

1
Lệnh đầu tiên đang làm ở đó là gì?
AndreKR

1
Rõ ràng máy chủ IBM 4U của tôi với APC SmartUPS được cắm qua USB là một máy tính xách tay. Tôi chắc chắn sẽ không muốn thứ đó trong lòng cả ngày! (nghĩa là, nếu nó có một UPS được cắm và được cấu hình để tắt / giám sát, thư mục đó sẽ tồn tại)
Cấp

1
@Chipperyman, Không phải UPS đi giữa ổ cắm trên tường và ổ cắm điện máy tính sao? Có, và nhiều thiết lập của UPS bao gồm cả cấp độ người tiêu dùng cho phép bạn nối cáp USB để nhận thông tin và thông báo về pin trên máy tính để bàn của bạn.
JakeGould 14/2/2015

8

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

Phương pháp này đã đưa ra câu trả lời chính xác trên tất cả năm máy tính mà tôi đã thử trên: hai máy tính để bàn với Ubuntu 14.04, một máy tính để bàn với CentOS 5.3, một máy tính để bàn với CentOS 6.5 và một máy tính xách tay với Ubuntu 14.04. Ngoài ra, nó không yêu cầu quyền truy cập root. Trong ba phương pháp trong các câu trả lời, các thử nghiệm của tôi chỉ ra rằng đây có thể là phương pháp tốt nhất.
Thomas Padron-McCarthy

Điều này làm việc cho tôi.
Lembik

Điều này không hoạt động trên hai máy tính xách tay Debian mà tôi đã thử nghiệm nhưng +1 để hoạt động trên nhiều bản phân phối quan trọng khác.
John1024

Không hoạt động đối với tôi (Toshiba Notebook), vì pin của tôi có tên BAT1. Tôi không biết có bao nhiêu cái tên khác có thể có.
Joe

@Joe Thay đổi BAT0thành BAT*- nó sẽ phát hiện tất cả các biến thể.
Alex

8

Để 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:

  • 1 Khác
  • 2 Không biết
  • 3 máy tính để bàn
  • 4 máy tính để bàn cấu hình thấp
  • 5 hộp Pizza
  • 6 tháp nhỏ
  • Tháp 7
  • 8 xách tay
  • 9 máy tính xách tay
  • 10 quyển vở
  • 11 cầm tay
  • 12 trạm nối
  • 13 Tất cả trong một
  • 14 máy tính xách tay phụ
  • 15 tiết kiệm không gian
  • 16 hộp cơm trưa
  • 17 Khung gầm hệ thống chính
  • 18 khung gầm mở rộng
  • 19 khung phụ
  • 20 khung gầm mở rộng xe buýt
  • 21 Khung gầm ngoại vi
  • 22 khung gầm lưu trữ
  • Khung gầm 23 giá đỡ
  • 24 PC kín

Nguồn cho bảng? Và 'hộp cơm trưa' có phải là một trò đùa không?!
OJFord

1
@OJFord Tôi không có trích dẫn tại thời điểm này. Theo như 'hộp cơm trưa', đó là một biệt danh dành cho một yếu tố hình thức. Tôi đã từng làm việc với một vài hộp cơm trưa và pizzaboxes trước đây. Trong khi liên kết này có thể không năm trở lại đây, bạn có thể thấy một số máy tính hộp ăn trưa rất hiện đại theportablepc.com/portable-pc.html
kín đáo

1
Câu trả lời Grant chứa một trích dẫn từ microsoft: docs.microsoft.com/en-us/previous-versions/tn-archive/...
nghiêm trang

Cảm ơn! Bây giờ tôi muốn một ... Nhưng tôi nghi ngờ ví của tôi không.
OJFord

Đây là giải pháp duy nhất hiệu quả với tôi mà không cần phải sudo. Các giải pháp dựa trên pin cho biết máy tính để bàn ubfox của tôi là máy tính xách tay hoặc cho biết máy tính xách tay debian của tôi là máy tính để bàn.
xdavidliu

1

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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.