シェル組み込み を使用するとtime
、 なしでシェルに渡すコマンドをすべて渡すことができますtime
。しかし、外部 を使用すると、 は当然それらを認識しない/usr/bin/time
ため、シェル エイリアスを渡すことができません。/usr/bin/time
$ /usr/bin/time ll
/usr/bin/time: cannot run ll: No such file or directory
ll
に渡す前に、シェルに のエイリアスを展開させるにはどうすればよいですか/usr/bin/time
? の出力を解析するのはalias ll
難しい作業です。特に、エイリアスの定義に他のエイリアスが含まれているためです。
私が使う理由は/usr/bin/time
測定するためですピーク時のメモリ使用量。
答え1
次のようにエイリアスを定義できます/usr/bin/time
。
alias 'ubtime=/usr/bin/time '
または
alias 'ubtime=command time '
実行可能ファイルへのパスをハードコードしたくない場合time
。
エイリアス定義の末尾のスペースに秘訣があり、シェルにエイリアスをそのエイリアスの後に置換する必要があることを伝えます。
ubtime ll
実際には拡大される
/usr/bin/time ls -l
(ll
は のエイリアスであると仮定しますls -l
)。
いずれにせよ、/usr/bin/time
スタンドアロン実行可能ファイルであるため、パイプラインや複合コマンド、関数、シェル組み込みコマンドの時間を計測できず、したがって任意のエイリアスの展開の時間を計測することはできません。
/usr/bin/time
キーワードの出力形式よりもデフォルトの出力形式を好むという理由でを使用する場合はtime
、多くのシェルで形式を変更できることに注意してください。たとえば、次のようになりますzsh
。
$ TIMEFMT=$'\e[31;1m%J\e[m: U:%U S:%S (%*E total) [avgtext:%X avgdata:%D maxmem:%M]'
$ time ls -l | head -n1
total 288072444
ls -l: U:0.00s S:0.01s (0.017 total) [avgtext:0 avgdata:0 maxmem:3]
head -n1: U:0.00s S:0.00s (0.015 total) [avgtext:0 avgdata:0 maxmem:3]
(\e[31;1m
色付き (太字の赤) 出力の場合)。
答え2
これは bash では動作するかもしれません:
/usr/bin/time $(alias "ll" | sed "s/^alias [^=]*='\(.*\)'/\1/")
ただし、スペース、エスケープされた文字、ネストされたエイリアスや関数など、任意のエイリアスに対してはまだ完全に安全ではありません。
おそらく、醜くない解決策は不可能でしょう。シェルに が組み込まれているのはそのためですtime
。エイリアスの展開がより簡単になったとしても、次の問題は関数の時間を計測する方法です。エイリアスはシェル関数を使用することもできることに注意してください。
エイリアスがbashの設定ファイルで定義されていて、時間によるオーバーヘッドを気にしないのであれば、以下を試すことができます。
/usr/bin/time bash -l -i -c "ll"