내 배쉬 기술은 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"로 대체될 수 있습니다 .