Bash 스크립트가 작동하지 않음, 변수 이해

Bash 스크립트가 작동하지 않음, 변수 이해

내 배쉬 기술은 0에 가깝습니다. Wi-Fi 인터페이스의 데이터 전송 속도를 모니터링하는 스크립트를 생각해 냈습니다.

#!/bin/bash 
rx_old=0
tx_old=0
speed() {
    read rx_bytes < /sys/class/net/wlp9s0f0/statistics/rx_bytes
    read tx_bytes < /sys/class/net/wlp9s0f0/statistics/tx_bytes
    drx=$(((rx_bytes - rx_old) / 1024))
    dtx=$(((tx_bytes - tx_old) / 1024))
   rx_old=$rx_bytes
    tx_old=$tx_bytes
    echo "$drx KB/s $dtx KB/s"  
}
while true;
do
    echo $(speed)
    sleep 1
done

이것은 작동하지 않습니다. rx_old 및 tx_old 변수가 업데이트되지 않은 것 같습니다. 함수 내부에서 이러한 변수를 변경할 수는 없다고 생각합니다. 누구든지 이것에 대한 통찰력을 줄 수 있습니까?

답변1

문제는 입니다 echo $(speed). 내부 명령은 $(...)서브쉘, 즉 스크립트를 실행하는 쉘의 하위 프로세스에서 실행됩니다. 하위 쉘은 상위 쉘의 변수를 변경할 수 없습니다.

결과적으로 메인 셸의 rx_old합계는 tx_old실제로 업데이트되지 않습니다. 동일한 이름을 가진 변수는 서브쉘에서 업데이트되지만 서브쉘이 종료되면 사라집니다.

$(...)함수가 이미 에코한 텍스트를 에코하는 것이 전부이기 때문에 필요하지 않습니다 speed. speed이는 메인 셸에서 실행되고 이에 따라 이러한 변수를 업데이트하는 "naked"로 대체될 수 있습니다 .

관련 정보