macでtimeコマンドを使ってみる

2021/01/19

coreutilsになかったのですが、gnu-timeでインストールできます。

mac標準は、/usr/bin/timeにありますが、ほとんどのオプションが機能せず、あまり使えません。

$ brew install gnu-time
$ gtime -f "%e" read

これによって、ストップウォッチとして使えますし、任意のタイミングで実行時間を計測して記録できるので、色々と便利です。

例えば、任意のコマンドを指定した間隔で実行してみます。

#/bin/zsh
time=time.txt
json=command.json
echo "[s]ave, [l]oad"
case $1 in
	s)
		if [ -f $json ];then
			rm $json
		fi
		echo "[" >> $json
		while :
			do
				echo "command?, [s]top"
				read key
				case $key in
					s)
						echo "{\"command\":\"\",\"time\":\"\"}]" >> $json
						exit
					;;
					*)
						echo "time enter"
						gtime -f "%e" -o $time read
						cti=`cat $time`
						echo "{\"command\":\"$key\",\"time\":\"$cti\"}," >> $json
					;;
				esac
		done 
	;;
	l)
		if ! cat $json|jq;then
			exit
		fi
		n=`cat $json|jq length`
		n=$((n - 2))
		for ((i=0;i<=$n;i++))
			do
				command=`cat $json|jq -r ".[$i].command"`
				time=`cat $json|jq -r ".[$i].time"`
				zsh -c "$command"
				sleep $time
		done
	;;
esac

例えば、このスクリプトをcommand.zshで保存したとして、ls, which catを一定の時間間隔で実行してみます。

$ mkdir -p ./tmp
$ cd ./tmp
$ chmod +x command.zsh

# まずは処理を保存します
# 時間間隔も保存しますので、`time enter`のところで任意のタイミングでetnerを押し、記録します
$ ./command.zsh s
[s]ave, [l]oad
command?, [s]top
ls
time enter

command?, [s]top
which cat
time enter

command?, [s]top
s

# 呼び出してみます
$ ./command.zsh l
[
  {
    "command": "ls",
    "time": "5.63"
  },
  {
    "command": "which cat",
    "time": "7.08"
  },
  {
    "command": "",
    "time": ""
  }
]
command.json    command.zsh     time.txt
/bin/cat

指定したコマンドが記録された間隔で実行されました。

もし永続化したいなら、zsh repeatを使うか、新しいオプションを付けてみてください。

ll)
	if ! cat $json|jq;then
		exit
	fi
	n=`cat $json|jq length`
	n=$((n - 2))
	while :
		do
		for ((i=0;i<=$n;i++))
			do
				command=`cat $json|jq -r ".[$i].command"`
				time=`cat $json|jq -r ".[$i].time"`
				zsh -c "$command"
				sleep $time
			done
	done
;;

ちなみに、こういうのもあるらしいので、gtimeに当ててやると、時間が測りやすいと思います。(面倒なのでやらないけど

https://raw.githubusercontent.com/coryfklein/sw/master/sw

tags: mac, shell