Sustitución de parámetros en sh -c

0

Tengo una gran cantidad de archivos de registro, la idea es agruparlos por fecha / mes y luego empaquetarlos en archivos.
Aquí está mi guión:

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"

Todas las variables están definidas. Sin embargo, cuando ejecuto esto (llamar a una función que contiene este script), el archivo no se crea y no se muestran errores. Cuando ejecuto esto manualmente, con parámetros codificados, funciona bien. Supongo que me equivoqué con la sustitución de parámetros.
Por cierto, ejecuto esto en Windows usando comandos que vienen con la instalación de msysgit (si esto hace alguna diferencia).

chester89
fuente
Inserte un echo antes sh -cpara ver qué sucede.
Cyrus
¿Los has exportado? Porque sh -c invoca una nueva subshell
Romeo Ninov
@RomeoNinov, ¿qué quieres decir con exportación?
chester89
export VARIABLE = value
Romeo Ninov
@RomeoNinov Ya veo. no, las variables se definen dentro de un script y se leen desde los parámetros
chester89

Respuestas:

1

Si entiendo su pregunta, desea saber cómo pasar argumentos al script especificado por -c

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

El primer argumento después del guión ( _) se convertirá $0en sh, y el siguiente argumento ( {}de xargs) será $1. La combinación de comillas simples y dobles es un poco desordenada, pero es necesaria ya que tiene algunos parámetros que necesita sustituir ahora y algunos que necesita shmanejar.

Glenn Jackman
fuente
+1. Más en esta respuesta .
Kamil Maciorowski
0

Debe llamar a sus variables de esta manera en ${variable}lugar de $variableque también sea convencional escribirlo en mayúsculas de esta manera${VARIABLE}

eikooc
fuente
0

Me parece que entiendo el problema. El guión en sí está bien. file_pattern se define como: file_pattern=*.logSin embargo, en el directorio actual tenía un archivo que coincide con ese comodín (por ejemplo, something.log), y la variable file_pattern se rellenó con el nombre de ese archivo. Después de envolver la evaluación file_pattern entre comillas dobles, todo estuvo bien. Puede ser que alguien me diga por qué tal expansión?
EDITAR Escapé del asterisco así: file_pattern=\*.logy el script funciona bien ahora

chester89
fuente