2012-08-25 7 views
7

Tengo este script de shell que utilizo para hacer una copia de seguridad de mi sistema. Hay una línea:Error de sintaxis en script de shell con sustitución de proceso

tar -Pzcpf /backups/backup.tar.gz --directory=/ --exclude=proc --exclude=sys --exclude=dev/pts --exclude=backups --exclude=var/log/2> >(grep -v 'socket ignored' >&2) 

Como se puede ver, he estado tratando de filtrar el molesto "toma ignorado", inútiles error por el alquitrán, utilizando this blog post.

Lo que recibo de la cáscara después de la ejecución es:

/bin/sysback: línea 45: error de sintaxis cerca inesperado contador >' /bin/sysback: line 45: alquitrán -Pzcpf/copias de seguridad/copia de seguridad --directory =/ --exclude = proc --exclude = sys --exclude = dev/pts --exclude = copias de seguridad --exclude = var/log/2>> (grep -v 'toma ignorado'> & 2)'

+0

pienso '2>> (' 'debe ser 2> ('. –

+0

no ha provisto un error de sintaxis después de este cambio, pero no filtrar la salida tampoco. –

+2

La sintaxis de sustitución de proceso> (...) es una característica no estándar, y aparentemente su shell no lo admite. Utilice un shell diferente, o quizás una versión más nueva de bash. –

Respuesta

17

La sintaxis que ha utilizado es una extensión bash de la sintaxis básica del shell, por lo que debe tener cuidado de ejecutar el script con bash. (Ksh también tiene una sustitución de proceso >(…), pero no lo admite después de una redirección. Zsh estaría bien.)

Dado el mensaje de error que está recibiendo, está ejecutando este script en bash, pero en su modo de compatibilidad POSIX , no en modo bash completo. Tenga cuidado de invocar su script con una línea explícita #!/bin/bash. #!/bin/sh no funcionará, incluso si /bin/sh es un enlace simbólico a bash, porque bash se ejecuta en modo POSIX si se invoca bajo el nombre sh. Siempre invoque bash por nombre si usa funciones bash.

También tenga cuidado de no establecer la variable de entorno POSIXLY_CORRECT o pasar la opción --posix en la línea de comandos si desea usar funciones bash.

Como alternativa, no use esta sintaxis específica de bash; use una construcción portátil como la propuesta por Stephane Rouberol.

7

¿Qué tal :

tar -Pzcpf /backups/backup.tar.gz --directory=/ \ 
    --exclude=proc --exclude=sys --exclude=dev/pts \ 
    --exclude=backups --exclude=var/log 2>&1 | grep -v 'socket ignored' 
+1

Aunque lo que ofrece aquí, es una alternativa legítima a la solución, elegiré la solución @Gilles como la respuesta correcta, ya que responde al punto planteado por la pregunta. Gracias por la muy buena respuesta sin embargo. –

0

he encontrado que en Gentoo también si sh es un enlace a/bin/bash si se llama a la secuencia de comandos con 'sh 'scriptname'' no se ejecuta como un script bash y fallar con:

matchmorethan.sh: line 34: syntax error near unexpected token `<' 
matchmorethan.sh: line 34: `done < <(cat $matchfile)' 

Por lo tanto, si necesita usar la función de Sustitución de procesos, debe ejecutarla específicamente con bash. Pero no encontré ninguna referencia a esto.

1

En realidad, no tiene que recurrir a dicha redirección en el error estándar cuando GNU tar proporciona opciones para ignorar la advertencia "socket ignorado".

tar --warning='no-file-ignored' -Pzcpf /backups/backup.tar.gz --directory=/ --exclude=proc --exclude=sys --exclude=dev/pts --exclude=backups --exclude=var/log/2> new.err 

You could find the original link with more ignore options here

+0

Gracias por el comentario, pero especialmente gracias por el enlace :) –

Cuestiones relacionadas