Bạn có thể chuyển hướng tất cả những gì bạn muốn echonhưng nó sẽ không làm gì với nó. echokhông đọc đầu vào tiêu chuẩn của nó. Tất cả những gì nó làm là ghi ra đầu ra tiêu chuẩn, các đối số của nó được phân tách bằng ký tự khoảng trắng và được chấm dứt bởi một ký tự dòng mới (và với một số echotriển khai với một số chuỗi thoát trong chúng được mở rộng và / hoặc các đối số bắt đầu có -thể được coi là tùy chọn).
Nếu bạn muốn echohiển thị nội dung của tệp, bạn phải chuyển nội dung đó làm đối số echo. Cái gì đó như:
echo "$(cat my_file.txt)"
Lưu ý rằng $(...)dải xuống dòng nhân vật dấu s từ đầu ra của mà catlệnh, và echothêm một trở lại.
Cũng lưu ý rằng ngoại trừ zsh, bạn không thể chuyển các ký tự NUL trong các đối số của lệnh, do đó, ở trên thường sẽ không hoạt động với các tệp nhị phân. yashcũng sẽ loại bỏ các byte không tạo thành một phần của các ký tự hợp lệ.
Nếu lý do muốn làm điều đó là bởi vì bạn muốn echođể mở rộng \n, \b, \0351... trình tự thoát trong file (như UNIX tuân thủ QTI echotriển khai làm, nhưng không phải tất cả ), sau đó bạn muốn sử dụng printfthay vì :
printf '%b\n' "$(cat my_file.txt)"
Trái ngược với echo, cái đó là di động và sẽ không gặp vấn đề gì nếu nội dung của tệp bắt đầu bằng -.
Thay thế cho $(cat file), với ksh, zshvà bash, người ta cũng có thể làm :$(<file) . Đó là một toán tử đặc biệt, theo đó shell thay vì catđọc nội dung của tệp để tạo thành phần mở rộng. Nó vẫn loại bỏ các dòng mới và cuộn cảm trên các byte NUL ngoại trừ trong zsh. Trong bashđó, vẫn còn một quá trình thêm. Cũng lưu ý rằng một điểm khác biệt là bạn sẽ không gặp phải bất kỳ lỗi nào nếu cố đọc một tệp có loại thư mục theo cách đó. Ngoài ra, trong khi $(< file)đặc biệt, $(< file; other command)không (trong zshkhi không mô phỏng trình bao khác, nó vẫn sẽ mở rộng nội dung của file, bằng cách chạy lệnh ẩn $READNULLCMD (thường là máy nhắn tin)).
echo?