Rurowanie do polecenia „typ”


10

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

Myślę, że odpowiedź Oli jest najlepszą odpowiedzią. Odpowiedź chaosu po prostu działa, ale odpowiedź Oli jest sprytna.
Helio

Odpowiedzi:


17

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".


3
Możesz to skondensować dofind ... -exec bash -c 'type "$@"' _ {} +
muru

2
@muru rzeczywiście, ponownie przeczytałem własną odpowiedź i zobaczyłem ją =)
chaos

11

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ń).


1
Dziękuję Oli! Ten początkujący linux nauczył się dzisiaj czegoś nowego na temat „typu” i jego zachowań.
LjinKazama,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.