
In der Dokumentation xargs
wird ein „replstr“ erwähnt, den das -I
Flag übernimmt. Ich begann, darüber zu lesen, als ich diesen Befehl zum Ausführen fand fswatch
:
fswatch -0 -e ".*" -i ".rb" . | xargs -0 -n 1 -I {} ruby {}
und begann, die Manpage fürxargs
-I replstr
Execute utility for each input line, replacing one or more occurrences of replstr in up to replacements (or 5 if no -R flag is
specified) arguments to utility with the entire line of input. The resulting arguments, after replacement is done, will not be
allowed to grow beyond 255 bytes; this is implemented by concatenating as much of the argument containing replstr as possible, to
the constructed arguments to utility, up to 255 bytes. The 255 byte limit does not apply to arguments to utility which do not
contain replstr, and furthermore, no replacement will be done on utility itself. Implies -x.
Wenn ich über den Begriff „replstr“ nachdenke, scheint er wahrscheinlich so etwas wie „read evaluate print loop string“ zu bedeuten. Ist das die Abkürzung? Ich habe angefangen, damit herumzuspielen, um eine Vorstellung davon zu bekommen, was es {}
tut, aber ich bin mir nicht sicher, ob ich es schon wirklich verstehe:
➜ scripts git:(master) ✗ {0..3}
zsh: command not found: 0..3
➜ scripts git:(master) ✗ echo {0..3}
0 1 2 3
➜ scripts git:(master) ✗ echo {a..3}
a ` _ ^ ] \ [ Z Y X W V U T S R Q P O N M L K J I H G F E D C B A @ ? > = < ; : 9 8 7 6 5 4 3
➜ scripts git:(master) ✗ echo {a..d}
a b c d
➜ scripts git:(master) ✗ echo cats and dogs | xargs
cats and dogs
➜ scripts git:(master) ✗ echo cats and dogs | xargs {}
xargs: {}: No such file or directory
➜ scripts git:(master) ✗ echo cats and dogs | xargs {} echo {}
xargs: {}: No such file or directory
➜ scripts git:(master) ✗ echo cats and dogs | xargs -I {}
➜ scripts git:(master) ✗ echo cats and dogs | xargs -I {} echo {}
cats and dogs
Zum Beispiel echo {a..3}
ergibt das für mich wirklich keinen Sinn. Es scheint definitiv so, als würde es etwas in der Art von „ersetze diese Liste von Zeichenfolgen hier“ bewirken, aber ich bin mir nicht sicher, ob das die richtige Sichtweise ist. Außerdem bin ich mir nicht sicher, ob es {}
sich um einen bestimmten Typ von Replstr handelt und ob es mehr gibt oder ob ein Replstr einfach irgendetwas zwischen einem Paar geschweifter Klammern ist. Ich würde mich über eine Anleitung zu Replstrs und ihrer Herangehensweise freuen.
Antwort1
replstr
bedeutet „Ersatzzeichenfolge“ oder „Ersetzungszeichenfolge“.
Der ursprüngliche replstr ist {}
. Er wurde zuerst mit der find
Befehlsklausel eingeführt exec
, wo er durch jeden gefundenen Dateinamen ersetzt wurde, z. B.
find /tmp -name "foo*" -exec echo file {} found \;
wird angezeigt, vorausgesetzt, dass zwei Dateien dem Muster entsprechen:
file foo1 found
file foo2 found
Der xargs
Befehl ermöglicht dasselbe mit Argumenten, die aus an die Standardeingabe übergebenen Zeichenfolgen erstellt wurden, und ermöglicht auch die Angabe von etwas anderem als der {}
Ersatzzeichenfolge.
Beachten Sie, dass sich der Standard-Replstr einfach {}
ohne Inhalt innerhalb der geschweiften Klammern befindet. Letztere werden für verschiedene Zwecke verwendet, z. B. Bereiche, wie Sie bereits bemerkt haben, oder Parametererweiterung.
Antwort2
Das -I
Argument funktioniert folgendermaßen: -I whatever
bedeutet, dass Vorkommen von wörtlich whatever
durch das Befehlsargument ersetzt werden. Demo:
$ echo "a
b
c" | xargs -I f echo hey f hey f
hey a hey a
hey b hey b
hey c hey c
Sehen Sie? xargs
Ich habe jede der Zeilen a
, b
, und genommen c
und sie anstelle von f
in eingesetzt echo hey f hey f
.
Es besteht kein {}
Zusammenhang.
Die -I
Option ist POSIX. GNU xargs
dokumentiert eine veraltete -i
Option, die sich bei Aufruf als -iwhatever
wie verhält -I whatever
. Bei Aufruf als -i
verhält sie sich wie -I {}
. In diesem Fall {}
werden Vorkommen von ersetzt. {}
ist eindeutig von einer Funktion von inspiriert find
: seinem -exec
Prädikat.
Die {a..b}
Bash foo{a,b,c}bar
-Syntax, die durch ihre „Klammererweiterung“ verarbeitet wird, {}
hat keine besondere Bedeutung und wird unverändert an einen Befehl übergeben. (Wenn dies nicht der Fall wäre, würde dies standardkonforme, häufig vorkommende find
Aufrufe beschädigen.)
Antwort3
Das {...}
ist dasErweiterung der Shell-Klammer, das Listen wie {a,b,c}
(wird zu a
, b
und c
) und Zahlenfolgen wie {0..13}
(wird zu den Zahlen 0
, 1
... 12
, 13
) oder Zeichen {a..d}
( a
, b
, c
, d
) unterstützt. (Die Klammererweiterung hat nichts mit dem {}
von verwendeten Platzhalter zu tun xargs
.)
Die etwas seltsame Sequenz, die {a..3}
sich zu erweitert, erklärt sich durch dieASCII-Zeichentabelle. Da es a
sich bei nicht um eine Zahl handelt, werden beide als Zeichen betrachtet und die Erweiterung erfolgt durch alle Zeichen zwischen a
und 3
durch den numerischen Wert der Zeichencodes. Da zufällig a
nach kommt 3
, setzt sich die Sequenz abwärts durch die Großbuchstaben und die Zahlen 9 bis 3 fort.
Wie man sieht, ist das Mischen von Buchstaben und Zahlen in einem solchen Bereich nicht sehr sinnvoll, könnte es aber {a..z}
sein {A..Z}
, ebenso wie ähnliche „ [a-z]
und [A-Z]
“ in regulären Ausdrücken und Shell-Globs. (Das heißt, wenn Sie den Rest der Buchstaben ignorieren können.)