+++ date = "2021-01-19" tags = ["mac","shell"] title = "macでtimeコマンドを使ってみる" slug = "shell" +++ `coreutils`になかったのですが、`gnu-time`でインストールできます。 mac標準は、`/usr/bin/time`にありますが、ほとんどのオプションが機能せず、あまり使えません。 ```sh $ brew install gnu-time $ gtime -f "%e" read ``` これによって、ストップウォッチとして使えますし、任意のタイミングで実行時間を計測して記録できるので、色々と便利です。 例えば、任意のコマンドを指定した間隔で実行してみます。 ```sh #/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`を一定の時間間隔で実行してみます。 ```sh $ 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`を使うか、新しいオプションを付けてみてください。 ```sh 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