Ci sono due cose principali che dovete sapere quando mettere frammenti di conchiglie non banali nel fare le ricette: (! Ovviamente)
comandi della ricetta vengono eseguiti uno alla volta, in cui comando significa "riga con prefisso di tabulazione nella ricetta", eventualmente distribuita su più righe di makefile con barre retroverse.
Quindi il frammento della shell deve essere scritto tutto su una riga (possibilmente con il backslash). Inoltre è effettivamente presentato alla shell come una singola riga (le backlines backslashed non sono semplici newline quindi non vengono usate come terminatori di comando dalla shell), quindi deve essere sintatticamente corretta in quanto tale.
Entrambe le variabili di shell e rendere variabili sono introdotti dal segno del dollaro ([email protected]
, $i
), quindi è necessario per nascondere le variabili di shell da make scrivendoli come $$i
. (Più precisamente, ogni segno del dollaro che si desidera essere visto dalla shell deve essere scappato dal make scrivendo come $$
.)
Normalmente in uno script di shell si può scrivere comandi separati su righe diverse, ma qui in pratica si ottiene una sola riga, quindi è necessario separare i singoli comandi della shell con il punto e virgola. Mettendo insieme tutto questo per il vostro esempio produce:
foo: bar
for i in `find [email protected] -name *_cu.*`; do mv $$i "$$(echo $$i|sed s/_cu//)"; done
o equivalentemente:
foo: bar
for i in `find [email protected] -name *_cu.*`; do \
mv $$i "$$(echo $$i|sed s/_cu//)"; \
done
Si noti che questi ultimi, anche se è disposto essere letti su diverse linee, richiede lo stesso uso attento del punto e virgola per mantenere il guscio felice.
fonte
2012-01-06 12:28:58
Off- argomento: sarebbe una buona idea citare ''* _cu. *'' all'interno del comando find, come vuoi espanso per find, non la shell che sta invocando find. –
L'attivazione di questo comando non funzionerà correttamente con questo '$ @' come destinazione. – reinierpost