2016-06-03 11 views
8

Khi tôi viết:bash "echo" bao gồm ">" ở giữa tạo tập tin - xin giải thích

echo 2*3>5 is a valid inequality 

Trong terminal bash của tôi, một tập tin mới có tên 5 được tạo ra trong thư mục của tôi, trong đó có:

2*3 is a valid inequality 

Tôi muốn biết chính xác những gì đang xảy ra ở đây và tại sao tôi nhận được kết quả này? Tôi tin rằng rõ ràng là tôi mới sử dụng Linux! Cảm ơn

+5

Sử dụng dấu ngoặc: '$ echo "2 * 3> 5 là một sự bất bình đẳng hợp lệ"' Nếu bạn là [chuyển hướng] (http://www.tldp.org/LDP/abs/html/io-redirection.html) đầu ra – dawg

+2

không quá rõ ràng. Tôi đã sử dụng Linux trong 15 năm, tôi không có ý tưởng bạn có thể đặt chuyển hướng bất cứ nơi nào cho đến bây giờ. – njzk2

+0

@ njzk2, POSIX không yêu cầu nó được hỗ trợ ở bất kỳ đâu ngoài đầu hoặc cuối, nhưng không * không cho phép * hành vi như vậy; do đó, đó là một phần mở rộng bash, nhưng một hoàn toàn hợp pháp. –

Trả lời

7

bash hiện chuyển hướng đầu ra đầu tiên ví dụ >5 được thực hiện đầu tiên và một file có tên 5 được tạo ra (hoặc cắt ngắn nếu nó đã tồn tại). Trình mô tả tệp kết quả vẫn mở cho thời gian chạy của lệnh echo.

Sau đó phần còn lại, 2*3 is a valid inequality, chạy làm đối số cho echo và đầu ra tiêu chuẩn được lưu trong tệp (đã mở) 5 cuối cùng.

Để có được toàn bộ chuỗi như đầu ra, sử dụng đơn hoặc đôi dấu ngoặc kép:

echo '2*3>5 is a valid inequality' 
12

Trong bash, chuyển hướng có thể xảy ra ở bất kỳ đâu trong dòng (nhưng bạn không nên làm điều đó! --- xem the bash-hackers tutorial). Bash lấy >5 làm chuyển hướng, tạo tệp đầu ra 5 và sau đó xử lý phần còn lại của đối số. Do đó, echo 2*3 is a valid inequality xảy ra, cung cấp cho bạn kết quả bạn thấy trong tệp xuất 5.

Những gì bạn có thể muốn là

echo "2*3>5 is a valid inequality" 

hoặc

echo '2*3>5 is a valid inequality' 

(với đơn dấu ngoặc kép), một trong hai trong số đó sẽ cung cấp cho bạn những thông điệp mà bạn chỉ định như một bản in trên dòng lệnh. Sự khác biệt là, trong phạm vi "", các biến (chẳng hạn như $foo) sẽ được điền vào, nhưng không phải trong phạm vi ''.

Sửa: Các bash man page nói rằng các nhà khai thác chuyển hướng

có thể đặt trước hoặc xuất hiện bất cứ nơi nào trong một lệnh đơn giản hoặc có thể làm theo một lệnh. Chuyển hướng được xử lý theo thứ tự chúng xuất hiện, từ trái sang phải.

+2

Vì vậy, nếu tôi hiểu chính xác, nó không quan trọng nơi tôi đặt '> filename'! Đó là để nói như sau: 'lệnh một số văn bản> tên tệp một số văn bản' sẽ đặt đầu ra của lệnh đó là' một số văn bản một số văn bản' ở đây, trong một tệp gọi là tên tệp, phải không ?? – secluded

+1

@secluded Yep, theo như tôi biết. Tôi đã thêm một tham chiếu đến trang người đàn ông để biết thêm chi tiết. – cxw

3

Đây là ví dụ về output redirection. Bạn đang hướng dẫn phát biểu echo, thay vì viết thành tiêu chuẩn, hãy ghi vào tên tệp. Tên tệp đó xảy ra là "5".

Bạn có thể tránh hành vi đó bằng cách trích dẫn:

echo "2*3>5 is a valid inequality" 
Các vấn đề liên quan