apa yang dimaksud dengan menghubungkan STDOUT dan STDIN?

10

Saya membaca buku, katanya:

Setiap proses memiliki setidaknya tiga saluran komunikasi yang tersedia: “input standar” (STDIN), “output standar” (STDOUT), dan “standard error” (STDERR).

Sebagian besar perintah menerima input dari STDIN dan menulis outputnya ke STDOUT. Mereka menulis pesan kesalahan ke STDERR. Konvensi ini memungkinkan Anda merangkai perintah bersama seperti balok penyusun untuk membuat jaringan pipa komposit.

Shell mengartikan simbol-simbol <,, >dan >>sebagai instruksi untuk mengubah rute input atau output perintah ke atau dari file.

Untuk menghubungkan STDOUT dari satu perintah ke STDIN yang lain, gunakan | simbol, umumnya dikenal sebagai pipa.

ps -ef | grep httpd

Jadi pada dasarnya apa yang dikatakan adalah input standar adalah perintah yang memungkinkan pengguna untuk menulis ke file, sedangkan output standar adalah perintah yang memiliki bash shell untuk menulis output ke shell, dan kesalahan standar sama seperti output tetapi hanya dipanggil ketika ada kesalahan dalam sistem file. Kemudian kita sampai pada bagian menghubungkan STDOUT dan STDIN dan saya tersesat.

JohnMerlino
sumber

Jawaban:

25

Input standar dan output standar bukan perintah.

Bayangkan perintah sebagai mesin di pabrik dengan jalur perakitan. Sebagian besar mesin dirancang untuk memiliki satu sabuk konveyor untuk memasukkan data dan satu sabuk konveyor untuk memasukkan data; mereka adalah input standar dan output standar masing-masing. Kesalahan standar adalah bukaan di sisi mesin di mana ia dapat mengeluarkan tolak.

+-------+     +------------------+       +------------------+     +------+
| input |     |    machine A     |       |    machine B     |     |output|
| reser ­­­|=====|<stdin     stdout>|=======|<stdin     stdout>|=====|bucket|
| voir |    |      stderr      |      |      stderr      |    |      |
+-------+     +------------------+       +------------------+     +------+
                      ||                          ||

Diagram di atas menunjukkan ban berjalan yang melewati dua mesin. Data berasal dari reservoir input di sebelah kiri, diumpankan ke mesin A, kemudian output disampaikan lebih lanjut ke mesin B (untuk itu input), dan output mesin B disimpan di ember output di sebelah kanan.

Dalam istilah unix, ini disebut pipeline . Metafornya adalah pipa ledeng: pipa menghubungkan mesin A ke mesin B. Sintaksis shell untuk pipa di atas adalah

<input-file.txt commandA | commandB >output-file.txt

The < redirection simbol memberitahu shell untuk menghubungkan commandA's standar input ke file input-file.txtsebelum meluncurkan commandA. (Anda dapat menempatkan pengalihan sebelum atau setelah nama perintah.) >Simbol pengalihan memberitahu shell untuk menghubungkan commandBoutput standar ke output-file.txt. |Simbol pipa (" ") di bagian tengah memberitahu shell untuk menghubungkan commandAoutput standar ke commandBinput standar sebelum meluncurkannya.

Perintah dapat memiliki lebih dari satu input dan lebih dari satu output, tapi itu materi untuk hari lain .

Gilles 'SANGAT berhenti menjadi jahat'
sumber
3
Visual banyak membantu
JohnMerlino
Analogi yang bagus. Saya telah memahami konsep pipa aliran selama bertahun-tahun sekarang, tetapi entah bagaimana tidak ada yang pernah menggunakan analogi pabrik / konveyor, yang membuatnya sangat mudah (dan ringkas) dimengerti. Terima kasih!
Owen Blacker
1
Analogi yang bagus. Akan meminjam yang ini jika Anda tidak keberatan.
Tivie
Gilles, saya telah mengajukan pertanyaan tentang ungkapan Anda di bagian bawah: unix.stackexchange.com/q/96724/29146 . bisakah kamu mengklarifikasi?
strugee
@Gilles - Dapatkah Anda menyertakan contoh yang mengilustrasikan opsi untuk menentukan pengalihan sebelum atau setelah perintah? Sebagai contoh, dapatkah pipa dibaca sebagai input-file.txt> commandA atau input-file.txt <commandA?
Termotivasi
6

standard input is a command that allows user to write to a file

Bukan perintah, tapi aliran. Standar masuk dan keluar seperti kotak surat. Ketika sebuah program dimulai, itu diberikan kotak untuk menerima dan kotak untuk mengirim email. Biasanya, input berasal dari keyboard dan dimasukkan ke dalam kotak, surat yang dimasukkan ke dalam kotak keluar di layar terminal Anda.

standard output is a command that has the bash shell write output to the shell

Program tidak benar-benar tahu di mana poin standar keluar. Saat Anda mem-pipe A ke B (seperti di $ A | B), ketika A memasukkan mail ke kotak keluar, itu berakhir di kotak B's. B memproses input dan meletakkan suratnya sendiri di kotak keluar, yang adalah apa yang Anda lihat di terminal.

Untuk menjatuhkan metafora, seperti yang disebutkan, standar masuk / keluar adalah aliran. Kotak surat, atau deskriptor file , adalah salah satu ujung aliran. Untuk pipa adalah menghubungkan standar keluar dari A ke standar dalam B.

Serpihan Kekacauan
sumber