>

CPU의 주파수를 GHz 단위로 계산하는 쉘 스크립트가 아래에 있습니다. 스크립트는 대부분 shellcheck cpu_freq.sh 에서 기댈 수 있습니다 . 문제는 CPU 주파수를 인쇄하지 않는다는 것입니다. 0을 출력합니다 :

$ ./cpu_freq.sh
CPU_FREQ: 0

echo 를 사용하고 있습니다 하지만 here 파일과 스택 오버플로에서 여러 파일을 사용하여 파일 시스템 키를 명령으로 리디렉션하는 것과 같은 다른 작업도 시도했습니다.

스크립트는 0 를 인쇄합니다  값 3.147 대신 . 스크립트가 3.147 를 인쇄하지 못하는 이유  그렇게 요?

<시간>

스크립트의 흔적입니다.

$ bash -x cpu_freq.sh
+ GREP=grep
+ AWK=awk
...
+ CPU_FREQ=0.5
+ [[ -e /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq ]]
++ cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq
+ CPU_FREQ=3300000
++ echo 3300000
++ awk 'BEGIN {print $0/1024/1024; exit}'
+ CPU_FREQ=0
+ echo 'CPU_FREQ: 0'
CPU_FREQ: 0

<시간>

여기 스크립트가 있습니다.

$ cat -n cpu_freq.sh
 1  #!/usr/bin/env bash
 2
 3  GREP=grep
 4  AWK=awk
 5
 6  THIS_SYSTEM=$(uname -s 2>&1)
 7  IS_AIX=$(echo -n "$THIS_SYSTEM" | "$GREP" -i -c aix)
 8  IS_DARWIN=$(echo -n "$THIS_SYSTEM" | "$GREP" -i -c darwin)
 9  IS_SOLARIS=$(echo -n "$THIS_SYSTEM" | "$GREP" -i -c sunos)
10
11  # Benchmarks expect frequency in GiHz.
12  CPU_FREQ=0.5
13  if [[ (-e "/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq") ]]; then
14          CPU_FREQ="$(cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq)"
15          CPU_FREQ="$(echo "$CPU_FREQ" | $AWK 'BEGIN {print $0/1024/1024; exit}')"
16  elif [[ (-e "/proc/cpuinfo") ]]; then
17          CPU_FREQ="$($GREP 'MHz' < /proc/cpuinfo | $AWK '{print $4; exit}')"
18          if [[ -z "$CPU_FREQ" ]]; then CPU_FREQ=512; fi
19          CPU_FREQ="$(echo $CPU_FREQ | $AWK 'BEGIN {print $0/1024}')"
20  elif [[ "$IS_DARWIN" -ne "0" ]]; then
21          CPU_FREQ="$(sysctl -a 2>&1 | $GREP "hw.cpufrequency" | $AWK '{print ($3); exit;}')"
22          CPU_FREQ="$(echo $CPU_FREQ | $AWK 'BEGIN {print $0/1024/1024/1024}')"
23  elif [[ "$IS_SOLARIS" -ne "0" ]]; then
24          CPU_FREQ="$(psrinfo -v 2>/dev/null | $GREP "MHz" | $AWK '{print $6; exit;}')"
25          CPU_FREQ="$(echo $CPU_FREQ | $AWK 'BEGIN {print $0/1024}')"
26  elif [[ "$IS_AIX" -ne "0" ]]; then
27          CPU_FREQ="$(prtconf -s 2>/dev/null | $GREP "MHz" | $AWK '{print $4; exit;}')"
28          CPU_FREQ="$(echo $CPU_FREQ | $AWK 'BEGIN {print $0/1024}')"
29  fi
30
31  echo "CPU_FREQ: $CPU_FREQ"

<시간>

여기 남은 shellcheck 는  경고. 나는 이것이 예상된다고 믿는다.

In cpu_freq.sh line 15:
    CPU_FREQ="$(echo "$CPU_FREQ" | $AWK 'BEGIN {print $0/1024/1024; exit}')"
                                        ^-- SC2016: Expressions don't expand in single quotes, use double quotes for that.

  • 답변 # 1

    BEGIN  그리고 END  필드 값을받지 않습니다.

    $ awk 'BEGIN { print $0 / 1024 / 1024 ; exit }' <<< '3300000'
    0
    $ awk '{ print $0 / 1024 / 1024 ; exit }' <<< '3300000'
    3.14713
    
    

  • 이전 원격 컵 프린터를 로컬에서 사용할 수 있도록 중지 작업이 실행 중입니다
  • 다음 freebsd - kvm_open - /proc을 열 수 없습니다