在呼叫 /usr/bin/time 之前擴展別名

在呼叫 /usr/bin/time 之前擴展別名

當我使用 shell 內建命令時time,我可以傳遞任何我想傳遞給 shell 的命令,而無需使用time.但是當我使用 external 時/usr/bin/time,我無法傳遞 shell 別名,因為/usr/bin/time它自然不知道這些:

$ /usr/bin/time ll
/usr/bin/time: cannot run ll: No such file or directory

如何說服 shell 在ll將別名傳遞給 之前擴展別名/usr/bin/time?解析 的輸出alias ll很棘手,特別是因為別名的定義包含其他別名。


我使用的原因/usr/bin/time是為了測量記憶體使用峰值

答案1

您可以將別名定義為/usr/bin/time

alias 'ubtime=/usr/bin/time '

或者

alias 'ubtime=command time '

如果您不想對time可執行檔的路徑進行硬編碼。

訣竅在於別名定義中的尾部空格,它告訴 shell 必須在該別名之後替換別名,以便

ubtime ll

實際上將擴展為

/usr/bin/time ls -l

(假設ll是 的別名ls -l)。

無論如何,/usr/bin/time作為一個獨立的可執行文件,它無法對管道或複合命令或函數或 shell 內建函數進行計時,因此它無法對任意別名的擴展進行計時。

如果使用的原因/usr/bin/time是因為您喜歡其預設輸出格式而不是time按鍵輸出格式,請注意,在許多 shell 中,可以修改該格式。例如,在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/")

但對於任意別名,如空格、轉義字元、巢狀別名和函數等,還不是完全安全的。

我想不可能有不醜的解決方案。這就是為什麼 shell 有一個內建的time.即使別名擴充會更容易,下一個問題將是如何對函數進行計時。請注意,別名甚至可以使用 shell 函數。

如果你的別名是在 bash 的設定檔中定義的,而且你不關心時間開銷,你可以嘗試

/usr/bin/time bash -l -i -c "ll"

相關內容