Когда я использую встроенную оболочку 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
keywork, учтите, что во многих оболочках формат можно изменить. Например, в 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"