Thay thế quá trình với chuyển hướng đầu vào


7

Tôi đang cố gắng để hiểu chuyển hướng đầu vào kết hợp với phân nhóm quá trình. Tôi đang sử dụng bash3

Một ví dụ với trnhư sau

$ tr "o" "a" <(echo "Foo")
tr: extra operand `/dev/fd/63'
Try `tr --help' for more information.

Tôi nghĩ rằng tôi hiểu tại sao điều này không hoạt động. Sự thay thế quá trình <( )tạo ra một mô tả tập tin, trong đó trchỉ đọc từ đầu vào tiêu chuẩn.

Làm thế nào tôi có thể làm cho nó hoạt động với chuyển hướng thích hợp?

Tôi biết rằng tôi chỉ có thể sử dụng đường ống:

$ echo "Foo" | tr "o" "a"
Faa

Tuy nhiên, tôi đang cố gắng để hiểu rõ hơn. Tôi đã thử một số thứ với sự giúp đỡ của man bash, bằng cách sử dụng <&, nhưng tôi không thực sự biết mình đang làm gì.

Làm thế nào tôi có thể sử dụng thay thế quá trình đúng cách sử dụng tr?

Câu trả lời:


10

Bạn đã thực sự gần gũi:

tr "o" "a" < <(echo "Foo")

Sự thay thế <()làm cho một mô tả tập tin và chỉ dán đường dẫn đến trình bao. Để hiểu chỉ cần thực hiện:

<(echo blubb)

Bạn sẽ thấy lỗi:

-bash: /dev/fd/63: Permission denied

Đó là lý do tại sao nó chỉ nhét /dev/fd/63vào vỏ và /dev/fd/63không thể chữa được, bởi vì đó là một đường ống đơn giản. Trong ví dụ trở trên, nó echo "Foo"ghi vào đường ống và thông qua chuyển hướng đầu vào, <đó là trlệnh đọc từ bộ mô tả tệp.


Aah, tất nhiên, tôi đã thử <<(: o. Cảm ơn!
Bernhard

4
ls -ld <(echo blubb)có thể là một minh họa tốt hơn.
Stéphane Chazelas

3

Tôi thấy loạt Giải thích Bash One-Liners rất hữu ích trong việc hiểu thêm về tất cả những thứ này.

Cụ thể bài viết được liên kết ở trên là tất cả về chuyển hướng đầu vào.

Để giải quyết ví dụ cụ thể ở trên:

> tr "o" "a" <<< $(echo "Foo")
Faa

Đây là sử dụng "chuỗi-đây", nhưng không thực hiện bất kỳ chuyển hướng đầu vào nào. Mặc dù có thể với câu hỏi của tôi, nhưng đối với đầu vào nhiều dòng thì nó bị hỏng (theo như tôi có thể thấy từ các thử nghiệm của mình)
Bernhard

2
@Bardard. Nó không chuyển hướng. Đầu tiên, nó chạy echo Footrong một lớp con với đầu ra được chuyển hướng đến một đường ống. Nó đọc đầu ra đó từ đầu kia của ống và lưu nó (trừ các ký tự dòng mới). Khi đạt được eof trên đường ống đó, tùy thuộc vào vỏ, nó thực hiện phân tách từ trên đó và nối các từ kết quả có dấu cách ( bash) hoặc không (zsh, ksh93). Và sau đó lưu trữ và một dòng mới vào một tập tin tạm thời. Sau đó, trđầu vào được chuyển hướng từ tập tin tạm thời đó.
Stéphane Chazelas

@ StéphaneChazelas (không được thông báo bởi nhận xét của bạn). Tôi không biết chuỗi ở đây cũng sử dụng các tệp tạm thời, nhưng điều đó có ý nghĩa. Cảm ơn bạn.
Bernhard
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.