Weiterleitung an den Befehl "Typ"

10

Ich möchte den Typ mehrerer Befehle herausfinden. Ist es möglich, unter Linux xargsein Suchergebnis findin den typeBefehl zu leiten?

Beispielsweise:

find . -name anacron | type

oder

find . -name anacron | xargs type
LjinKazama
quelle
Ich denke, dass Oli Antwort die beste Antwort ist. Chaos Antwort funktioniert einfach, aber Oli Antwort ist klug.
Helio

Antworten:

17

typeist kein normaler Befehl. Es ist ein Shell Buitin. Sehen:

$ type type
type is a shell builtin

So müssen Sie zum Aufruf bashmit -cerreichen , 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. -IIn xargsMittel 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".

Chaos
quelle
3
Sie könnten es auffind ... -exec bash -c 'type "$@"' _ {} +
Muru
2
@ Guru in der Tat, ich las meine eigene Antwort noch einmal und sah es =)
Chaos
11

Hier gibt es einige Probleme (einige sind bereits hervorgehoben):

  • typeist 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 xargsoder -execgegabelte Subshell.
  • typeist es gewohnt, seine eigene Pfadsuche durchzuführen. Wenn Sie ihm einen Pfad geben (wie findes normalerweise der Fall ist), wird er diesen Pfad wahrscheinlich nur zurückgeben. readlink -fist möglicherweise besser, wenn Sie nur versuchen, Symlinks aufzulösen. und Sie können in xargs readlinkoder 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 typeBefehl 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 typees 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).

Oli
quelle
1
Danke Oli! Dieser Linux-Neuling hat heute etwas Neues über "Typ" und sein Verhalten gelernt.
LjinKazama