Đầu tiên, catghi vào đầu ra tiêu chuẩn, không nhất thiết phải là một thiết bị đầu cuối, ngay cả khi catđược gõ như một phần của lệnh vào một vỏ tương tác. Nếu bạn thực sự cần một cái gì đó để ghi vào thiết bị đầu cuối ngay cả khi đầu ra tiêu chuẩn được chuyển hướng, điều đó không dễ dàng (bạn cần chỉ định thiết bị đầu cuối nào, và thậm chí có thể không có một nếu lệnh được thực thi từ tập lệnh), mặc dù một lệnh (ab) có thể sử dụng đầu ra lỗi tiêu chuẩn nếu lệnh chỉ là một phần của đường ống. Nhưng vì bạn đã chỉ ra rằng catthực sự làm công việc đó, tôi cho rằng bạn không hỏi về tình huống như vậy.
Nếu mục đích của bạn là gửi những gì được ghi vào đầu ra tiêu chuẩn vào một đường ống, thì việc sử dụng catsẽ đủ điều kiện nhận Giải thưởng Sử dụng Mèo vô dụng , vì cat file | pipeline(trong đó pipelineviết tắt của bất kỳ đường ống nào) có thể được thực hiện hiệu quả hơn <file pipeline. Nhưng một lần nữa, từ cách diễn đạt của bạn, tôi suy luận rằng đây không phải là ý định của bạn.
Vì vậy, nó không phải là quá rõ ràng những gì bạn đang lo lắng. Nếu bạn thấy catquá dài để nhập, bạn có thể xác định bí danh một hoặc hai ký tự (vẫn còn một vài tên như vậy vẫn chưa được sử dụng trong Unix tiêu chuẩn). Tuy nhiên, nếu bạn lo lắng rằng việc catchi tiêu chu kỳ vô ích, bạn không nên.
Nếu có một chương trình nullkhông có đối số và chỉ sao chép đầu vào tiêu chuẩn thành đầu ra tiêu chuẩn (đối tượng trung tính cho đường ống), bạn có thể làm những gì bạn muốn với <file null. Không có chương trình nào như vậy, mặc dù nó sẽ dễ viết (chương trình C chỉ với mainchức năng một dòng có thể thực hiện công việc), nhưng gọi catmà không có đối số (hoặc cat -nếu bạn muốn rõ ràng) sẽ làm điều đó.
Nếu có một nocatchương trình lấy chính xác một đối số tên tệp, cố gắng mở tệp, khiếu nại nếu không thể, và nếu không thì tiến hành sao chép từ tệp sang đầu ra tiêu chuẩn, thì đó sẽ chỉ là những gì bạn đang yêu cầu. Nó chỉ khó viết hơn một chút so với null, công việc chính là mở tệp, kiểm tra và có thể phàn nàn (nếu bạn tỉ mỉ, bạn cũng có thể muốn bao gồm một bài kiểm tra có một đối số và khiếu nại khác). Nhưng một lần nữa cat, bây giờ được cung cấp với một đối số duy nhất, thực hiện điều đó, do đó không cần bất kỳ nocatchương trình nào .
Một khi bạn đã thành công trong việc viết nocatchương trình, tại sao chỉ dừng lại ở một đối số? Việc gói mã vào một vòng lặp for(;*argp!=NULL;++argp)thực sự không có chút nỗ lực nào, thêm nhiều nhất một vài hướng dẫn máy vào nhị phân và tránh phải phàn nàn về một số lượng đối số sai (bỏ qua nhiều hướng dẫn khác). Voilà một phiên bản nguyên thủy của catcác tập tin nối. (Thành thật mà nói, bạn cần phải tinh chỉnh nó một chút để không có đối số, nó hoạt động như null.)
Tất nhiên trong catchương trình thực tế , họ đã thêm một vài tiếng chuông và còi, bởi vì họ luôn luôn làm như vậy. Nhưng điều cốt lõi là khía cạnh "kết hợp" của catchi phí thực sự không có nỗ lực nào cả, cho cả lập trình viên cũng như cho máy thực hiện nó. Thực tế là catbao gồm nullvà nocatgiải thích sự không tồn tại của các chương trình như vậy. Tránh sử dụng catvới một đối số duy nhất nếu kết quả đi vào một đường ống, nhưng nếu nó chỉ được sử dụng để hiển thị nội dung tệp trên thiết bị đầu cuối, ngay cả trang tôi liên kết để thừa nhận rằng đây là cách sử dụng hữu ích cat, vì vậy đừng ngần ngại.
Bạn có thể kiểm tra catthực sự được thực hiện bằng một vòng lặp đơn giản xung quanh nocatchức năng giả định, bằng cách gọi catvới một số tên tệp trong đó một tên không hợp lệ, không ở vị trí đầu tiên: thay vì phàn nàn ngay lập tức rằng tệp này không tồn tại, cattrước tiên hãy bỏ qua các tệp hợp lệ và sau đó phàn nàn về tệp không hợp lệ (ít nhất đó là cách con mèo của tôi cư xử).