Wie eine for-Schleife verwenden, in machen Rezept
Ich würde gerne eine Schleife verwenden, um einige Dateien zu finden, und benennen Sie Sie:
for i in `find $@ -name *_cu.*`;do mv $i "$(echo $i|sed s/_cu//)"
done
Dies funktioniert in der shell. Aber wie kann ich das in ein makefile Rezept?
- Off-topic: es wäre eine gute Idee, zu zitieren
'*_cu.*'
dem find-Befehl, wie Sie wollen, erweitert durch das finden, nicht die Schale, die Berufung zu finden. - Das auslösen dieser Befehl funktioniert nicht richtig mit dieser
$@
als Ihr Ziel.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es zwei wichtigsten Dinge, die Sie wissen müssen, wenn Sie setzen nicht-triviales shell-Fragmente in machen Rezepte:
Befehle im Rezept sind (natürlich!) ausgeführt in einer Zeit, wo Befehl bedeutet "tab-Zeile vorangestellt, die in das Rezept", möglicherweise verteilt über mehrere makefile Zeilen mit backslashes.
Damit Ihre shell fragment geschrieben werden, die alle auf einem (möglicherweise backslashed) Linie. Darüber hinaus ist es effektiv präsentiert auf der shell als eine einzige Zeile (die backslashed-Zeilenumbrüchen nicht klar Zeilenumbrüche sind also nicht als Befehl terminatoren von der shell), so muss syntaktisch korrekt als solche.
Beiden shell-Variablen und make-Variablen eingeführt werden, sind durch dollar-Zeichen (
$@
,$i
), so dass Sie brauchen, um sich zu verstecken Ihre shell-Variablen machen, indem Sie Sie als$$i
. (Genauer gesagt, alle dollar-Zeichen, die Sie gesehen werden wollen durch die shell geschützt werden müssen, aus machen, es zu schreiben, wie$$
.)Normalerweise in ein shell-Skript, das Sie schreiben würden separate Befehle in getrennte Zeilen, aber hier hast du effektiv nur eine einzige Zeile, so müssen die einzelnen shell-Befehle mit Semikolon statt. Putting all dies zusammen, für dein Beispiel ergibt sich:
beziehungsweise:
Bemerken, dass letztere, auch wenn es angeordnet ist, gut lesbar auf mehrere Zeilen, erfordert die gleiche sorgfältige Verwendung von Semikolons zu halten die Schale glücklich.
$@
intakt? Ist es nicht eine Besondere Bedeutung in Makefiles? In der shell, es wird erweitert, um die Liste der Skript-Argumente...system()
gibt, so gibt es keine shell-Skript-Argumente und die shell$@
würde immer leer sein. OTOH machen$@
bezieht sich auf das Ziel der Regel (hier foo), die ich angenommen wurde, was beabsichtigt war.Fand ich es nützlich, versucht die for-Schleifen zu bauen mehrere Dateien:
Wird es kompilieren von foo.c, bar.c, andere.c in foor bar andere ausführbare Dateien