Ich möchte den Typ mehrerer Befehle herausfinden. Ist es möglich, unter Linux xargs
ein Suchergebnis find
in den type
Befehl zu leiten?
Beispielsweise:
find . -name anacron | type
oder
find . -name anacron | xargs type
command-line
bash
find
LjinKazama
quelle
quelle
Antworten:
type
ist kein normaler Befehl. Es ist ein Shell Buitin. Sehen:So müssen Sie zum Aufruf
bash
mit-c
erreichen , was Sie wollenOder noch einfacher (keine Notwendigkeit
xargs
):Es wird
bash -c "type ./file"
mit jeder Datei aufgerufen , die von gefunden wirdfind
.-I
Inxargs
Mittel definieren wir hier einen Platzhalter{}
, der später verwendet werden soll. Dieser Platzhalter wird durch den gefundenen Dateinamen ersetzt.Warum Shell Builtins nicht funktionieren mit
xargs
:Der Befehl ist in diesem Fall einfach auslösbar, und eine eingebaute Shell ist keine ausführbare Datei. Es kann nicht im Dateisystem gefunden werden. Es ist in der Hülle selbst. Sie müssen also die Shell aufrufen und die aufgerufene Shell anweisen, den eingebauten Befehl aufzurufen. Das ist passiert mit
bash -c "command"
.quelle
find ... -exec bash -c 'type "$@"' _ {} +
Hier gibt es einige Probleme (einige sind bereits hervorgehoben):
type
ist ein eingebauter. Es ist kein Befehl, der gelöst wurde, es ist eine Funktion innerhalb von Bash. Sieheman bash-builtins
. Es funktioniert nur im Kontext von Bash, also keinexargs
oder-exec
gegabelte Subshell.type
ist es gewohnt, seine eigene Pfadsuche durchzuführen. Wenn Sie ihm einen Pfad geben (wiefind
es normalerweise der Fall ist), wird er diesen Pfad wahrscheinlich nur zurückgeben.readlink -f
ist möglicherweise besser, wenn Sie nur versuchen, Symlinks aufzulösen. und Sie können inxargs readlink
oder den-exec readlink -f {} +
ganzen Tag lang pfeifen.Das heißt nicht, dass Sie nicht tun können, was Sie versuchen. Es gibt zwei Möglichkeiten. Der
type
Befehl kann viele Namen gleichzeitig verarbeiten, sodass Sie einfach alle Namen gleichzeitig eingeben können:Wenn bei vielen Befehlen zu viele Argumente vorhanden sind, überschreiten Sie die Befehlszeilenlängenbeschränkung (siehe
getconf ARG_MAX
). Dies gilt jedoch in diesem Fall nicht, datype
es in die Shell integriert ist und keine neue Prozess-ID generiert (die Längenbeschränkung gilt für die Funktion exec () , die vom untergeordneten Prozess in einer normalen Befehlszeile verwendet wird).quelle