2011-08-12 24 views
90

Tôi quen thuộc với cú pháp sau:Cú pháp đa dòng để tạo đường ống cho một cây con; là di động này?

cmd1 << EOF | cmd2 
text 
EOF 

nhưng chỉ phát hiện bash cho phép tôi viết:

cmd1 << EOF | 
text 
EOF 
cmd2 

(các heredoc được sử dụng như là đầu vào để CMD2). Điều này có vẻ giống như một cú pháp rất kỳ quặc. Nó có di động không?

+0

Tôi đến đây để tìm cách chia tách thành nhiều dòng: 'lệnh dài 1 với nhiều args << EOF | command2 lớn-dài với rất nhiều args'. "Cú pháp lẻ" có vẻ như là cách tốt nhất. – PaulC

+0

Một trường hợp sử dụng thuận tiện cho điều này là khi bạn đang cố gắng chuyển đổi một bảng được phân cách bằng dấu cách thành một bảng được phân cách bằng dấu cách để bạn có thể dán nó vào Bảng tính Google. Bạn sẽ không phải tạo tệp tạm thời. –

+0

Người đầu tiên không làm việc cho tôi trong z-shell. Tôi không thích người thứ 2 vì nó xa lánh | từ lệnh, mất thành ngữ (?) của đường ống vỏ. –

Trả lời

72

Vâng, tiêu chuẩn POSIX phép này. According to the 2008 version:

ở đây-tài liệu sẽ được coi là một từ duy nhất mà bắt đầu sau khi tiếp theo <newline> và tiếp tục cho đến khi có một dòng chỉ chứa dấu phân cách và một <newline>, không có <blank> ký tự ở giữa. Sau đó, tài liệu tại đây bắt đầu, nếu có.

Và bao gồm ví dụ này nhiều "ở đây-tài liệu" trong cùng một dòng:

cat <<eof1; cat <<eof2 
Hi, 
eof1 
Helene. 
eof2 

Vì vậy, không có vấn đề làm chuyển hướng hoặc ống dẫn. Ví dụ bạn là tương tự như một cái gì đó như thế này:

cat file | 
cmd 

Và ngữ pháp vỏ (tiếp tục xuống trên trang được liên kết) bao gồm những định nghĩa:

pipe_sequence :        command 
       | pipe_sequence '|' linebreak command 

newline_list  :    NEWLINE 
       | newline_list NEWLINE 
       ; 
linebreak  : newline_list 
       | /* empty */ 

Vì vậy, một biểu tượng ống có thể được theo sau bởi một thúc- của dòng và vẫn được coi là một phần của một đường ống.

9

Hmm, tôi giả sử có, theo thử nghiệm trong bash trong chế độ POSIX:

$ bash --posix 
$ cat <<EOF | 
> ahoj 
> nazdar 
> EOF 
> sed 's/a/b/' 
bhoj 
nbzdar 
+1

hoạt động trong 'dấu gạch ngang' quá –

+0

Chỉ một ghi chú nhỏ khác: không đặt bất kỳ dấu cách nào sau khi đóng' EOF'. Dấu nhắc sẽ hoạt động lạ và bạn sẽ tự hỏi cái quái gì là sai –

+0

Chạy bash trong chế độ POSIX tắt * một số * mở rộng, nhưng không phải bằng bất kỳ phương tiện nào gần như tất cả chúng. Như vậy, trong khi câu trả lời này là chính xác về những gì POSIX cho phép, lý do của nó không hỗ trợ rất hiệu quả. –

15

Có trong ngữ pháp trình bao POSIX. Bạn cũng có thể có hơn ai ở đây-doc cho cùng một lệnh (một số ví dụ khác sử dụng hai cat lời gọi, nhưng hoạt động này là tốt):

cat <<EOF1 <<EOF2 
first here-doc 
EOF1 
second here-doc 
EOF2 

này được trù định (sử dụng 2 đây-docs cho stdin), nhưng nếu bạn nghĩ đến việc cung cấp đầu vào cho các bộ mô tả tệp khác nhau thì ngay lập tức có ý nghĩa.

Ngoài ra còn có khả năng thả cat hoàn toàn. Tại sao không cung cấp tài liệu ở đây trực tiếp cho cmd:

cmd << EOF 
input 
here 
EOF 
+0

'' ' mèo << EOF1 << EOF2 đầu tiên ở đây-doc EOF1 thứ hai ở đây-doc EOF2 ' '' ở trên không hoạt động. – user1424739

+0

@ user1424739 Nó hoạt động trong zsh và bash hiện tại. Tro và ksh93 dường như chỉ xuất ra tài liệu thứ hai ở đây. – Jens

+0

Tại sao lại là downvote? Nếu có điều gì đó không chính xác, hãy cho tôi cơ hội để khắc phục. – Jens

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