Ich versuche, eine einfache Bash-Funktion zu schreiben, die als Argumente eine Reihe von Dateien und / oder Verzeichnissen verwendet. Es sollte:
- Qualifizieren Sie die Dateinamen vollständig.
- Sortieren Sie sie.
- Duplikate entfernen.
- Drucken Sie alles aus, was tatsächlich vorhanden ist.
- Gibt die Anzahl der nicht vorhandenen Dateien zurück.
Ich habe ein Skript, das fast macht, was ich will, aber auf die Sortierung fällt. Der Rückgabewert des Skripts in seiner jetzigen Form ist korrekt, die Ausgabe jedoch nicht (unsortiert und dupliziert). Wenn ich die | sort -u
Anweisung wie angegeben auskommentiere , ist die Ausgabe korrekt, der Rückgabewert jedoch immer 0
.
NB Einfachere Lösungen zur Lösung des Problems sind willkommen, aber die Frage ist wirklich, warum dies in dem Code auftritt, den ich habe. Das heißt, warum verhindert das Hinzufügen der Pipe scheinbar das Inkrementieren der Variablen durch das Skript r
?
Hier ist das Skript:
function uniqfile
{
local r=0
for arg in "$@"
do
readlink -e "$arg" || (( ++r ))
done #| sort -u ## remove that comment
return $r
}
for arg in "$@"
zufor arg
. "Wenn 'in WORTEN ...;' ist nicht vorhanden, dann wird 'in "$ @"' angenommen. " - Hilfe fürAntworten:
Dies ist aufgrund dieser Funktion eine bekannte Bash-Falle :
Damit sind geänderte Variablen lokal für die Subshell und nicht mehr im übergeordneten Element sichtbar.
Um dies zu vermeiden, formulieren Sie Ihren Code neu, um die Pipeline mit einer Prozessersetzung zu vermeiden:
quelle
>(..command..)
Konstrukts sagen könnten . Ich denke, ich weiß, wie es funktioniert, aber ich denke , ich sollte etwas weiter lesen.Das
| sort -u
erzwingt, dass das vorhergehende Bit (also die gesamte for-Schleife) in einem Unterprozess ausgeführt wird (bash benötigt ein 'STDOUT', um in dassort
'STDIN' umzuleiten. (Das Internet scheint diesen Fall etwas anders zu denkenksh
und zubash
behandeln. Zuerst oder zuletzt Befehl in der Pipe-Sequenz wird in eine Subshell gesetzt?)Dieser Thread behandelt ein ähnliches Problem und hat am Ende eine gute Lösung: http://ubuntuforums.org/showthread.php?t=312017
Auszugquelle