Habe exit-code 123 in der find + xargs grep
Hier ist mein Skript
eval "find \\( -type f -a \\( -name '*.h' \\) \\) -print0" | xargs -0 -n100 grep -f <(echo "stdio")
echo $?
Nichts gefunden wird und der exit-code ist 123.
Wenn ich es ein wenig modifizieren und wie folgt
echo "stdio" >.P
eval "find \\( -type f -a \\( -name '*.h' \\) \\) -print0" | xargs -0 -n100 grep <.P
echo $?
Etwas gefunden, aber der exit-code ist noch 123.
Also, was ist falsch?
======================================================================
Eigentlich möchte ich nur schreiben, ein kleines script zu machen find+xargs+grep einfacher. Zum Beispiel,
xgrep -e MOTIV1 -e MOTIV2 ... *.c *.h
ausführen
find-name *.c -o -name *.h|xargs grep -f <(echo "$PATTEN1
$PATTERN2")
Verwenden Sie die option-f anstelle von-e ist um die Unannehmlichkeiten zu vermeiden, in die Flucht Einzel-oder Doppel-quations innerhalb der patterns.
#!/bin/bash
#set -e -o pipefail
eval ARGV=($(getopt -l '' -o 'e:li' -- "$@")) || exit 1
for((i=0;i<${#ARGV[@]};i++)) {
o="${ARGV[$i]}"
case $o in
-e)
i=$((i+1));
a="${ARGV[$i]}"
if [ -n "$grep_patterns" ]; then
grep_patterns="$grep_patterns"$'\n'
fi
grep_patterns="$grep_patterns$a"
;;
-i)
grep_options="$grep_options -i"
;;
-l)
grep_options="$grep_options -l"
;;
--)
i=$((i+1));
break;;
esac
}
for((;i<${#ARGV[@]};i++)) {
if [ -n "$find_options" ]; then
find_options="$find_options -o "
fi
find_options="${find_options}-name '${ARGV[$i]}'"
}
cmd="find \\( -type f -a \\( $find_options \\) \\) -print0"
eval "$cmd" | xargs -0 grep $grep_options -f <(echo "$grep_patterns")
Warum sind Sie mit
eval
hier?InformationsquelleAutor Pan Ruochen | 2014-10-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
123 bedeutet "jeder Aufruf beendet mit einem nicht-null-status". So
xargs
liefgrep
mindestens zweimal (weil Sie gefüttert es so viele Dateien, die Sie überschreiten würde, die maximale Befehl die Länge der Linie, die Sie begrenzt auf 100 Dateien) und mindestens eine der Anrufungen wurde auf eine Reihe von Dateien, die enthalten keine übereinstimmungen, was verursachte, dass der exit-code vongrep
zu werden, ungleich null ist (Versagen).Vielleicht sollten Sie erklären, was Sie versuchen zu erreichen. Die
eval
sieht überflüssig und die doppelte Umleitung ist wahrscheinlich nicht vollenden, was Sie wollen (grep
's standard-Eingang können nicht gleichzeitig angeschlossen werden, um das Rohr auseval
und zu.P
).Wenn Sie möchten, einstellen, das erste argument
grep
vielleicht etwas tun, wie... wo Sie auch aufrufen, mit z.B.
stdio
wie das erste argument.(Beachten Sie auch die wesentlich vereinfachte Parameter
find
. Sie haben nur zwei Prädikaten, so gibt es keine Notwendigkeit, parenthesize nichts, und dann die-a
abgelegt werden kann, auch.)Den exit-code wird immer noch 123 wenn es
grep
Anrufungen der Rückgabewert null entspricht. Können Sie verringern die Chancen, durch weglassen der-n 100
(die wohl kaum dienen alle nützlichen Zweck sowieso), aber wenn Sie wollen unbedingt verhindern, können Sie füttern die gesamte pipeline zu| grep .
dem Bericht wird der Erfolg, wenn es keine Ausgabe. (Oder Sie könntenxargs
auf ein wrapper, der immer wieder Erfolg, wenn der exit-code vongrep
ist entweder 0 oder 1, aber das ist komplexer, und Sie werden dann sehen, "Erfolg", selbst im Falle von null Treffern.)InformationsquelleAutor tripleee
Ich bin dieses posting, als eine separate Antwort in der Antwort auf deinen letzten edit. Ich weiß nicht besonders wollen meine bestehenden Antwort, die bereits Adressen die grundlegende Frage stellen.
Skript ist leider ein klassisches Beispiel für das beschriebene problem in http://mywiki.wooledge.org/BashFAQ/050: "ich bin versucht, meinen Befehl in eine variable, aber"...
Die kurze version ist "don' T do that". Die lange version ist, versuchen Sie, die Verwendung von arrays und Variablen vermeiden, wo Sie nicht unbedingt notwendig sind. Hier ist der Versuch einer Umgestaltung von Werkzeug entlang dieser Linien.
Ich bin nicht sicher, dass die übergabe mehrerer
-e
Optionengrep
unterstützt wird überall, aber es funktioniert mit GNUgrep
und vereinfacht die Sache meiner Meinung nach.InformationsquelleAutor tripleee