2012-08-25 4 views
7

Ho questo script di shell che utilizzo per eseguire il backup del mio sistema. C'è una linea:Errore di sintassi nello script di shell con sostituzione di processo

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) 

Come potete vedere, ho cercato di filtrare il fastidioso "presa ignorato", inutile errore da tar, utilizzando this blog post.

quello che ottengo da shell al momento dell'esecuzione è:

/bin/sysback: Linea 45: errore di sintassi nei pressi di token imprevisto >' /bin/sysback: line 45: tar -Pzcpf/backup/backup --directory =/ --exclude = proc --exclude = sys --exclude = dev/pts --exclude = backup --exclude = var/log/2>> (grep -v 'presa ignorato'> & 2)'

+0

penso '2>> (' 'dovrebbe essere 2> ('. –

+0

Non ha dato un errore di sintassi dopo questa modifica, ma non filtrare l'output sia. –

+2

La sintassi di sostituzione del processo> (...) è una funzione non standard e la tua shell apparentemente non la supporta.Usa una shell diversa, o forse una versione più recente di bash. –

risposta

17

La sintassi che hai usato è un'estensione bash alla sintassi di base della shell, quindi devi fare attenzione a eseguire lo script con bash. (Ksh ha anche la sostituzione del processo >(…) ma non lo supporta dopo un reindirizzamento. Zsh andrebbe bene.)

Dato il messaggio di errore che si sta ottenendo, si sta eseguendo questo script in bash, ma nella sua modalità di compatibilità POSIX , non in modalità bash completa. Abbi cura di invocare il tuo script con una riga esplicita #!/bin/bash. #!/bin/sh non funzionerà, anche se /bin/sh è un collegamento simbolico a bash, perché bash viene eseguito in modalità POSIX se viene richiamato con il nome sh. Invoca sempre bash per nome se usi le funzioni di bash.

Inoltre, fare attenzione a non impostare la variabile di ambiente POSIXLY_CORRECT o passare l'opzione --posix sulla riga di comando se si desidera utilizzare le funzioni di bash.

In alternativa, non utilizzare questa sintassi specifica per bash; utilizzare un costrutto portatile come quello proposto da Stephane Rouberol.

7

Come su :

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

Anche se quello che stai offrendo qui è un'alternativa legittima alla soluzione, sceglierò la soluzione @Gilles come risposta corretta, poiché risponde al punto posto dalla domanda. Grazie per l'ottima risposta però. –

0

Ho scoperto che su gentoo anche se sh è un link a/bin/bash se si chiama lo script con 'sh 'nomescript'' non viene eseguito come uno script bash e languiranno:

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

Quindi, se è necessario utilizzare la funzione di sostituzione del processo, è necessario eseguirlo specificamente con bash. Ma non ho trovato alcun riferimento a questo.

1

In realtà non è necessario eseguire tale reindirizzamento in errore std quando tar di GNU fornisce opzioni per ignorare l'avviso "socket ignorato".

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

Grazie per il commento, ma soprattutto grazie per il link :) –

Problemi correlati