Sostituzione dei parametri in sh -c


0

Ho un gran numero di file di registro, l'idea è di raggrupparli per data / mese e quindi impacchettarli in archivi.
Ecco la mia sceneggiatura:

find /c/this/path/ -type f -name "$file_pattern" | xargs -I fn basename fn | cut -c$start-$end | uniq | xargs -I {} sh -c "tar zcvf {}-$postfix.tgz {}$file_pattern"

tutte le variabili sono definite. Tuttavia, quando eseguo questo (chiamo una funzione che contiene questo script), l'archivio non viene creato e non vengono visualizzati errori. Quando eseguo questo manualmente, con parametri hardcoded, funziona benissimo. Suppongo di aver sbagliato con la sostituzione dei parametri.
A proposito, lo eseguo su Windows usando i comandi forniti con l'installazione di msysgit (se questo fa la differenza).


Inserisci un echo prima sh -cper vedere cosa succede.
Ciro,

Li hai esportati? Perché sh -c invoca una nuova subshell
Romeo Ninov il

@RomeoNinov cosa intendi per esportazione?
chester89,

export VARIABLE = valore
Romeo Ninov

@RomeoNinov vedo. no, le variabili sono definite all'interno di uno script e lette dai parametri
chester89

Risposte:


1

Se capisco la tua domanda, vuoi sapere come passare argomenti allo script specificato da -c

...|xargs -I {} sh -c 'tar zcvf "$1"-'"$postfix"'.tgz "$1"'"$file_pattern" _ {}

Il primo argomento dopo che lo script ( _) diventerà $0in sh, e l'argomento successivo ( {}da xargs) sarà $1. Il mix di virgolette singole e doppie è un po 'disordinato ma necessario poiché hai alcuni parametri che devi sostituire ora e alcuni che devi shgestire.



0

Devi chiamare le tue variabili in questo modo ${variable}invece $variableche è anche normale scriverlo in maiuscolo in questo modo${VARIABLE}


0

Mi sembra di aver capito il problema. Lo stesso script va bene. file_pattern è definito come: file_pattern=*.logTuttavia, nella directory corrente avevo un file che corrisponde a quel carattere jolly (ad esempio qualcosa.log) - e la variabile file_pattern è stata riempita con il nome di quel file. Dopo aver racchiuso la valutazione file_pattern tra virgolette doppie, tutto è andato bene. Qualcuno potrebbe dirmi perché una tale espansione?
EDIT Sono sfuggito all'asterisco in questo modo: file_pattern=\*.loge ora lo script funziona bene

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.