Jeśli wykonam test
polecenie w bash, test
(ocenia wyrażenie warunkowe), uruchomione zostanie wbudowane narzędzie:
$ type test
test is a shell builtin
$ type -a test
test is a shell builtin
test is /usr/local/bin/test
test is /usr/bin/test
$
Jednak, jak widać na type -a test
powyższym przykładzie, test
w katalogu / usr / local / bin jest jeszcze jeden, a jeszcze inny w katalogu / usr / bin. W jaki sposób są uporządkowane pliki wykonywalne, tj. Czy zawsze preferowane są wbudowane polecenia, a następnie pozostałe polecenia zależą od kolejności katalogów w zmiennej $ PATH? Ponadto, czy można zmienić kolejność uruchamianych plików wykonywalnych, np. Jeśli test
wpisuję, to uruchamiane jest / usr / bin / test zamiast wbudowanego bash test
?
bash
shell
command
shell-builtin
Jaskółka oknówka
źródło
źródło
/usr/bin/test -f "$file"
...Odpowiedzi:
Najwyższy priorytet to alias bash, następnie specjalne wbudowane (tylko w trybie POSIX), następnie funkcje, następnie wbudowane, a następnie wyszukiwanie
$PATH
.Aby uruchomić wbudowane, użyj
builtin test
.Aby wykonać zewnętrzną aplikację, należy wyraźne ścieżki:
/bin/test
.Aby zignorować funkcje i aliasy, użyj
command test
.Aby ominąć tylko alias, użyj
\test
lub innego rodzaju rozszerzenia.Możliwe jest wyłączenie / włączenie wbudowanego za pomocą
enable test
.(Zaktualizowano zgodnie z komentarzami poniżej)
(Naprawiono niepoprawną edycję administratora, którą wbudowała bash
disable
- w rzeczywistości jest tylkoenable
)źródło
\test
lub'test'
lubtes't'
./
,$
, grawis i=
a żaden z wyżej wymienionych metaznaków powłoki lub znaków cytowania wymienionych powyżej może nie występować w nazwie aliasu. ”Wbudowane polecenia są zawsze preferowane od poleceń zewnętrznych. Uzasadnieniem jest to, że wbudowane polecenie jest szybsze (aw kilku przypadkach, takich jak
cd
lub , tylko wbudowane polecenie może mieć pożądany efekt).test -o BASH_OPTION
Czasami zewnętrzne polecenie może mieć funkcje, których nie ma wbudowana powłoka. W takim przypadku możesz wywołać zewnętrzne polecenie, podając wyraźną ścieżkę (tj. Zawierającą ukośnik) (pomija to wszelkie obawy dotyczące kolejności w
$PATH
). Jeśli nie chcesz sztywno kodować ścieżki zewnętrznej, ale chcesz uniemożliwić korzystanie z wbudowanej funkcji, możesz użyć"$(type -P test)"
(uwaga kapitałuP
) w bash,"$(whence -p test)"
w ksh i=test
w zsh. Innym sposobem wymuszenia użycia polecenia zewnętrznego jest użyciecommand
wbudowanego (command -p test …
) lub przejście przezenv
narzędzie (env test …
).W Zsh możesz wyłączyć wbudowane za pomocą
disable test
. Jest to stałe (dla bieżącej powłoki lub podpowłoki), dopóki wbudowane narzędzie nie zostanie ponownie włączone za pomocąenable test
. W bash możesz zrobić to samo z,enable -n test
aby wyłączyć ienable test
włączyć ponownie.Możesz użyć aliasu lub funkcji, aby wymusić wykonanie innego polecenia, na przykład
alias test=/usr/bin/test
lubtest () { /usr/bin/test "$@"; }
. Jeśli masz taki alias, możesz uniemożliwić jego użycie, cytując dowolną jego część, np.\test
Wykona normalną funkcję / wbudowane / wyszukiwanie zewnętrzne. Zauważ, że w zależności od powłoki i jej ustawień, definicje aliasów w funkcji mogą być rozszerzane, gdy funkcja jest czytana lub kiedy jest wykonywana. Jeśli zdefiniowałeś funkcję, możesz jej użyć,command test
aby zapobiec wyszukiwaniu funkcji oraz wyszukiwaniu aliasów (więc tutajtest
wbudowane będą wywoływane, chyba że wyłączone).źródło
env
czy tutaj też nie byłoby odpowiednie?df
do ŚCIEŻKI na pierwszej pozycji, usunąłem alias „df”,which df
pokazuje / opt / bin / df, ale df działa / bin / df -> busyboxwhich df
niekoniecznie pokazuje, codf
działa. unix.stackexchange.com/questions/85249/…