Stdin là gì

     
*
Fatmawati Achmad Zaenuri / Shutterstock.com

stdin, stdout, với stderr là bố luồng tài liệu được tạo khi chúng ta khởi chạy một lệnh Linux. Chúng ta cũng có thể sử dụng chúng để biết liệu các tập lệnh của chúng ta đang được chuyển qua làn đường khác hoặc đưa hướng. Shop chúng tôi chỉ cho mình cách làm.

Bạn đang xem: Stdin là gì


Luồng tham gia hai điểm

Ngay lúc bạn ban đầu tìm phát âm về những hệ điều hành hệt như Linux cùng Unix, bạn sẽ bắt gặp mặt các thuật ngữ stdin, stdout, cùng stederr. Đây là tía luồng tiêu chuẩn được tùy chỉnh khi một lệnh Linux được thực thi. Trong thứ tính, luồng là thứ hoàn toàn có thể truyền dữ liệu. Vào trường hợp của các luồng này, dữ liệu đó là văn bản.

Các dòng dữ liệu, giống như dòng nước, gồm hai đầu. Chúng tất cả một nguồn và một luồng ra. Ngẫu nhiên lệnh Linux nào nhiều người đang sử dụng đều cung cấp một đầu của mỗi luồng. Đầu kia được xác định bởi trình bao khởi chạy lệnh. Đầu cuối đó sẽ được kết nối với cửa sổ đầu cuối, được kết nối với đường ống hoặc được chuyển tìm hiểu tệp hoặc lệnh khác, theo mẫu lệnh đã khởi chạy lệnh.

Luồng chuẩn chỉnh Linux

Trong Linux, stdin được coi là dòng đầu vào tiêu chuẩn. Điều này chấp nhận văn bạn dạng làm đầu vào của nó. Đầu ra văn bản từ lệnh cho tới trình bao được gửi vào stdout (tiêu chuẩn chỉnh ra) luồng. Thông báo lỗi từ bỏ lệnh được gửi qua stderr (lỗi tiêu chuẩn) luồng.

Vì vậy, chúng ta cũng có thể thấy rằng tất cả hai luồng đầu ra, stdout và stderrvà một luồng đầu vào, stdin. Chính vì các thông tin lỗi cùng đầu ra bình thường đều gồm ống dẫn riêng để đưa chúng đến cửa sổ đầu cuối, chúng hoàn toàn có thể được xử lý độc lập với nhau.

Luồng được xử lý y hệt như tệp

Các luồng trong Linux — tương đương như số đông mọi sản phẩm công nghệ khác — được xem như thể bọn chúng là tệp. Chúng ta có thể đọc văn bạn dạng từ một tệp và bạn có thể ghi văn bạn dạng vào một tệp. Cả hai hành vi này đều tương quan đến một luồng dữ liệu. Vị vậy, khái niệm xử trí một luồng dữ liệu dưới dạng tệp không thực sự phức tạp.

Mỗi tệp được links với một tiến trình được cung cấp phát một vài duy độc nhất vô nhị để xác định nó. Đây được điện thoại tư vấn là bộ diễn tả tệp. Bất cứ khi nào một hành vi được yêu cầu thực hiện trên tệp, bộ miêu tả tệp được sử dụng để xác minh tệp.

Những cực hiếm này luôn luôn được thực hiện cho stdin, stdout, cùng stderr:

0: stdin1: stdout2: stderr

Phản ứng với Pipes cùng Redirects

Để dễ dãi giới thiệu một ai đó về một nhà đề, một kỹ thuật phổ cập là dạy một phiên phiên bản đơn giản hóa của nhà đề. Ví dụ, cùng với ngữ pháp, chúng ta được biết rằng quy tắc là “I trước E, quanh đó sau C.” mà lại trên thực tế, có nhiều trường vừa lòng ngoại lệ đối với quy tắc này rộng là bao gồm trường thích hợp tuân theo nó.

Theo một bí quyết tương tự, khi nói tới stdin, stdout, với stderr thật thuận tiện khi giới thiệu tiên đề được chấp nhận mà một quá trình không biết tương tự như không lưu ý đến nơi mà cha luồng tiêu chuẩn của nó được kết thúc. Một quá trình có nên suy nghĩ việc liệu cổng output của nó đã đến thiết bị đầu cuối giỏi được chuyển sang làn đường khác thành một tệp không? Nó thậm chí hoàn toàn có thể biết liệu đầu vào của nó tới từ bàn phím hay đang rất được đưa vào nó tự một quy trình khác?

Trên thực tế, một các bước biết — hoặc tối thiểu là nó rất có thể tìm ra, ví như nó chọn kiểm tra — với nó tất cả thể biến đổi hành vi của bản thân mình cho tương xứng nếu tác giả ứng dụng quyết định thêm tính năng đó.

Chúng ta rất có thể thấy sự chuyển đổi hành vi này rất đơn giản dàng. Hãy thử nhì lệnh sau:

ls

ls | cat

Các ls lệnh vận động khác nếu cổng đầu ra của nó (stdout) đang được đưa vào một trong những lệnh khác. Nó là ls đưa sang một cổng output cột duy nhất, nó không phải là đổi khác được thực hiện bởi cat. Với ls thực hiện điều tương tự nếu đầu ra output của nó đang rất được chuyển hướng:

ls > capture.txt

cat capture.txt

Chuyển phía stdout và stderr

Có một điểm mạnh khi có thông báo lỗi được gửi vì một luồng siêng dụng. Nó tất cả nghĩa là bạn cũng có thể chuyển hướng đầu ra của lệnh (stdout) vào một trong những tệp với vẫn thấy ngẫu nhiên thông báo lỗi làm sao (stderr) trong cửa sổ đầu cuối. Bạn có thể phản ứng với những lỗi nếu như bạn cần, khi chúng xảy ra. Nó cũng chống các thông tin lỗi có tác dụng nhiễm dơ tệp stdout đang được chuyển làn phân cách vào.

Nhập văn bản sau vào một trong những trình biên soạn thảo và lưu nó vào một tệp mang tên là error.sh.

#!/bin/bashecho "About to lớn try to lớn access a file that doesn"t exist"cat bad-filename.txtLàm đến tập lệnh hoàn toàn có thể thực thi được bởi lệnh này:

chmod +x error.shDòng thứ nhất của tập lệnh tái diễn văn phiên bản tới hành lang cửa số đầu cuối, thông qua stdout suối. Chiếc thứ hai cố gắng truy cập một tệp không tồn tại. Điều này sẽ tạo ra một thông báo lỗi được gửi qua stderr.

Chạy tập lệnh bằng lệnh này:

./error.sh

*

Chúng ta rất có thể thấy rằng cả nhì luồng đầu ra, stdout với stderr, đã làm được hiển thị trong những cửa sổ đầu cuối.

*

Hãy thử gửi hướng áp sạc ra đến một tệp:

./error.sh > capture.txt

*

Thông báo lỗi được gửi vào stderr vẫn được gửi đến cửa sổ đầu cuối. Công ty chúng tôi có thể soát sổ nội dung của tệp giúp thấy liệu stdout đầu ra output được chuyển đến tệp.

cat capture.txt

Đầu ra trường đoản cú stdin đã có chuyển tìm hiểu tệp như ý muốn đợi.

*

Các > biểu tượng chuyển hướng chuyển động với stdout theo khoác định. Bạn có thể sử dụng một trong các bộ biểu đạt tệp số để cho biết luồng đầu ra chuẩn nào bạn có nhu cầu chuyển hướng.

Để đưa hướng rõ ràng stdout, thực hiện hướng dẫn chuyển hướng này:

1>Để chuyển hướng rõ ràng stderr, áp dụng hướng dẫn chuyển làn đường này:

2>Hãy thử đánh giá lại cùng lần này họ sẽ sử dụng 2>:

./error.sh 2> capture.txt

Thông báo lỗi được chuyển qua làn đường khác và stdout echo lời nhắn được giữ hộ đến hành lang cửa số đầu cuối:

Hãy xem phần nhiều gì có trong tệp capture.txt.

cat capture.txt

Các stderr tin nhắn sinh hoạt dạng capture.txt như ước ao đợi.

Chuyển hướng Cả stdout và stderr

Chắc chắn, nếu bạn cũng có thể chuyển hướng stdout hoặc là stderr đến một tệp độc lập với nhau, bọn họ phải rất có thể chuyển phía cả hai cùng một lúc, đến hai tệp không giống nhau?

Có, cửa hàng chúng tôi có thể. Lệnh này đang hướng stdout vào trong 1 tệp có tên là capture.txt và stderr vào một tệp mang tên là error.txt.

./error.sh 1> capture.txt 2> error.txt

Bởi vì cả nhị luồng áp ra output – cổng đầu ra tiêu chuẩn và lỗi tiêu chuẩn chỉnh – phần nhiều được chuyển đào bới tệp, không có đầu ra hiển thị trong hành lang cửa số đầu cuối. Cửa hàng chúng tôi được trở lại dấu nhắc cái lệnh như thể không có gì xảy ra.

Hãy khám nghiệm nội dung của từng tệp:

cat capture.txtcat error.txt

Chuyển hướng stdout với stderr mang đến cùng một tệp

Thật gọn gàng gàng, chúng tôi có từng luồng áp ra output tiêu chuẩn chỉnh đi cho tệp chuyên dụng của riêng nó. Sự phối kết hợp duy nhất khác mà cửa hàng chúng tôi có thể làm cho là giữ hộ cả hai stdout với stderr vào và một tệp.

Chúng ta hoàn toàn có thể đạt được vấn đề đó bằng lệnh sau:

./error.sh > capture.txt 2>&1Hãy phá đổ vỡ điều đó.

./error.sh: Khởi chạy tệp kịch bạn dạng error.sh.> capture.txt: chuyển làn phân cách stdout truyền tới tệp capture.txt. > là viết tắt của 1>.2> & 1: Điều này áp dụng lệnh &> đưa hướng. Lí giải này được cho phép bạn chỉ thị cho trình bao để gia công cho một luồng mang lại cùng đích với một luồng khác. Vào trường thích hợp này, cửa hàng chúng tôi đang nói “chuyển hướng luồng 2, stderr, mang đến cùng đích cơ mà luồng 1, stdout, đang được chuyển hướng đến. ”

Không có áp ra output hiển thị. Điều kia thật xứng đáng khích lệ.

Xem thêm: Bật Mí 6 Cách Bảo Quản Gạo Được Lâu Không Bị Mốc Hay Mối Mọt

Hãy đánh giá tệp capture.txt với xem có gì vào đó.

cat capture.txt

Cả hai stdout cùng stderr luồng đã được chuyển tìm hiểu một tệp đích duy nhất.

Để áp sạc ra của luồng được chuyển qua làn đường khác và bị loại bỏ một bí quyết âm thầm, hãy hướng cổng đầu ra tới /dev/null.

Phát hiện chuyển làn trong tập lệnh

Chúng ta đã thảo luận về biện pháp một lệnh hoàn toàn có thể phát hiện xem có ngẫu nhiên luồng nào đang rất được chuyển hướng hay không và có thể chọn biến đổi hành vi của nó mang lại phù hợp. Chúng ta có thể thực hiện điều này trong số tập lệnh của riêng mình không? Có, công ty chúng tôi có thể. Với nó là một trong những kỹ thuật dễ dàng nắm bắt và sử dụng.

Nhập văn bạn dạng sau vào trong 1 trình soạn thảo cùng lưu nó dưới dạng input.sh.

#!/bin/bashif < -t 0 >; then echo stdin coming from keyboard else echo stdin coming from a pipe or a file fiSử dụng lệnh sau để làm cho nó hoàn toàn có thể thực thi được:

chmod +x input.shPhần hợp lý là bài kiểm tra trong ngoặc vuông. Những -t (terminal) tùy chọn trả về true (0) nếu tệp được liên kết với bộ miêu tả tệp xong xuôi trong cửa sổ đầu cuối. Chúng tôi đã sử dụng bộ biểu đạt tệp 0 làm đối số mang đến kiểm tra, đại diện cho stdin.

Nếu stdin được kết nối với một hành lang cửa số đầu cuối, phân tích sẽ chứng minh là đúng. Nếu stdin được liên kết với một tệp hoặc một con đường ống, quá trình kiểm tra sẽ không thành công.

Chúng tôi rất có thể sử dụng ngẫu nhiên tệp văn bạn dạng thuận tiện thể nào nhằm tạo nguồn vào cho tập lệnh. Ở đây shop chúng tôi đang sử dụng một tệp có tên là dummy.txt.

./input.sh

Kết trái đầu ra cho thấy rằng tập lệnh nhận biết rằng đầu vào không tới từ bàn phím, nó tới từ một tệp. Nếu như bạn đã chọn, bạn cũng có thể thay thay đổi hành vi của tập lệnh của bản thân mình cho phù hợp.

Đó là với chuyển qua làn đường khác tệp, hãy thử nó với một đường ống.

cat dummy.txt | ./input.sh

Tập lệnh nhận thấy rằng nguồn vào của nó đang được đưa vào nó. Hay đúng đắn hơn, nó nhận thấy một đợt tiếp nhữa rằng stdin luồng ko được liên kết với hành lang cửa số đầu cuối.

Hãy chạy tập lệnh mà không có đường dẫn hoặc đưa hướng.

./input.sh

Các stdin luồng được kết nối với cửa sổ đầu cuối và tập lệnh report điều này tương ứng.

Để chất vấn điều tựa như với luồng đầu ra, chúng ta cần một tập lệnh mới. Nhập câu chữ sau vào một trong những trình biên soạn thảo cùng lưu nó dưới dạng output.sh.

#!/bin/bashif < -t 1 >; thenecho stdout is going to the terminal window elseecho stdout is being redirected or piped fiSử dụng lệnh sau để triển khai cho nó hoàn toàn có thể thực thi được:

chmod +x input.shThay đổi đáng kể duy nhất đối với tập lệnh này là trong bài kiểm tra trong vết ngoặc vuông. Công ty chúng tôi đang thực hiện chữ hàng đầu để thay mặt cho trình diễn đạt tệp cho stdout.

Hãy thử nó ra. Cửa hàng chúng tôi sẽ chuyển đầu ra thông qua cat.

./output | cat

Tập lệnh phân biệt rằng cổng đầu ra của nó không trực tiếp đến cửa sổ đầu cuối.

Chúng tôi cũng có thể kiểm tra tập lệnh bằng cách chuyển hướng cổng đầu ra thành một tệp.

./output.sh > capture.txt

Không có cổng output cho cửa sổ đầu cuối, công ty chúng tôi được đưa trở lại dấu kể lệnh một biện pháp âm thầm. Như shop chúng tôi mong đợi.

Chúng ta hoàn toàn có thể xem bên trong tệp capture.txt để xem đều gì đã có chụp. áp dụng lệnh sau để làm như vậy.

cat capture.sh

Một lần nữa, kiểm tra dễ dàng trong tập lệnh của shop chúng tôi phát hiển thị rằng stdout luồng không được giữ hộ trực kế tiếp cửa sổ đầu cuối.

Nếu công ty chúng tôi chạy tập lệnh nhưng không có bất kỳ đường dẫn hoặc chuyển làn phân cách nào, nó sẽ thấy ra rằng stdout đang được chuyển trực sau đó cửa sổ đầu cuối.

./output.sh

Và đó đúng là những gì chúng ta thấy.

Dòng ý thức

Biết giải pháp biết các tập lệnh của khách hàng có được liên kết với cửa sổ đầu cuối hay con đường ống dẫn hoặc đang được chuyển hướng hay không, có thể chấp nhận được bạn điều chỉnh hành vi của chúng mang đến phù hợp.

Xem thêm: Of Which / On Which Là Gì ? Cụm Từ Tạo Thành Với Which For Which Là Gì

Kết trái ghi nhật cam kết và chẩn đoán gồm thể chi tiết hơn hoặc không nhiều hơn, tùy nằm trong vào bài toán nó lộ diện trên màn hình hay 1 tệp tin. Thông tin lỗi hoàn toàn có thể được ghi vào một trong những tệp khác với áp sạc ra chương trình bình thường.