xargs erkennt keine Bash-Aliase
Ich versuche, führen Sie den folgenden Befehl ein:
find . -iname '.#*' -print0 | xargs -0 -L 1 foobar
wo "foobar" ist ein alias oder eine Funktion definiert, in meine .bashrc-Datei (in meinem Fall, es ist eine Funktion, die einen parameter). Anscheinend ist xargs nicht erkennen, wie die Dinge ablaufen können. Ist es ein cleverer Weg, dies zu beheben?
InformationsquelleAutor der Frage Ian Greenleaf Young | 2009-02-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Da nur Ihre interaktive shell kennt auch Aliase, warum nicht starten Sie einfach den alias ohne Verzweigung durch
xargs
?Wenn Sie sicher sind, dass Sie die Dateinamen nicht über Zeilenumbrüche (ick, warum sollten Sie?), Sie vereinfachen das zu
oder auch nur
find -iname '.#*' | ...
da das Standard-Verzeichnis ist.
und die Standard-Aktion ist-print
.Noch eine alternative:
sagen, Bash, dass Worte nur auf Spalten mit Zeilenumbruch (Standard:
IFS=$' \t\n'
). Sollten Sie vorsichtig mit dieser, obwohl, einige Skripte nicht gut zurecht kommen mit einer veränderten$IFS
.InformationsquelleAutor der Antwort ephemient
Bash benutzen, können Sie auch geben Sie die Anzahl der Argumente übergeben, um Sie Ihren alias (oder einer Funktion) wie folgt:
InformationsquelleAutor der Antwort tilo
Diese funktioniert nicht, da
xargs
erwartet werden könnenexec
die Programm gegeben als parameter.Seit
foobar
in Ihrem Fall ist nur einbash
alias oder Funktion es ist kein Programm zum ausführen.Obwohl es beinhaltet ab
bash
für jede Datei zurückgegebenfind
Sie schreiben könnte ein kleines shell-script so:und übergeben Sie dann den Namen des Skripts als parameter für
xargs
InformationsquelleAutor der Antwort Alnitak
Ich in der Regel Verwendung finden, wie dieser:
'{}' wird ersetzt mit dem Dateinamen, und \; ist notwendig, um zu beenden die Ausführung Kette. Allerdings, wenn das nicht funktioniert, mit Ihrer Funktion, müssen Sie möglicherweise, um es durch bash:
Finden, wird jede Datei auf einer Zeile, die sed nur Präfixe, die dies mit Ihrem Befehl, und leiten es an die bash zur Ausführung. Überspringen Sie die |bash zuerst, um zu sehen, was passieren wird.
InformationsquelleAutor der Antwort Staale