Ich versuche, die Ausgabe eines Befehls in Bash mit einem zu lesen while loop
.
while read -r line
do
echo "$line"
done <<< $(find . -type f)
Die Ausgabe habe ich bekommen
ranveer@ranveer:~/tmp$ bash test.sh
./test.py ./test1.py ./out1 ./test.sh ./out ./out2 ./hello
ranveer@ranveer:~/tmp$
Danach habe ich es versucht
$(find . -type f) |
while read -r line
do
echo "$line"
done
aber es erzeugte einen Fehler test.sh: line 5: ./test.py: Permission denied
.
Also, wie lese ich es Zeile für Zeile, weil ich denke, dass es derzeit die gesamte Zeile auf einmal schlürft.
Erforderliche Ausgabe:
./test.py
./test1.py
./out1
./test.sh
./out
./out2
./hello
while read
Teil siehe Grundlegendes zu IFS und den dort verknüpften Fragen.find
finden , wie ich zwei bash Befehle in -exec des Befehls find verwenden kann? oder Ausführen einer benutzerdefinierten Funktion in einem find -exec-Aufruf (von dem diese Frage meistens ein Duplikat ist).Antworten:
Es gibt einen Fehler, den Sie
< <(command)
nicht brauchen<<<$(command)
< <( )
ist eine Prozessersetzung ,$()
eine Befehlsersetzung und<<<
eine Here-Zeichenfolge .quelle
$( )
alles zu umgehen ! Dies ist die Syntax für die Befehlsersetzung , bei der es sich nur um eine Möglichkeit handelt, die Befehlsausgabe zu verwenden. Pipes und Process-Substitution und Here-Strings sind andere, und sie haben natürlich alle eine andere Syntax. Sie sollten sowieso keine Dateinamen analysieren, es sei denn, Sie wissen wirklich, was Sie tun.Process Substitution
.Beachten Sie, dass Dateinamen durch nichts daran gehindert werden, Zeilenumbrüche zu enthalten. Der kanonische Weg, einen Befehl für jede von find gefundene Datei auszuführen , ist.
Und wenn Sie möchten, dass die Dinge in Bash erledigt werden:
Die kanonische Methode zum Aufrufen des Befehls "read" in Skripten (wenn Sie keine zusätzliche Verarbeitung der Eingabe wünschen) ist:
-r
soll verhindern, dassread
Backslash-Zeichen speziell behandelt werden (als Escape-Zeichen für Trennzeichen und Zeilenumbrüche), und IFS =, um die Liste der Trennzeichen auf die leere Zeichenfolge für zu setzenread
(andernfalls, wenn sich in dieser Liste ein Leerzeichen befindet, werden sie aus der Liste entfernt) Anfang und Ende der Eingabe).Die Verwendung von Schleifen in Shells ist normalerweise eine schlechte Idee (nicht, wie in Shells vorgegangen wird, bei denen mehrere Tools gemeinsam und gleichzeitig für eine Aufgabe ausgeführt werden, anstatt ein oder mehrere Tools hunderte Male hintereinander auszuführen).
quelle