Có một sự khác biệt giữa các đối số dòng lệnh và đầu vào tiêu chuẩn. Một đường ống sẽ kết nối đầu ra tiêu chuẩn của một quá trình với đầu vào tiêu chuẩn của một quá trình khác. Vì thế
ls | echo
Kết nối đầu ra tiêu chuẩn của ls với đầu vào tiêu chuẩn của tiếng vang. Khỏe phải không? Chà, echo bỏ qua đầu vào tiêu chuẩn và sẽ kết xuất các đối số dòng lệnh của nó - không có trong trường hợp này - thiết bị xuất chuẩn của chính nó. Đầu ra: không có gì cả.
Có một vài giải pháp trong trường hợp này. Một là sử dụng một lệnh đọc stdin và dumps để stdout, chẳng hạn như cat.
ls | cat
Sẽ 'làm việc', tùy thuộc vào định nghĩa công việc của bạn là gì.
Nhưng những gì về trường hợp chung. Những gì bạn thực sự muốn là chuyển đổi thiết bị xuất chuẩn của một lệnh thành dòng lệnh args của một lệnh khác. Như những người khác đã nói, xargs
là công cụ trợ giúp chính tắc trong trường hợp này, đọc dòng lệnh của nó lập luận cho một lệnh từ stdin của nó và xây dựng các lệnh để chạy.
ls | xargs echo
Bạn cũng có thể chuyển đổi một số, sử dụng lệnh thay thế $()
echo $(ls)
Cũng sẽ làm những gì bạn muốn.
Cả hai công cụ này đều khá cốt lõi để tạo kịch bản shell, bạn nên tìm hiểu cả hai.
Để đầy đủ, như bạn chỉ ra trong câu hỏi, cách cơ bản khác để chuyển stdin thành dòng lệnh args là read
lệnh dựng sẵn của shell . Nó chuyển đổi "từ" (các từ được xác định bởi IFS
biến) thành biến tạm thời, mà bạn có thể sử dụng trong bất kỳ lệnh chạy nào.
ls | echo
làm gì? Tại sao không đơn giản là chạyls
?