Вы можете использовать command
встроенную оболочку, чтобы обойти обычный процесс поиска и выполнить данную команду как внешнюю команду независимо от любых других возможностей (встроенные функции оболочки, псевдонимы и т. Д.). Это часто делается в сценариях, которые должны быть переносимы между системами, хотя, вероятно, чаще используют сокращение \
(например, \rm
вместо command rm
или rm
, так как последнее может быть связано с чем-то, что не известно как rm -i
).
$ time
real 0m0.000s
user 0m0.000s
sys 0m0.000s
$ command time
Usage: time [-apvV] [-f format] [-o file] [--append] [--verbose]
[--portability] [--format=format] [--output=file] [--version]
[--quiet] [--help] command [arg...]
$
Это можно использовать с псевдонимом, например так:
$ alias time='command time'
$ time
Usage: time [-apvV] [-f format] [-o file] [--append] [--verbose]
[--portability] [--format=format] [--output=file] [--version]
[--quiet] [--help] command [arg...]
$
Преимущество этого перед, например, в alias time=/usr/bin/time
том, что вы не указываете полный путь к time
двоичному файлу , а вместо этого возвращаетесь к обычному механизму поиска пути.
Сама alias
команда может входить, например, в ~ / .bashrc или /etc/bash.bashrc (последняя является глобальной для всех пользователей системы).
В противоположном случае (принудительное использование встроенной оболочки в случае, если определен псевдоним), вы должны использовать что-то вроде этого builtin time
, что снова отменяет обычный процесс поиска и запускает встроенную именованную оболочку. На странице руководства bash упоминается, что это часто используется для обеспечения пользовательских cd
функций с помощью названной функции cd
, которая, в свою очередь, использует встроенную функцию cd
для реальной работы.
type -a <cmd>
.command
не обходит встроенные функции (кроме случаев,zsh
когда они не эмулируют другие оболочки). Он обходит функции, и это главная причина его существования. Его вторая роль состоит в том, чтобы удалить специальные в специальных встроенных функциях . Он обходит псевдонимы и ключевые слова только потому, что они раскрываются только в первой позиции (zsh
например, он не обходит глобальные псевдонимы). Там нетtime
встроенного Bash.time
это ключевое слово, так что вы можете сделать, напримерtime { foo; bar; }
.command
работает в данном конкретном случае, как пример, но, очевидно, правильный ответ лучше, чем полуправильный.builtin time
не работает'time' echo test
В bash есть ярлык, позволяющий обходить ключевые слова без указания пути или использования другого встроенного метода, например
command
: экранируйте его обратной косой чертой.Лично я считаю это более читабельным и безопасным, поскольку это возможно:
источник
time
будет делать:ti\me
,'time'
,ti""me
,ti${-##*}me
,${-+time}
... Это относится к любому ключевому слову оболочки.(x_x)
Общие решения для встроенных модулей (например, test): [1] :
использовать
env
(все снаряды)отключить встроенный (только bash и zsh):
используйте любую косую черту
/
для вызова команды (все оболочки):создать псевдоним (происходит сбой внутри скрипта bash, кроме случаев, когда
shopt -s expand_aliases
он используется):Но время не является встроенным.
Слово
time
является «зарезервированным словом», а не командой и не является встроенным. Это позволяет это решения:Процитируй слово. Это не работает со встроенными модулями.
Многие формы цитирования работы:
\time
"time"
'time'
ti\me
ti"me"
и т. Д.Это полезно для обхода псевдонима. Даже если с
test
псевдонимом,\test
выполнит команду PATHed (или встроенную, если она не была отключена).Используйте встроенный
command
(это не работает со встроенными модулями):Как и выше для встроенных модулей,
/
работает любой слеш :Как и выше для встроенных модулей, здесь также работает псевдоним:
[1] Предположим, что есть внешний исполняемый файл,
~/bin/test
который печатает «внешний тест». И еще: давайте предположим, что~/bin
впереди/bin
в активной PATH.источник
Оставьте это в свой
~/.bashrc
:alias time=/usr/bin/time
источник
Вы можете использовать
enable
команду, чтобы отключить определенные встроенные модули.Однако
time
это ключевое слово, так что это не сработает.Итак, вам осталось создать псевдоним для его переопределения:
источник