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
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
Antworten:
type
ist kein normaler Befehl. Es ist ein Shell Buitin. Sehen:
$ type type
type is a shell builtin
So müssen Sie zum Aufruf bash
mit -c
erreichen , was Sie wollen
$ find . -name anacron | xargs -I '{}' bash -c "type {}"
Oder noch einfacher (keine Notwendigkeit xargs
):
$ find . -name anacron -exec bash -c "type {}" \;
Es wird bash -c "type ./file"
mit jeder Datei aufgerufen , die von gefunden wird find
. -I
In xargs
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
:
[...] Eingebaute Befehle sind in der Shell selbst enthalten. Wenn der Name eines eingebauten Befehls als erstes Wort eines einfachen Befehls verwendet wird, führt die Shell den Befehl direkt aus, ohne ein anderes Programm aufzurufen. [...]
xargs liest Elemente aus der Standardeingabe [...] und führt den Befehl aus
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"
.
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. Siehe man bash-builtins
. Es funktioniert nur im Kontext von Bash, also keine xargs
oder -exec
gegabelte Subshell.type
ist es gewohnt, seine eigene Pfadsuche durchzuführen. Wenn Sie ihm einen Pfad geben (wie find
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 in xargs 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:
type $(find /usr/sbin -name anacron)
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, da type
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).