Chcę dowiedzieć się, jaki jest typ kilku poleceń. Czy jest możliwe przesłanie potoku lub xargs
wyniku wyszukiwania find
do type
polecenia w systemie Linux?
Na przykład:
find . -name anacron | type
lub
find . -name anacron | xargs type
command-line
bash
find
LjinKazama
źródło
źródło
Odpowiedzi:
type
nie jest normalnym poleceniem. To buitin powłoki. Widzieć:Musisz więc wywoływać za
bash
pomocą,-c
aby osiągnąć to, czego chceszLub nawet prościej (bez potrzeby
xargs
):Zadzwoni
bash -c "type ./file"
z każdym plikiem, który znajdziefind
.-I
wxargs
drodze, definiujemy tu zastępczy{}
do wykorzystania później. Ten symbol zastępczy zostaje zastąpiony znalezioną nazwą pliku.Dlaczego wbudowane powłoki nie działają z
xargs
:Polecenie w tym przypadku jest prostym do wytłumaczenia, a wbudowana powłoka nie jest plikiem wykonywalnym. Nie można go znaleźć w systemie plików. Jest w samej skorupie. Musisz więc wywołać powłokę i powiedzieć wywoływanej powłoce, aby wywołała wbudowane polecenie. Tak się stało
bash -c "command"
.źródło
find ... -exec bash -c 'type "$@"' _ {} +
Jest tu kilka problemów (niektóre już zaznaczone):
type
jest wbudowany. To nie jest polecenie, które zostało rozwiązane, to funkcja w bashu. Zobaczyćman bash-builtins
. To działa tylko w kontekście bash tak nie jestxargs
lub-exec
rozwidlony powłoki w tle.type
służy do wyszukiwania własnych ścieżek. Jeśli podasz mu ścieżkę (jakfind
to zwykle bywa), prawdopodobnie po prostu zwróci tę ścieżkę.readlink -f
może być lepiej, jeśli próbujesz rozwiązać dowiązania symboliczne; i możesz przesyłać doxargs readlink
lub przez-exec readlink -f {} +
cały dzień.Nie oznacza to, że nie możesz zrobić tego, co próbujesz. Istnieją dwie opcje.
type
Komenda może obsługiwać wiele imion na raz, więc może po prostu dostarczyć wszystkie nazwy na raz:W przypadku wielu poleceń, jeśli argumentów jest zbyt wiele, przekroczysz limit długości wiersza poleceń (patrz
getconf ARG_MAX
). Jednak nie będzie to miało zastosowania w tym przypadku, ponieważtype
jest wbudowany w powłokę i nie generuje nowego identyfikatora procesu (limit długości dotyczy funkcji exec () używanej przez proces potomny w normalnym wierszu poleceń).źródło