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
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
Odpowiedzi:
type
nie jest normalnym poleceniem. To buitin powłoki. Widzieć:
$ type type
type is a shell builtin
Musisz więc wywoływać za bash
pomocą, -c
aby 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
. -I
w xargs
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
:
[...] 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):
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 jest xargs
lub -exec
rozwidlony powłoki w tle.type
służy do wyszukiwania własnych ścieżek. Jeśli podasz mu ścieżkę (jak find
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ć do xargs 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:
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ż 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ń).