2012-08-25 25 views
7

Ich habe dieses Shell-Skript, das ich verwenden, um mein System zu sichern. Es gibt eine Zeile:Syntaxfehler in Shell-Skript mit Prozesssubstitution

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) 

Wie Sie sehen können, habe ich die lästigen, nutzlos „socket ignoriert“ Fehler durch Teer, um herauszufiltern versucht, mit this blog post.

Was ich von Shell erhalten bei Ausführung ist:

/bin/sysback: Zeile 45: Syntaxfehler in der Nähe von unerwartetes Token >' /bin/sysback: line 45: tar -Pzcpf/backups/backup --directory =/ --exclude = proc --exclude = sys --exclude = dev/pts --exclude = Sicherungen --exclude = var/log/2>> (grep -v 'Buchse ignoriert'> & 2)‘

+0

denke ich '2>> (' 'sollte 2> sein ('. –

+0

Haben Sie nicht einen Syntaxfehler nach dieser Änderung geben, aber entweder die Ausgabe nicht herausfiltern. –

+2

Die> (...) Prozesssubstitutionssyntax ist eine nicht standardmäßige Funktion, und Ihre Shell unterstützt sie anscheinend nicht. Verwenden Sie eine andere Shell oder vielleicht eine neuere Version von bash. –

Antwort

17

Die Syntax, die Sie verwendet haben, ist eine Bash-Erweiterung der grundlegenden Shell-Syntax, so dass Sie darauf achten müssen, Ihr Skript mit bash auszuführen. (Ksh hat auch >(…) Prozesssubstitution, aber unterstützt es nicht nach einer Umleitung. Zsh wäre in Ordnung.)

Angesichts der Fehlermeldung, die Sie bekommen, führen Sie dieses Skript in bash, aber im POSIX-Kompatibilitätsmodus , nicht im vollen Bash-Modus. Achten Sie darauf, Ihr Skript mit einer expliziten #!/bin/bash Zeile aufzurufen. #!/bin/sh nicht tun, auch wenn /bin/sh ist eine symbolische Verbindung zu bash, weil Bash im POSIX-Modus ausgeführt wird, wenn es unter dem Namen sh aufgerufen wird. Rufen Sie bash immer namentlich auf, wenn Sie Bash-Funktionen verwenden.

Achten Sie auch darauf, die Umgebungsvariable POSIXLY_CORRECT nicht zu setzen oder die Option --posix in der Befehlszeile zu übergeben, wenn Sie bash-Funktionen verwenden möchten.

Alternativ verwenden Sie diese Bash-spezifische Syntax nicht; Verwenden Sie ein tragbares Konstrukt wie das von Stephane Rouberol vorgeschlagene.

7

Wie wäre es :

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

Auch wenn das, was Sie hier anbieten, eine legitime Alternative zu der Lösung ist, werde ich @Gilles Lösung als die richtige Antwort wählen, da sie den von der Frage gestellten Punkt beantwortet. Danke für die sehr gute Antwort. –

0

Ich habe das auch auf gentoo gefunden, wenn sh ein Link auf/bin/bash ist, wenn Sie das Skript mit "sh‚skript‘nennen sie es als ein Bash-Skript nicht ausgeführt wird und nicht mit:

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

Also, wenn Sie die Prozess Substitution Funktion benötigen, müssen Sie es speziell mit bash ausführen. Aber ich habe keinen Hinweis darauf gefunden.

1

Eigentlich müssen Sie nicht für eine solche Umleitung in Std-Fehler gehen, wenn GNU-tar Optionen bietet, die "Socket ignored" Warnung zu ignorieren.

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

Danke für den Kommentar, aber besonders danke für den Link :) –