Backticks können dort nicht funktionieren, da sie einmal ausgewertet werden, bevor sie findüberhaupt ausgeführt werden, und das Ergebnis als statischer Parameter für die Suche verwendet wird.
Sven
Antworten:
10
Der beste Weg, dies zu tun, ist die Verwendung von Positionsparametern. Und $()ist bevorzugt für Kommandosubstitution ove Backticks , weil es besser lesbar ist (nicht mit einfachen Anführungszeichen zu verwechseln) und kann leicht , ohne viel zu entkommen zu tun haben verschachtelt werden.
Vielen Dank für die Lösung meines unmittelbaren Problems, aber ich bin immer noch gespannt, ob Backticks wie beschrieben verwendet werden können. Nur um meinen Horizont zu erweitern.
RomanSt
Sie müssten die Shell über bash -coder ähnlich aufrufen .
Ignacio Vazquez-Abrams
0
Die einzige Möglichkeit, sie zu verwenden (AFAIK), besteht darin, sie in einer Bash-Skriptdatei abzulegen und das Skript in -exec zu verwenden. Gleiches mit$()
Vergiss nicht xargs! Ihr Beispiel würde für jede gefundene Datei einen neuen Shell-Prozess aufrufen.
Ich würde das vorziehen:
find ... | xargs stat -c "Blah: %a"
findgibt eine Liste aller gefundenen Elemente aus, xargsliest eine Liste der Argumente stdinund führt ihren Parameter mit diesen Argumenten in der Befehlszeile aus, wobei eine so lange Befehlszeile wie möglich erstellt wird. Es funktioniert, weil stat, wie die meisten anderen richtigen Befehle / Programme, eine beliebige Anzahl von Parametern verwendet wird. (vergleichen ls, rmundecho zum Beispiel)
Wenn Sie der Meinung sind, dass es unbedingt erforderlich ist, für jede Datei einen neuen Prozess zu starten xargs -n 1, übergeben Sie nur 1Parameter an jeden Befehl. Auf diese Weise können Sie die ineffizienten Methoden wie folgt nachahmen:
find ... | xargs -n 1 stat -c "Blah: %a"
(Versuchen Sie es auf einem großen Dateisystem auf einem langsamen Computer und messen Sie die Unterschiede!)
Ich schätze die Mühe, aber ich brauche diese Backticks. Offensichtlich ist mein Beispiel vereinfacht und verwendet echo + stat; Das eigentliche Skript verwendet weder Echo noch stat, sodass Ihr Trick, sie in der Formatzeichenfolge von stat zusammenzusetzen, überhaupt nicht hilft.
find
überhaupt ausgeführt werden, und das Ergebnis als statischer Parameter für die Suche verwendet wird.Antworten:
Der beste Weg, dies zu tun, ist die Verwendung von Positionsparametern. Und
$()
ist bevorzugt für Kommandosubstitution ove Backticks , weil es besser lesbar ist (nicht mit einfachen Anführungszeichen zu verwechseln) und kann leicht , ohne viel zu entkommen zu tun haben verschachtelt werden.Der Unterstrich ist ein Platzhalter für
$0
.quelle
Wozu?
Oder verwenden
bash -c
Sie, wenn Sie wirklich müssen:quelle
bash -c
oder ähnlich aufrufen .Die einzige Möglichkeit, sie zu verwenden (AFAIK), besteht darin, sie in einer Bash-Skriptdatei abzulegen und das Skript in -exec zu verwenden. Gleiches mit
$()
quelle
Vergiss nicht
xargs
! Ihr Beispiel würde für jede gefundene Datei einen neuen Shell-Prozess aufrufen.Ich würde das vorziehen:
find ... | xargs stat -c "Blah: %a"
find
gibt eine Liste aller gefundenen Elemente aus,xargs
liest eine Liste der Argumentestdin
und führt ihren Parameter mit diesen Argumenten in der Befehlszeile aus, wobei eine so lange Befehlszeile wie möglich erstellt wird. Es funktioniert, weilstat
, wie die meisten anderen richtigen Befehle / Programme, eine beliebige Anzahl von Parametern verwendet wird. (vergleichenls
,rm
undecho
zum Beispiel)Wenn Sie der Meinung sind, dass es unbedingt erforderlich ist, für jede Datei einen neuen Prozess zu starten
xargs -n 1
, übergeben Sie nur1
Parameter an jeden Befehl. Auf diese Weise können Sie die ineffizienten Methoden wie folgt nachahmen:find ... | xargs -n 1 stat -c "Blah: %a"
(Versuchen Sie es auf einem großen Dateisystem auf einem langsamen Computer und messen Sie die Unterschiede!)
quelle