Có thể sử dụng nhiều tài liệu ở đây trong bash không?


14

Một người có thể sử dụng nhiều tài liệu ở đây để cung cấp đầu vào cho một lệnh trong bash không?

$ cat <<<foo <<<bar
bar
$ cat <<EOF1 <<EOF2
> foo
> EOF1
> bar
> EOF2
bar

Rõ ràng, trong cả hai trường hợp, tài liệu thứ hai ở đây được sử dụng như stdin và thay thế cho tham chiếu đầu tiên. Là giải pháp để sử dụng echos thay thế?

$ cat <(echo -n foo) <(echo bar)
foobar

Ngoài ra, vì một số lý do, sử dụng kết hợp không hiệu quả với tôi. Tại sao lại như vậy?

$ cat <<<foo <(echo bar)
bar
$ cat <(echo -n foo) <<<bar
foo

Có bất kỳ lý do đằng sau thực tế là bạn muốn sử dụng hai tài liệu ở đây thay vì kết hợp nó thành một?
đậu

1
@beans Tôi thực sự gặp phải nó khi thử nghiệm pastevới các đầu vào giả. Tôi cho rằng tôi có thể nghĩ ra một vài kịch bản khác. Nếu tôi đã có một tập lệnh với văn bản được xử lý trước trong một vài biến, thì tôi có thể muốn làm một cái gì đó cho cả hai bằng một lệnh chỉ lấy các tệp, ví dụ diff.
Sparhawk

Một trường hợp sử dụng khác (tôi đã tìm thấy điều này bằng cách sử dụng tài liệu ở đây để tạo tập lệnh shell): bạn muốn một vài dòng có mở rộng biến và sau đó một số dòng không có : cat <<EOF1 <<"EOF2".
Toby Speight

Câu trả lời:


18

Bạn có thể làm:

cat /dev/fd/3 3<< E1 /dev/fd/4 4<< E2
foo
E1
bar
E2

Chỉ có thể có một stdin, vì chỉ có một mô tả tệp 0.

cat << EOF
eof
EOF

là viết tắt của:

cat /dev/fd/0 0<< EOF
eof
EOF

Và:

cat <<< foo

Là:

cat /dev/fd/0 0<<< foo

Bạn phải quyết định mở cái gì trên mô tả tập tin 0.

cat <(echo foo)

Là:

cat /dev/fd/123

Trường hợp 123một bộ mô tả tệp cho một đường ống và song song, bash chạy echo footrong một quy trình khác với thiết bị xuất chuẩn được chuyển hướng đến đầu kia của ống.

Khi bạn chuyển tên tệp đến cat, catkhông còn đọc từ stdin. Bạn sẽ cần:

cat <(echo foo) /dev/fd/0 << EOF
bar
EOF

Hoặc là:

cat <(echo foo) - << EOF
bar
EOF

( -là nói catđể đọc từ stdin).


1
cat <<EOFkhông chính xác giống như cat /dev/fd/0...: trong trường hợp sau catthấy tên tệp và mở.
Mikel

@Mikel, ý tôi là nó tương đương về chức năng . Khi không thông qua bất kỳ đối số nào, hãy catđọc từ fd0 của nó , như thể đã truyền một đối số -hoặc /dev/fd/0(mặc dù trên Linux (chỉ dành cho Linux), việc mở /dev/fd/0không hoàn toàn giống như sao chép bộ mô tả tệp 0).
Stéphane Chazelas

Tôi đã rất ngạc nhiên bởi /dev/fd/3 3<< E1cấu trúc và bây giờ tôi tự hỏi chính xác các mục dưới / dev / fd / là gì. Tôi mặc dù chúng bằng cách nào đó xuất hiện kỳ ​​diệu sau khi quá trình mở một tệp ở đâu đó trên hệ thống tệp ngoại trừ 1 và 2 theo mặc định cho mọi quy trình. Nhưng trong ví dụ của bạn, bạn đang sử dụng mô tả tệp 3 và 4 không được kết nối với bất kỳ tệp thực nào ngoại trừ chuyển hướng đầu vào đó. Tôi không thể hiểu điều đó trong mô hình tinh thần của người mô tả tập tin. Điều gì xảy ra nếu quá trình muốn mở một tệp khác, liệu nó có biết nó phải sử dụng fd 5 không? Do fds phải là 3, 4, 5 .. hay có thể là bất cứ điều gì?
calavera.info

@ calavera.info, có vẻ như bạn muốn tạo một câu hỏi tiếp theo.
Stéphane Chazelas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.