bash 프롬프트에서 직접 if 문을 사용하시겠습니까?

bash 프롬프트에서 직접 if 문을 사용하시겠습니까?

이것이 직접 달성 가능한지 확실하지 않습니다. 하지만 다음을 사용하여 CPU의 현재 온도를 얻으려고합니다.

cpu=$(</sys/class/thermal/thermal_zone0/temp)

온도가 70000 이상일 때 종료를 수행하기 위해 echo를 사용하여 동일한 명령의 출력을 if 문으로 파이프하고 싶습니다. (온도를 섭씨 단위로 얻으려면 명령 출력을 1000으로 나누어야 합니다.)

그것은 마치

cpu=$(</sys/class/thermal/thermal_zone0/temp) | if $cpu -gt 70000 then shutdown fi

Pi가 과열되는 것을 방지하기 위해 이렇게 하려고 합니다. Pi의 CPU 온도를 15분마다 확인하고 70을 초과하면 종료하도록 cronjob을 예약하겠습니다.

감사해요.

답변1

마지막 명령은거의정확하지만 문법적으로는 올바르지 않습니다. 수정된 버전:

cpu=$(</sys/class/thermal/thermal_zone0/temp); if [ "$cpu" -gt 70000 ]; then shutdown; fi

아니면 더 짧게,

cpu=$(</sys/class/thermal/thermal_zone0/temp); [ "$cpu" -gt 70000 ] && shutdown

아니면 더 짧게,

[ "$(</sys/class/thermal/thermal_zone0/temp)" -gt 70000 ] && shutdown

명령의 문제점(-statement 구문 외에 if)은 파이프를 사용한다는 것입니다. 파이프의 오른쪽( if문장)은 파이프의 왼쪽(변수 할당)에서 읽어야 합니다. 변수 할당은 출력을 생성하지 않으며 if- 문은 입력을 소비하지 않습니다. 또한 $cpu파이프라인의 두 부분이 동시에 실행되므로 파이프라인 오른쪽의 값을 알 수 없습니다.

크론 작업의 경우 다음이 더 나은 명령문일 수 있습니다.

[ "$(</sys/class/thermal/thermal_zone0/temp)" -le 70000 ] || shutdown

이렇게 하면 온도가 낮더라도 명령이 성공적으로 종료됩니다. 이 변경으로 인해 [ ... -gt 70000 ] && shutdown콜드 테스트에서 0이 아닌 종료가 반환되어 작업이 실패한 것처럼 보이게 됩니다.[ ... ]cron

또한 bash작업을 실행하려면 crontab을 셸로 사용해야 합니다. 그렇지 않으면 $(<...)구문이 제대로 작동하지 않을 수 있습니다. crontab 상단에서 변경 $(<...)하거나 $(cat ...)설정할 수 있습니다. SHELL=/bin/bash또한 을(를) 실행하려면 shutdown루트 권한이 필요할 수도 있습니다.

관련 정보