Bash 명령 프롬프트에 업데이트 데이터를 넣는 방법은 무엇입니까?

Bash 명령 프롬프트에 업데이트 데이터를 넣는 방법은 무엇입니까?

현재 배터리 비율을 표시하는 프롬프트를 만들려고 하는데, 작성된 방식 PS1으로 코드를 설정하면 터미널 에뮬레이터의 새 인스턴스를 열 때 대화형 셸을 초기화할 때 데이터를 한 번만 확인합니다. 데이터를 업데이트하려면 다시 로드해야 합니다. 저는 Unix 계열 운영 체제를 처음 접했기 때문에 사소한 것을 놓치고 있을 수도 있습니다. 프롬프트를 업데이트하려면 데몬을 만들어야 할까요?.bashrc.bashrc

이것은 프롬프트의 전체 코드는 아니지만 데이터 변경과 관련된 부분입니다.

PS1="`upower -i /org/freedesktop/UPower/devices/battery_BAT0 | grep "percentage:" | awk '$1 == "percentage:" {print $2}'`$ "

답변1

값을 적극적으로 업데이트하는 좋은 방법은 모르지만 셸에 활동이 있을 때마다(예: Enter 키를 누를 때) 다음을 사용하여 업데이트할 수 있습니다 PROMPT_COMMAND.

update_ps1() {
    PS1="$(upower -i /org/freedesktop/UPower/devices/battery_BAT0 | grep "percentage:" | awk '$1 == "percentage:" {print $2}')$ "
}
PROMPT_COMMAND=update_ps1

이런 식으로 실행 시 변수를 update_ps1업데이트하는 bash라는 함수를 추가했습니다 . PS1다음으로 PROMPT_COMMAND변수를 함수 이름으로 설정했습니다. 에 따르면 man bash:

PROMPT_COMMAND
    If set, the value is executed as a command prior to issuing each primary prompt.

이렇게 하면 bash가 프롬프트에 쓸 때마다 bash가 쓰기 전에 값을 업데이트하는 value 를 수행 PROMPT_COMMAND하므로 PS1쓰기 시점의 최신 값을 갖게 됩니다.

답변2

당신은 필요하지 않습니다 upower. 모든 쉘은 루프를 지원하므로 다음을 수행할 수 있습니다.

#!/bin/sh

# Loop trough all batteries
for battery in /sys/class/power_supply/BAT?
do
    # Get capacity of battery
    capacity=$(cat "$battery"/capacity) || exit

    # Get status of battery
    status=$(cat "$battery"/status)

    # Print capacity and status
    echo "$capacity" \| "$status"
done

설명: 배터리 정보는 /sys/class/power_supply/개별 배터리에 저장되며 이름은 BAT숫자로 지정됩니다 BAT0, BAT1, .... Linux의 모든 내용은 파일이므로 간단히 내용을 찾아보고 BAT0/status필요한 BAT0/capacity정보를 얻은 다음 사용할 수 있습니다 echo. 다른 질문이 있으면 문의하세요!

관련 정보