2012-08-25 25 views
7

Tôi có tập lệnh shell này mà tôi sử dụng để sao lưu hệ thống của mình. Có một dòng:Lỗi cú pháp trong tập lệnh shell với quá trình thay thế

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) 

Như bạn thấy đấy, tôi đã cố gắng để lọc ra những khó chịu, vô dụng "ổ cắm bỏ qua" lỗi bằng tar, sử dụng this blog post.

Những gì tôi nhận được từ vỏ khi thực hiện là:

/bin/sysback: dòng 45: lỗi cú pháp gần bất ngờ thẻ >' /bin/sysback: line 45: tar -Pzcpf/sao lưu/backup --directory =/ --exclude = proc --exclude = sys --exclude = dev/pts --exclude = sao lưu --exclude = var/log/2>> (grep -v 'ổ cắm phớt lờ'> & 2)'

+0

Tôi nghĩ '2>> ('nên được' 2> ('. –

+0

đã không đưa ra một lỗi cú pháp sau sự thay đổi này, nhưng không lọc ra kết quả một trong hai. –

+2

Cú pháp thay thế quá trình> (...) là một tính năng không chuẩn, và vỏ của bạn dường như không hỗ trợ nó. Sử dụng một trình bao khác, hoặc có lẽ là phiên bản mới hơn của bash. –

Trả lời

17

Cú pháp bạn đã sử dụng là một phần mở rộng bash vào cú pháp vỏ cơ bản, vì vậy bạn phải cẩn thận để chạy tập lệnh của mình bằng bash. (Ksh cũng có >(…) thay thế quy trình nhưng không hỗ trợ nó sau khi chuyển hướng. Zsh sẽ ổn thôi.)

Với thông báo lỗi bạn đang nhận được, bạn đang chạy tập lệnh này bash, nhưng trong chế độ tương thích POSIX của nó , không ở chế độ bash đầy đủ. Cẩn thận để gọi tập lệnh của bạn với dòng #!/bin/bash rõ ràng. #!/bin/sh sẽ không hoạt động, ngay cả khi /bin/sh là một liên kết tượng trưng để bash, vì bash chạy ở chế độ POSIX nếu nó được gọi dưới tên sh. Luôn gọi bash theo tên nếu bạn sử dụng các tính năng bash.

Cũng cẩn thận không đặt biến môi trường POSIXLY_CORRECT hoặc để chuyển tùy chọn --posix trên dòng lệnh nếu bạn muốn sử dụng các tính năng bash.

Hoặc, không sử dụng cú pháp bash cụ thể này; sử dụng cấu trúc di động như cấu trúc được đề xuất bởi Stephane Rouberol.

7

Làm thế nào về :

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

Mặc dù những gì bạn đang cung cấp ở đây, là một giải pháp thay thế hợp pháp cho giải pháp, tôi sẽ chọn giải pháp @Gilles làm câu trả lời chính xác, vì câu trả lời được đặt ra bởi câu hỏi. Cảm ơn bạn cho câu trả lời rất tốt mặc dù. –

0

Tôi đã phát hiện ra rằng trên gentoo cũng nếu sh là một liên kết đến/bin/bash nếu bạn gọi kịch bản với 'sh 'Tập lệnh'' nó không chạy nó như một kịch bản bash và thất bại với:

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

Vì vậy, nếu bạn cần sử dụng tính năng Thay thế quy trình, bạn cần chạy riêng nó bằng bash. Nhưng tôi không tìm thấy bất kỳ tham chiếu đến điều này.

1

Thực ra bạn không phải chuyển hướng như vậy trong lỗi std khi GNU tar cung cấp tùy chọn bỏ qua cảnh báo "bỏ qua socket".

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

Cảm ơn bạn đã bình luận, nhưng đặc biệt cảm ơn cho liên kết :) –

Các vấn đề liên quan