2012-08-25 11 views
7

Mam ten skrypt powłoki, którego używam do tworzenia kopii zapasowej mojego systemu. Jest linia:Błąd składni w skrypcie powłoki z podstawieniem procesu

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) 

Jak widać, ja staram się odfiltrować irytujące, bezużyteczne „gniazdo ignorowane” błąd przez smoły, korzystając this blog post.

Co mam z muszli po wykonaniu brzmi:

/bin/sysback: Linia 45: błąd składni w pobliżu nieoczekiwanego tokenu >' /bin/sysback: line 45: smoła -Pzcpf/backups/backup --directory =/ --exclude = Proc --exclude = sys --exclude = dev/pts --exclude = kopie zapasowe --exclude = var/log/('gniazdo ignorowane' grep -v> & 2) 2>>”

+0

myślę '2>> (' 'powinno być 2> ('. –

+0

nie daje błąd składni Po tej zmianie, ale nie odfiltrować wyjście albo. –

+2

Składnia podstawiania procesów> (...) jest niestandardową funkcją, a twoja powłoka najwyraźniej jej nie obsługuje. Użyj innej powłoki lub nowszej wersji bashu. –

Odpowiedz

17

Użyta składnia to rozszerzenie bash do podstawowej składni powłoki, więc musisz zachować ostrożność, aby uruchomić skrypt za pomocą bash. (Ksh ma również podstawienie procesowe >(…), ale nie obsługuje go po przekierowaniu.Zsh będzie w porządku.)

Z powodu otrzymanego komunikatu o błędzie, uruchamiasz ten skrypt w bashu, ale w trybie zgodności z POSIX , nie w trybie pełnego basha. Uważaj, aby wywołać scenariusz z wyraźną linią #!/bin/bash. #!/bin/sh nie zrobi, nawet jeśli /bin/sh jest dowiązaniem symbolicznym do basha, ponieważ bash działa w trybie POSIX, jeśli jest wywoływany pod nazwą sh. Zawsze wywołuj bash według nazwy, jeśli używasz funkcji basha.

Należy również uważać, aby nie ustawiać zmiennej środowiskowej POSIXLY_CORRECT lub przekazywać opcji --posix w wierszu poleceń, jeśli chcesz używać funkcji bash.

Alternatywnie, nie używaj tej składni specyficznej dla basha; użyj przenośnej konstrukcji, takiej jak zaproponowana przez Stephane Rouberol.

7

Jak o :

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

Mimo że to, co oferujesz tutaj, jest uzasadnioną alternatywą dla rozwiązania, wybiorę rozwiązanie @Gilles jako poprawną odpowiedź, ponieważ odpowiada on na pytanie postawione przez pytanie. Dziękuję za bardzo dobrą odpowiedź. –

0

I odkryli, że na Gentoo także jeśli sh jest link do/bin/bash, jeśli wywołać skrypt z „sh«Nazwa_skryptu»” nie uruchamiać go jako skrypt bash i zakończyć się niepowodzeniem:

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

Jeśli chcesz użyć funkcji podstawiania procesów, musisz uruchomić ją z bash. Ale nie znalazłem żadnego odniesienia do tego.

1

Właściwie nie musisz iść na takie przekierowanie w przypadku błędu standardowego, gdy GNU tar oferuje opcje ignorowania ostrzeżenia "ignorowane gniazdo".

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

Dzięki za komentarz, ale specjalnie dzięki za link :) –

Powiązane problemy