랩톱이나 데스크톱 컴퓨터에서 bash 스크립트가 실행되고 있는지 프로그래밍 방식으로 결정하는 신뢰할 수있는 방법이 있습니까?
분명히 사용자에게 물어 보라는 메시지를 표시 할 수는 있지만 매우 어수선합니다.
랩톱이나 데스크톱 컴퓨터에서 bash 스크립트가 실행되고 있는지 프로그래밍 방식으로 결정하는 신뢰할 수있는 방법이 있습니까?
분명히 사용자에게 물어 보라는 메시지를 표시 할 수는 있지만 매우 어수선합니다.
답변:
시스템에 배터리가 있는지 여부를 확인하는 것은 신뢰할 수 없습니다. UPS는 시스템에 연결된 (전원뿐만 아니라 USB를 통한 자동 종료 및 배터리 모니터링을 위해) 배터리로 표시 될 수 있습니다.
그러나 신뢰할 수있는 좋은 방법이 있습니다.
dmidecode --string chassis-type
랩톱에서는 "랩탑", "노트북" "휴대용"또는 "하위 노트북"중 하나를 반환합니다 (제조업체가 BIOS에 코딩 한 내용에 따라 다름). Windows 2000 스크립팅 안내서의 " 컴퓨터의 섀시 유형 식별 "에 가능한 값의 전체 목록이 있습니다 . Microsoft TechNet 페이지인지 걱정하지 마십시오. 이것은 OS에 특정한 것이 아닙니다.
dmidecode는 하드웨어 제조업체, 시스템 일련 번호 (때때로) 등에 대한 정보도 얻을 수 있습니다.
/sys/module/battery
있습니까?
Other
.
.bashrc
파일 과 같은 것들에는 적합하지 않습니다 . /sys/class/dmi/id/chassis_type
단 하나의 숫자 인의 내용을 쿼리하는 것이 훨씬 좋습니다 (아래 다른 대답이 지적했듯이).
데비안을 실행하는 머신이 노트북인지 확인하려면 다음을 시도하십시오.
[ -d /sys/module/battery ] && echo "Yes it's a laptop"
이 방법에는 root
권한 이 필요하지 않습니다 .
그러나 다른 배포판에서는 배터리가 있는지 여부에 관계 없이이 디렉토리가 적어도 골격 형태로 존재하는 것으로 보입니다. 주석 아래 (아래)에서 이러한 배포에는 CentOS, Ubuntu 및 Linux Mint의 Ubuntu 파생 배포가 포함됩니다.
내 데비안 시스템에서는 작동하지 않지만 Alex가 제안한 솔루션 은 Ubuntu & CentOS에서 작동한다고 알려져 있습니다. 따라서 일반화를 위해 가능한 조합 솔루션을 제안합니다.
[ -f /sys/module/battery/initstate ] || [ -d /proc/acpi/battery/BAT0 ] && echo "Yes it's a laptop"
이 방법에는 root
권한 이 필요하지 않습니다 .
실제 배터리가 장착 된 데비안 시스템에서 /sys/module/battery
디렉토리는 많은 파일을 포함합니다. 이러한 파일 중 하나 /sys/module/battery/initstate
는 텍스트를 포함합니다 live
. 그러나 우분투에서는 이러한 파일이 실제 랩톱에도 존재하지 않습니다. 따라서 파일 /sys/module/battery/initstate
이 있으면 데비안을 실행하는 랩톱을 테스트하는 데 사용할 수 있습니다.
반대로 테스트 한 데비안 시스템에서는 /proc/acpi/battery
디렉토리가 존재하지 않습니다.
컴퓨터에 배터리가 설치되어 있는지 확인하고 싶습니다. 다음은 테스트하는 한 가지 방법입니다.
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
}
수년간 데비안에서 이것을 사용해 왔습니다. 이것은 WSL 또는 virtualbox에서 실행되는 데비안에서도 작동합니다.
편집 : 더 많은 사례를 포착하기 위해이 스레드의 다른 답변에서 일반화되었습니다.