Solarisで数学演算を実行すると、awkがクラッシュします。

Solarisで数学演算を実行すると、awkがクラッシュします。

私はSunOS 5.11 / Solaris 11.3システムで作業しています。いくつかのテストスクリプトではかなり使用されているので、CPU周波数を計算してエクスポートするbashスクリプトがあります。

興味のある2つの行は次のとおりです。

solaris:~$ CPU_FREQ=$(psrinfo -v 2>/dev/null | grep 'MHz' | head -1 | awk '{print $6}')
solaris:~$ echo $CPU_FREQ
3000
solaris:~$ CPU_FREQ=$(awk "BEGIN {print $CPU_FREQ/1024/1024}")
^C

Solarisでawkコマンドがハングするのはなぜですか?何が違うのですか?


これはスクリプトの大きなビューです。 Linux、OS X、BSDでうまく動作します。

IS_LINUX=$(uname -s | grep -i -c linux)
IS_DARWIN=$(uname -s | grep -i -c darwin)
IS_SOLARIS=$(uname -s | grep -i -c sunos)

# 2.0 GHz or 2.0/1024/1024/1024
CPU_FREQ=1.8189894
if [ "$IS_LINUX" -ne "0" ] && [ -e "/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq" ]; then
    CPU_FREQ=$(cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq)
    CPU_FREQ=$(awk "BEGIN {print $CPU_FREQ/1024/1024}")
elif [ "$IS_DARWIN" -ne "0" ]; then
    CPU_FREQ=$(sysctl -a 2>/dev/null | grep 'hw.cpufrequency' | head -1 | awk '{print $3}')
    CPU_FREQ=$(awk "BEGIN {print $CPU_FREQ/1024/1024/1024}")
elif [ "$IS_SOLARIS" -ne "0" ]; then
    CPU_FREQ=$(psrinfo -v 2>/dev/null | grep 'MHz' | head -1 | awk '{print $6}')
    CPU_FREQ=$(awk "BEGIN {print $CPU_FREQ/1024}")
fi

# Used by Crypto++ benchmarks
export CPU_SPEED=$CPU_FREQ

出力は次のとおりですpsrinfo

$ psrinfo -v
Status of virtual processor 0 as of: 06/07/2016 18:23:29
  on-line since 06/07/2016 14:28:28.
  The i386 processor operates at 3000 MHz,
        and has an i387 compatible floating point processor.
Status of virtual processor 1 as of: 06/07/2016 18:23:29
  on-line since 06/07/2016 14:28:34.
  The i386 processor operates at 3000 MHz,
        and has an i387 compatible floating point processor.
Status of virtual processor 2 as of: 06/07/2016 18:23:29
  on-line since 06/07/2016 14:28:34.
  The i386 processor operates at 3000 MHz,
        and has an i387 compatible floating point processor.
Status of virtual processor 3 as of: 06/07/2016 18:23:29
  on-line since 06/07/2016 14:28:34.
  The i386 processor operates at 3000 MHz,
        and has an i387 compatible floating point processor.

ベストアンサー1

nawkSolaris で使用されます。

/usr/bin/awkPOSIX以外のレガシーであり、awkBEGIN操作のみを含むスクリプトではスキップされませんstdin

次の説明はnawkおよび/usr/xpg4/bin/awkマニュアルに表示されますが、以前のマニュアルには表示されませんawk

If an nawk program consists of only actions with the pattern BEGIN, and
the BEGIN action contains no getline function, nawk exits without read-
ing  its input when the last statement in the last BEGIN action is exe-
cuted.

しかし、head2つのgrep, andスクリプトを実行する必要はありませんawk。スクリプトawkはこれらすべてを単独で実行できます。

 CPU_FREQ=$(psrinfo -v 2>/dev/null | nawk '/MHz/ {print $6/1024;exit}')

おすすめ記事