/usr/bin/time を呼び出す前にエイリアスを展開する

/usr/bin/time を呼び出す前にエイリアスを展開する

シェル組み込み を使用すると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"

関連情報