Как заставить интерпретацию как ключевое слово вместо псевдонима в командной строке? - PullRequest
1 голос
/ 08 мая 2020

У меня есть

alias time='/usr/bin/time -v'

, настроенное в моей bash среде.

Однако мне иногда нужен доступ к ключевому слову time для некоторых однострочников, таких как

(expensive-command1 & expensive-command2 & time wait); something-that-requires-prev-commands-to-be-complete

Где wait, очевидно, должен ждать завершения обоих expensive-command1 и expensive-command2, а время ключевого слова может измерять затраченное время.

Однако, когда у меня есть псевдоним времени, указывающий на Фактический двоичный файл Вместо этого я получаю следующую ошибку:

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

Как принудительно интерпретировать keyword для time в приведенной выше команде? Я знаю, что если я запускаю unalias time перед запуском над строкой он работает, но тогда мой псевдоним для этой оболочки пропал.

Я также знаю, что если бы я хотел go из ключевого слова в фактический двоичный файл, я мог бы использовать синтаксис (cmd1 & cmd2 & command time wait). И если бы мне понадобилась встроенная команда, я мог бы использовать синтаксис (cmd1 & cmd2 & builtin time wait). Однако требуемый здесь time не является командным или встроенным. Это keyword, но я не могу понять, как интерпретировать приведенную выше однострочную строку как таковую.

1 Ответ

2 голосов
/ 08 мая 2020

Определите функцию, как показано ниже, перед строкой, в которой псевдоним time определен в вашем bashr c.

_time() { time "$@"; }

Затем вы можете использовать _time всякий раз, когда вам нужно ключевое слово time.

$ _time() { time "$@"; }
$ alias time='echo foo'
$ time ls
foo ls
$ _time ls
.bash_history .bashrc

real    0m0.024s
user    0m0.010s
sys     0m0.000s

В руководстве объясняется, почему это работает следующим образом.

Псевдонимы раскрываются при чтении определения функции, а не при выполнении функции, потому что определение функции само команда.


В среде, где у вас нет разрешения на изменение bashr c, вы можете сделать:

$ shopt -u expand_aliases
$ _time() { time "$@"; }
$ shopt -s expand_aliases

и получить ту же функциональность .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...