Możesz użyć command
wbudowanej powłoki, aby ominąć normalny proces wyszukiwania i uruchomić dane polecenie jako polecenie zewnętrzne, niezależnie od innych możliwości (wbudowane powłoki, aliasy itp.). Często odbywa się to za pomocą skryptów, które muszą być przenośne w różnych systemach, chociaż prawdopodobnie częściej używa się stenografii \
(jak w lub \rm
zamiast , ponieważ szczególnie ta ostatnia może być aliasowana do czegoś nie znanego ).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...]
$
Można tego użyć z aliasem, takim jak:
$ alias time='command time'
$ time
Usage: time [-apvV] [-f format] [-o file] [--append] [--verbose]
[--portability] [--format=format] [--output=file] [--version]
[--quiet] [--help] command [arg...]
$
Zaletą tego jest na przykład alias time=/usr/bin/time
to, że nie określasz pełnej ścieżki do time
pliku binarnego, ale zamiast tego powracasz do zwykłego mechanizmu wyszukiwania ścieżki.
Sama alias
komenda może przejść do np. ~ / .Bashrc lub /etc/bash.bashrc (ta ostatnia jest globalna dla wszystkich użytkowników w systemie).
W przeciwnym przypadku (wymuszenie użycia wbudowanej powłoki w przypadku zdefiniowania aliasu) użyłbyś czegoś podobnego builtin time
, co ponownie zastąpi zwykły proces wyszukiwania i uruchomi nazwaną wbudowaną powłokę. Strona podręcznika bash wspomina, że jest to często używane w celu zapewnienia niestandardowej cd
funkcjonalności o nazwie o nazwie cd
, która z kolei używa wbudowanej funkcji cd
do wykonania prawdziwej operacji.
type -a <cmd>
.command
nie omija wbudowanych (z wyjątkiemzsh
gdy nie emuluje innych powłok). Pomija funkcje i to jest główny powód jego istnienia. Jej druga rola jest usunięcie specjalnego w szczególnych poleceń wbudowanych . Pomija aliasy i słowa kluczowe tylko dlatego, że są one rozwijane tylko na pierwszej pozycji (zsh
na przykład nie pomija globalnych aliasów). Nie matime
wbudowanego basha.time
jest słowem kluczowym, na przykład możesz to zrobićtime { foo; bar; }
.command
działa w tym konkretnym przypadku, jak na przykładzie, ale oczywiście poprawna odpowiedź jest lepsza niż odpowiedź w połowie prawidłowa.builtin time
nie działa'time' echo test
W bash istnieje skrót do omijania słów kluczowych, bez konieczności określania ścieżki lub korzystania z innego wbudowanego narzędzia, takiego jak
command
: Escape from backslash.Osobiście uważam to za bardziej czytelne i bezpieczniejsze, ponieważ jest to możliwe:
źródło
time
zrobi:ti\me
,'time'
,ti""me
,ti${-##*}me
,${-+time}
... Dotyczy to jakiekolwiek słowo kluczowe powłoki.(x_x)
Ogólne rozwiązania dla wbudowanych (na przykład test) są [1] :
use
env
(wszystkie muszle)wyłącz wbudowane (tylko bash i zsh):
użyj dowolnego ukośnika,
/
aby wywołać polecenie (wszystkie powłoki):utwórz alias (kończy się niepowodzeniem w skrypcie bash, chyba że
shopt -s expand_aliases
jest używany):Ale czas nie jest wbudowany.
Słowo
time
to jest „słowem zastrzeżonym”, a nie poleceniem ani wbudowanym. Dzięki temu możliwe są następujące rozwiązania:Cytuj słowo. To nie działa z wbudowanymi.
Wiele form cytowania pracy:
\time
"time"
'time'
ti\me
ti"me"
itp.Jest to przydatne do ominięcia aliasu. Nawet jeśli
test
jest aliasowany,\test
wykona polecenie PATHed (lub wbudowane, jeśli nie zostało wyłączone).Użyj wbudowanego
command
(nie działa z wbudowanymi):Jak wyżej dla wbudowanych, używając dowolnego slash
/
działa:Jak wyżej dla wbudowanych, tutaj działa także alias:
[1] Załóżmy, że istnieje zewnętrzny plik wykonywalny,
~/bin/test
który drukuje „test zewnętrzny”. I dalej: załóżmy, że~/bin
wyprzedza/bin
aktywna ŚCIEŻKA.źródło
Upuść to w
~/.bashrc
:alias time=/usr/bin/time
źródło
Możesz użyć tego
enable
polecenia, aby wyłączyć niektóre wbudowane funkcje .Jednak
time
jest to słowo kluczowe, tak to nie będzie działać.Pozostaje Ci zatem utworzenie aliasu, aby go zastąpić:
źródło