Chcę dowiedzieć się, jaki jest typ kilku poleceń. Czy jest możliwe przesłanie potoku lub xargswyniku wyszukiwania finddo typepolecenia w systemie Linux?
Na przykład:
find . -name anacron | type
lub
find . -name anacron | xargs type
Chcę dowiedzieć się, jaki jest typ kilku poleceń. Czy jest możliwe przesłanie potoku lub xargswyniku wyszukiwania finddo typepolecenia w systemie Linux?
Na przykład:
find . -name anacron | type
lub
find . -name anacron | xargs type
Odpowiedzi:
typenie jest normalnym poleceniem. To buitin powłoki. Widzieć:
$ type type
type is a shell builtin
Musisz więc wywoływać za bashpomocą, -caby osiągnąć to, czego chcesz
$ find . -name anacron | xargs -I '{}' bash -c "type {}"
Lub nawet prościej (bez potrzeby xargs):
$ find . -name anacron -exec bash -c "type {}" \;
Zadzwoni bash -c "type ./file"z każdym plikiem, który znajdzie find. -Iw xargsdrodze, 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:
[...] Wbudowane polecenia są zawarte w samej powłoce. Gdy nazwa wbudowanego polecenia jest używana jako pierwsze słowo prostego polecenia, powłoka wykonuje polecenie bezpośrednio, bez wywoływania innego programu. [...]
xargs odczytuje elementy ze standardowego wejścia, [...] i wykonuje polecenie
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".
find ... -exec bash -c 'type "$@"' _ {} +
Jest tu kilka problemów (niektóre już zaznaczone):
typejest 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 jest xargslub -execrozwidlony powłoki w tle.typesłuży do wyszukiwania własnych ścieżek. Jeśli podasz mu ścieżkę (jak findto zwykle bywa), prawdopodobnie po prostu zwróci tę ścieżkę. readlink -fmoże być lepiej, jeśli próbujesz rozwiązać dowiązania symboliczne; i możesz przesyłać do xargs readlinklub przez -exec readlink -f {} +cały dzień.Nie oznacza to, że nie możesz zrobić tego, co próbujesz. Istnieją dwie opcje. typeKomenda może obsługiwać wiele imion na raz, więc może po prostu dostarczyć wszystkie nazwy na raz:
type $(find /usr/sbin -name anacron)
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ż typejest 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ń).