當我使用 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"