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

Связанный контент