Computer >> Máy Tính >  >> Lập trình >> Lập trình BASH

Chuyển hướng stdin, stdout, stderr trong Linux / Bash, có ví dụ

Linux / Bash shell có ba luồng dữ liệu mà bạn có thể khai thác khi thực hiện lệnh - stdin , stdout, stderr . Đây là cách sử dụng chúng.

stdin , stdout , stderr cho phép hiển thị văn bản trong bảng điều khiển và dữ liệu đang được xuất ra mỗi luồng có thể được chuyển trực tiếp vào các chương trình khác.

Chúng được gọi là Luồng chuẩn .

stdin là gì (Đầu vào chuẩn)?

Luồng nhập văn bản.

Ứng dụng có thể chấp nhận văn bản qua stdin làm đầu vào.

stdout là gì (Đầu ra tiêu chuẩn)?

Luồng đầu ra văn bản của một chương trình.

Các ứng dụng gửi dữ liệu đến các chương trình khác (hoặc đến bảng điều khiển để xem) qua stdout .

stderr (Lỗi chuẩn) là gì?

Luồng đầu ra lỗi văn bản của một chương trình.

Nếu một chương trình gặp lỗi, chương trình đó sẽ gửi dữ liệu về lỗi qua stdout luồng.

… Yeah, Nhưng điều đó thực sự có nghĩa là gì?

Một chương trình máy tính thực hiện những việc với dữ liệu đầu vào và đầu ra - ví dụ:một chương trình có thể chấp nhận một phương trình toán học và đưa ra lời giải cho nó.

Bạn cần một cách để đưa phương trình IN vào chương trình và một cách để nhận câu trả lời NGOÀI chương trình. Bạn cũng muốn biết liệu phương trình có không thể giải được hay không, vì vậy bạn muốn xem bất kỳ LỖI nào được tạo, tách biệt với bất kỳ OUTPUT nào khác.

Đó là stdin , stdout stderr .

Bởi vì mọi thứ hoạt động theo cùng một cách giúp cuộc sống dễ dàng hơn, các đầu vào, đầu ra và luồng lỗi này đã được chuẩn hóa để các ứng dụng được xây dựng cho dòng lệnh đều hoạt động theo cùng một cách.

Do đó, Luồng chuẩn . Mỗi luồng có một số nhận dạng từ 0-3:

0 stdin
1 stdout
2 stderr

Chuyển hướng / Đường ống từ stdin , stdout , stderr trong Bash / Shell

Bạn nhập vào Linux shell là một luồng văn bản - bạn nhập và luồng văn bản được đưa vào đầu vào bảng điều khiển.

Một ứng dụng chạy và dữ liệu văn bản đầu ra từ nó được đưa vào bảng điều khiển để hiển thị để bạn có thể đọc nó.

Đây là tất cả các hành vi mặc định khi làm việc trên bảng điều khiển, nhưng nó có thể được thay đổi. Các luồng có thể được chuyển hướng - ví dụ:đầu ra của chương trình có thể được truyền trực tiếp vào một tệp chứ không phải vào bảng điều khiển để xem.

Đầu ra từ một chương trình có thể được chuyển hướng trực tiếp thành đầu vào của chương trình khác.

Dưới đây là một số ví dụ cơ bản sử dụng chuyển hướng và đường ống.

Chuyển hướng

Thông thường, tiếng vang lệnh sẽ in văn bản vào bảng điều khiển:

echo "hello there!"

stdout của chương trình echo đang sử dụng đường dẫn mặc định của nó để hiển thị trên màn hình của bạn.

Chuyển hướng cho phép bạn gửi nó ở một nơi khác. Tại đây, nó được gửi đến một tệp:

echo "hello there!" > test.txt

Một tệp có tên là text.txt sẽ được tạo có chứa văn bản “xin chào!” ( coi chừng, nếu tệp đã tồn tại, nó sẽ bị ghi đè ).

Bạn có thể nối tệp bằng cách sử dụng >> thay vì >

Tiếp theo, hãy chuyển hướng stdin sử dụng <

cat < test.txt

Con mèo lệnh đọc nội dung của text.txt vào stdin của nó phát trực tiếp và sau đó thực hiện những gì con mèo lệnh được thiết kế để làm - in dữ liệu được cung cấp cho nó tới stdout , theo mặc định là bảng điều khiển để xem. Vì vậy, điều này sẽ đơn giản xuất ra xin chào! vào bảng điều khiển.

Dữ liệu trong tệp được chuyển hướng đến stdin đối với lệnh mèo - nó đã được chuyển hướng.

Đây là một loại gian lận, con mèo lệnh sẽ cố gắng đọc từ tên tệp được chuyển cho nó dưới dạng tham số mà không cần đường dẫn, nhưng đó là lệnh đơn giản nhất cho mục đích của ví dụ này.

Bạn có thể chuyển hướng stdin stdout trong cùng một lệnh:

cat < test.txt > output.txt

stdin đang được chuyển hướng, đang đọc test.txt thành con mèo chương trình và stdout từ con mèo chương trình đang được chuyển hướng vào một tệp có tên là output.txt .

Một lần nữa, điều này là gian lận vì nó thực sự chỉ sử dụng cat lệnh để sao chép một tệp, nhưng đó là một ví dụ đơn giản không dựa vào việc giải thích các lệnh khác.

Cuối cùng, bạn có thể chuyển hướng stderr phát trực tiếp bằng cách chỉ định số luồng duy nhất mà chúng tôi muốn đọc từ đó (là stdout là mặc định, nó không cần phải được chỉ định):

cat nofile.txt 2> error.txt

stdout được xác định bằng số 2 - nếu mèo tạo ra lỗi, nó sẽ được gửi qua luồng này và vào tệp error.txt .

Ví dụ trên sẽ tạo một tệp có tên là error.txt chứa văn bản:

cat: nofile.txt: No such file or directory

… Với tư cách là con mèo lệnh không thể tìm thấy tệp nofile.txt .

Chuyển hướng đồng thời

Trong ví dụ trên, stderr luồng được nhận dạng bằng số nhận dạng - điều này có nghĩa là bạn có thể chuyển hướng stdout stderr trong cùng một lệnh bằng cách chỉ định lệnh nào bạn muốn chuyển hướng:

echo "hello there! 1>test.txt 2>error.txt

Ở trên, stdout được gửi tới test.txt, stderr được gửi tới error.txt .

Đường ống

Piping giống như chuyển hướng, nhưng nó chỉ xử lý với stdin stdout lỗi được bỏ qua.

echo "hello there!" | cat

Đây, đường ống ( | ) đường ống (chuyển hướng) stdout của tiếng vang lệnh tới stdin của con mèo lệnh.

Kết luận

Làm việc với các ứng dụng dòng lệnh ban đầu có vẻ không trực quan, nhưng chúng là công cụ mạnh mẽ khi tự động hóa các tác vụ. stdin , stdout, stderr - luồng tiêu chuẩn là nền tảng của sự linh hoạt này - bạn có thể xâu chuỗi các lệnh lại với nhau để tạo ra các quy trình công việc phức tạp có thể xử lý hầu hết mọi tác vụ.