Như hầu hết những người khác đã quan sát, "-n" được hiểu theo nghĩa đen nếu được đặt ở bất cứ đâu nhưng ngay sau echo
lệnh.
Trong lịch sử, các tiện ích UNIX đều như thế này - chúng chỉ tìm kiếm các tùy chọn ngay sau tên lệnh. Có khả năng BSD hoặc GNU đã tiên phong cho phong cách linh hoạt hơn (mặc dù tôi có thể sai), vì ngay cả bây giờ POSIX chỉ định cách cũ là chính xác (xem Hướng dẫn 9 và cả man 3 getopt
trên hệ thống Linux). Dù sao, mặc dù hầu hết các tiện ích Linux ngày nay đều sử dụng kiểu mới, vẫn có một số phần như thế echo
.
Echo
là một mớ hỗn độn, tiêu chuẩn khôn ngoan, trong đó có ít nhất hai phiên bản xung đột cơ bản được chơi vào thời điểm POSIX ra đời. Một mặt, bạn có kiểu SYSV, phiên dịch các ký tự thoát dấu gạch chéo ngược nhưng xử lý các đối số của nó theo nghĩa đen, không chấp nhận các tùy chọn. Mặt khác, bạn có kiểu BSD, xử lý một chữ cái đầu -n
như một trường hợp đặc biệt và xuất ra hoàn toàn mọi thứ khác theo nghĩa đen. Và vì echo
rất tiện lợi, bạn có hàng ngàn tập lệnh shell phụ thuộc vào hành vi này hay hành vi khác:
echo Usage: my_awesome_script '[-a]' '[-b]' '[-c]' '[-n]'
echo -a does a thing.
echo -b does something else.
echo -c makes sure -a works right.
echo -- DON\'T USE -n -- it\'s not finished! --
Do ngữ nghĩa "đối xử với mọi thứ theo nghĩa đen", thậm chí không thể thêm tùy chọn mới echo
mà không phá vỡ mọi thứ. Nếu GNU sử dụng sơ đồ tùy chọn linh hoạt trên nó, địa ngục sẽ vỡ ra.
Ngẫu nhiên, để tương thích tốt nhất giữa các triển khai shell Bourne, hãy sử dụng printf
chứ không phảiecho
.
CẬP NHẬT để giải thích tại sao echo
đặc biệt không sử dụng các tùy chọn linh hoạt.
echo -n "bar"
đưa ra "thanh", trong khiecho "bar" -n
cho "thanh -n"