2013-09-05 30 views
5

Trên một máy Centos 6, công trình này:Không sh thay thế quá trình hỗ trợ <(...)?

bash -c 'if grep -qP --line-buffered ".+" <(tail -n 1000 -F catalina.out) ; then echo "yes"; fi' 

và điều này không:

sh -c 'if grep -qP --line-buffered ".+" <(tail -n 1000 -F catalina.out) ; then echo "yes"; fi' 

tôi nhận được:

sh: -c: line 0: syntax error near unexpected token `(' 
sh: -c: line 0: `if grep -qP --line-buffered ".+" <(tail -n 1000 -F catalina.out) ; then echo "yes"; fi' 

Nevermind grep và đuôi. Vấn đề là với thingy thay thế quá trình: <(...)

Ai đó có thể cho tôi biết sh có khác gì ở đây không?

[EDIT]

Cảm ơn câu trả lời!

Sự cố phát sinh khi sử dụng capistrano để triển khai. Giá trị mặc định là sử dụng sh nhưng tôi đã thay đổi điều đó thành bash ngay bây giờ. Lý do tôi không thể thực hiện đường ống thông thường là khi sử dụng tail -F | grep -q --line-buffered, grep sẽ không thoát ngay sau khi khớp. Phải có thêm một chỉnh sửa đối với tệp như echo "" >> catalina.out và điều này không được chấp nhận trong trường hợp của tôi.

Trả lời

5

Cú pháp <(...) chỉ được BASH hỗ trợ.

Đối với bất kỳ vỏ POSIX, sử dụng phương pháp này:

sh -c 'tail -n 1000 -F catalina.out | if grep -qP --line-buffered ".+" ; then ...' 

ví dụ: di chuyển chuyển hướng stdin ở phía trước của if với một ống. Các if sẽ vượt qua stdin vào grep.

if tail ...| grep sẽ không hoạt động vì if sẽ không thể xem được then/fi vì đường ống tách các quy trình.

+0

'nếu đuôi ... | grep ...; sau đó ... fi' làm việc cho tôi trong dấu gạch ngang và bash trong chế độ posix. – choroba

+0

@choroba: Có. Nhưng nó hoạt động trong 'sh' hay' ksh'? –

+0

Nó hoạt động trong ksh. 'sh' trên hệ thống của tôi là dấu gạch ngang hoặc bash ở chế độ posix. – choroba

3

Cũng lưu ý rằng nếu Bash is invoked with the name sh, nó cố gắng bắt chước hành vi khởi động của các phiên bản lịch sử của sh càng chặt chẽ càng tốt, đồng thời tuân thủ tiêu chuẩn POSIX.

Nếu sh của bạn thực sự là một liên kết để bash, thì đây là nguyên nhân gây ra điều đó.

Chạy sh --version; sh -c ': <(echo a)' sẽ cung cấp cho bạn đủ thông tin.

5

Bạn nên lưu ý rằng quá trình thay thế (<(...)) không được chỉ định bởi POSIX. Vì vậy, nếu bạn đang chạy trong chế độ bash POSIX bằng cách gọi nó với sh hoặc nói:

set -o posix 

sau đó bạn sẽ theo dõi lỗi!

Từ bash manual: Bash

Bắt đầu với các tùy chọn --posix dòng lệnh hoặc thực hiện 'set -o posix' khi Bash đang chạy sẽ gây ra Bash cho phù hợp chặt chẽ hơn với tiêu chuẩn POSIX bằng cách thay đổi hành vi để khớp với số được chỉ định bởi POSIX ở những khu vực khác nhau mặc định Bash.

...

Thay thế quy trình không khả dụng.

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