Bạn có thể chuyển hướng tất cả những gì bạn muốn echo
nhưng nó sẽ không làm gì với nó. echo
khô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ố echo
triể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 echo
hiể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à cat
lệnh, và echo
thê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. yash
cũ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 echo
triển khai làm, nhưng không phải tất cả ), sau đó bạn muốn sử dụng printf
thay 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
, zsh
và 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 zsh
khi 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
?