Một trần <làm gì?


10

bash dường như không phàn nàn nếu bạn chạy một lệnh như

$ < some-file-that-exists

Dường như không có gì xảy ra.

Bạn cũng có thể sử dụng

$ <<<"any string"

và thậm chí thay thế quá trình.

Vì vậy, chính xác những gì nó làm, và tại sao nó được cho phép. Nó có thể hữu ích cho bất cứ điều gì?


BTW: Đối với ZSH tuyệt vời, "<foobar" giống như "less foobar", như chuyển hướng foobar của bạn sang trình bao. Tôi nghĩ rằng đây là một hành vi khá trực quan. Một trần <sẽ cung cấp cho bạn một lỗi ( zsh: parse error near `\n') vì không có đối số được đưa ra.
toán

@math bạn sẽ gặp một lỗi tương tự bash, nhưng đó là điều thú vị less.
Thuốc nổ

Câu trả lời:


19

<thiết lập chuyển hướng cho một lệnh có thể xảy ra trước hoặc sau các hướng dẫn chuyển hướng. I E

$ < file wc

hoạt động tốt như

$ wc < file

Nhưng nếu bạn không đưa ra lệnh, bash sẽ thiết lập chuyển hướng và không làm gì khác. Đối với chuyển hướng đầu vào, số tiền này tương đương với những gì bạn đã thấy, không có gì, nếu tệp tồn tại và có thể đọc được. Nếu tệp không tồn tại hoặc không thể đọc được bash sẽ báo hiệu lỗi. Đối với chuyển hướng đầu ra, tệp đầu ra sẽ được tạo nếu nó không tồn tại. Bất kỳ tập tin đầu ra hiện tại sẽ bị cắt bớt nếu >được sử dụng; không cắt ngắn nếu >>được sử dụng.


nói cách khác, chúng là một tồn tại ngắn gọn và tạo ra
ratchet freak

@Kyle Jones Tôi nghĩ bạn không khớp hai nhà khai thác trong câu cuối cùng.
jamesbtate

@Puddingfox Cảm ơn. Tôi đã chỉnh sửa câu chạy vào cuối để làm rõ.
Kyle Jones

Có bất kỳ lý do để sử dụng < file wcso với wc < file?
Thuốc nổ

1
@tandu Nó có ích khi sử dụng shell tương tác. Giả sử bạn có một lệnh sử dụng chuyển hướng và bạn muốn lặp lại nó với một đối số cuối cùng khác. Nếu chuyển hướng ở đầu dòng, bạn có thể dễ dàng nhập control-P và sau đó chỉnh sửa đối số cuối cùng mà không phải bỏ qua ngôn ngữ "<foo> bar 2> & 1" như ở cuối dòng. Ngoài ra, tôi đã tìm thấy không sử dụng cho nó.
Kyle Jones

5

<đọc từ stdin theo mặc định hoặc tệp. biểu thức của bạn không làm gì với đầu vào vì bạn không làm gì sau khi đọc.

nếu bạn thực hiện <some-file-that-tồn tại> ở cuối tệp, thì bạn sẽ thấy rằng bạn vừa đọc nội dung của tệp đầu tiên và ghi nó vào tệp thứ hai.

<<< ở đây là định dạng doc, vì vậy nó đọc từ một chuỗi thay vì từ một tệp. mèo <<< "bất kỳ chuỗi" để xem những gì bạn đã đọc.


2
để tham khảo trong tương lai, vui lòng chỉnh sửa câu trả lời của bạn để thêm chi tiết thay vì thêm nhận xét
Nate Koppenhaver

1
"nếu bạn thực hiện <some-file-that-tồn tại> outputfile ở cuối thì bạn sẽ thấy rằng bạn vừa đọc nội dung của tệp đầu tiên và ghi nó vào tệp thứ hai." Cái này sai; không có lệnh, tập tin đầu ra sẽ bị cắt thành 0 byte.
Kyle Jones
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.