Apakah stdin, stdout, dan stderr di Linux?

Tetingkap terminal pada komputer Linux

Fatmawati Achmad Zaenuri/Shutterstock.com



|_+_|, |__+_| dan |__+_| ialah tiga aliran data yang dicipta apabila anda melancarkan arahan Linux. Anda boleh menggunakannya untuk mengetahui sama ada skrip anda sedang disalurkan atau diubah hala. Kami tunjukkan caranya.

Strim Sertai Dua Mata

Sebaik sahaja anda mula belajar tentang sistem pengendalian seperti Linux dan Unix, anda akan menemui istilah |_+_|, |_+_| dan |__+_|. Ini adalah tiga aliran standard yang ditubuhkan apabila arahan Linux dilaksanakan. Dalam pengkomputeran, aliran adalah sesuatu yang boleh memindahkan data. Dalam kes aliran ini, data itu ialah teks.





Aliran data, seperti aliran air, mempunyai dua hujung. Mereka mempunyai sumber dan aliran keluar. Mana-mana arahan Linux yang anda gunakan menyediakan satu hujung setiap strim. Hujung lain ditentukan oleh shell yang melancarkan arahan. Hujung itu akan disambungkan ke tetingkap terminal, disambungkan ke paip, atau diubah hala ke fail atau arahan lain, mengikut baris arahan yang melancarkan arahan itu.

Aliran Standard Linux

Dalam Linux, |__+_| ialah aliran input standard. Ini menerima teks sebagai inputnya. Output teks daripada arahan ke shell dihantar melalui |__+_| (standard keluar) aliran. Mesej ralat daripada arahan dihantar melalui |__+_| (ralat piawai) aliran.



Jadi anda boleh melihat bahawa terdapat dua aliran keluaran, |__+_| dan |_+_|, dan satu aliran input, |__+_|. Oleh kerana mesej ralat dan output biasa masing-masing mempunyai saluran sendiri untuk membawanya ke tetingkap terminal, ia boleh dikendalikan secara bebas antara satu sama lain.

Strim Dikendalikan Seperti Fail

Strim dalam Linux—seperti hampir semua yang lain—diperlakukan seolah-olah ia adalah fail. Anda boleh membaca teks daripada fail, dan anda boleh menulis teks ke dalam fail. Kedua-dua tindakan ini melibatkan aliran data. Oleh itu, konsep pengendalian aliran data sebagai fail bukanlah sesuatu yang sukar.

Iklan

Setiap fail yang dikaitkan dengan proses diperuntukkan nombor unik untuk mengenal pastinya. Ini dikenali sebagai deskriptor fail. Setiap kali tindakan perlu dilakukan pada fail, deskriptor fail digunakan untuk mengenal pasti fail.



Nilai ini sentiasa digunakan untuk |_+_|, |__+_| dan |_+_|:

  • 0 : stdin
  • satu : stdout
  • dua : stderr

Bertindak balas kepada Paip dan Lencongan

Untuk memudahkan pengenalan seseorang kepada subjek, teknik biasa ialah mengajar versi topik yang dipermudahkan. Sebagai contoh, dengan tatabahasa, kita diberitahu bahawa peraturannya adalah I sebelum E, kecuali selepas C. Tetapi sebenarnya, ada lebih banyak pengecualian kepada peraturan ini daripada ada kes yang mematuhinya.

Dalam nada yang sama, apabila bercakap tentang |_+_|, |_+_|, dan |_+_| adalah mudah untuk mengeluarkan aksiom yang diterima bahawa proses tidak mengetahui dan tidak peduli di mana tiga aliran standardnya ditamatkan. Sekiranya proses mengambil berat sama ada outputnya pergi ke terminal atau dialihkan ke dalam fail? Bolehkah ia memberitahu sama ada inputnya datang dari papan kekunci atau sedang disalurkan ke dalamnya daripada proses lain?

Sebenarnya, sesuatu proses memang tahu—atau sekurang-kurangnya ia boleh mengetahui, sekiranya ia memilih untuk menyemak—dan ia boleh mengubah tingkah lakunya dengan sewajarnya jika pengarang perisian memutuskan untuk menambah fungsi tersebut.

Iklan

Kita boleh melihat perubahan tingkah laku ini dengan mudah. Cuba dua arahan ini:

stdin

stdout

|_+_| arahan berkelakuan berbeza jika outputnya (|_+_|) disalurkan ke arahan lain. Ia ialah |_+_| yang bertukar kepada output lajur tunggal, ia bukan penukaran yang dilakukan oleh |_+_|. Dan |_+_| melakukan perkara yang sama jika outputnya dialihkan:

stderr

stdin

Mengubah hala stdout dan stderr

Terdapat kelebihan untuk mempunyai mesej ralat yang dihantar oleh strim khusus. Ini bermakna kita boleh mengubah hala keluaran perintah (|__+_|) ke fail dan masih melihat sebarang mesej ralat (|_+_|) dalam tetingkap terminal. Anda boleh bertindak balas terhadap ralat jika perlu, apabila ia berlaku. Ia juga menghentikan mesej ralat daripada mencemarkan fail yang |_+_| telah diubah hala ke.

Taip teks berikut ke dalam editor dan simpan ke fail yang dipanggil error.sh.

stdout

Jadikan skrip boleh laku dengan arahan ini:

stederr

Baris pertama skrip menggemakan teks ke tetingkap terminal, melalui |_+_| aliran. Baris kedua cuba mengakses fail yang tidak wujud. Ini akan menjana mesej ralat yang dihantar melalui |__+_|.

Jalankan skrip dengan arahan ini:

stdin

Kita dapat melihat bahawa kedua-dua aliran output, |__+_| dan |_+_|, telah dipaparkan dalam tetingkap terminal.

Mari cuba ubah hala output ke fail:

stdout

Iklan

Mesej ralat yang dihantar melalui |_+_| masih dihantar ke tetingkap terminal. Kita boleh menyemak kandungan fail untuk melihat sama ada |__+_| output pergi ke fail.

stderr

Output daripada |__+_| telah diubah hala ke fail seperti yang dijangkakan.

|_+_| simbol ubah hala berfungsi dengan |__+_| secara lalai. Anda boleh menggunakan salah satu deskriptor fail berangka untuk menunjukkan aliran keluaran standard yang anda ingin ubah hala.

Untuk mengubah hala secara eksplisit |_+_|, gunakan arahan ubah hala ini:

stdout

Untuk mengubah hala secara eksplisit |_+_|, gunakan arahan ubah hala ini:

stderr

Mari cuba ujian kami sekali lagi, dan kali ini kami akan menggunakan |_+_|:

stdin

Mesej ralat diubah hala dan |_+_| |_+_| mesej dihantar ke tetingkap terminal:

Mari lihat apa yang ada dalam fail capture.txt.

stdin

|_+_| mesej dalam capture.txt seperti yang dijangkakan.

Mengubah hala Kedua-dua stdout dan stderr

Sudah tentu, jika kita boleh mengubah hala sama ada |_+_| atau |_+_| kepada fail secara berasingan antara satu sama lain, kita sepatutnya boleh mengubah hala kedua-duanya pada masa yang sama, ke dua fail berbeza?

Iklan

Ya kita boleh. Perintah ini akan mengarahkan |__+_| ke fail yang dipanggil capture.txt dan |_+_| kepada fail yang dipanggil error.txt.

stdout,

Oleh kerana kedua-dua aliran output–output standard dan ralat standard—dihalakan semula ke fail, tiada output yang kelihatan dalam tetingkap terminal. Kami dikembalikan kepada arahan baris arahan seolah-olah tiada apa yang berlaku.

Mari semak kandungan setiap fail:

stderr stdin

Mengubah hala stdout dan stderr ke Fail yang Sama

Itu kemas, kami mempunyai setiap aliran keluaran standard ke fail khususnya sendiri. Satu-satunya kombinasi lain yang boleh kami lakukan ialah menghantar kedua-duanya |__+_| dan |_+_| ke fail yang sama.

Kita boleh mencapai ini dengan arahan berikut:

stdout

Mari kita pecahkan itu.

  • ./error.sh : Melancarkan fail skrip error.sh.
  • > capture.txt : Mengubah hala |__+_| strim ke fail capture.txt. |_+_| ialah singkatan untuk |__+_|.
  • 2> & 1 : Ini menggunakan arahan ubah hala &>. Arahan ini membolehkan anda memberitahu shell untuk membuat satu aliran sampai ke destinasi yang sama dengan aliran lain. Dalam kes ini, kami mengatakan ubah hala strim 2, |_+_|, ke destinasi yang sama dengan aliran 1, |_+_|, sedang diubah hala ke.

Tiada keluaran yang kelihatan. Itu menggalakkan.

Mari semak fail capture.txt dan lihat kandungannya.

stderr

Kedua-dua |_+_| dan |_+_| strim telah diubah hala ke satu fail destinasi.

Untuk membolehkan output strim diubah hala dan dibuang secara senyap, halakan output ke |_+_|.

Mengesan Pengalihan Semula Dalam Skrip

Kami membincangkan cara arahan boleh mengesan jika mana-mana aliran sedang diubah hala dan boleh memilih untuk mengubah tingkah lakunya dengan sewajarnya. Bolehkah kita mencapai ini dalam skrip kita sendiri? Ya kita boleh. Dan ia adalah teknik yang sangat mudah untuk difahami dan digunakan.

Iklan

Taip teks berikut ke dalam editor dan simpan sebagai input.sh.

ls

Gunakan arahan berikut untuk menjadikannya boleh laku:

stdout

Bahagian yang bijak ialah ujian dalam kurungan segi empat sama . |_+_| (terminal) pilihan mengembalikan benar (0) jika fail dikaitkan dengan deskriptor fail tamat dalam tetingkap terminal . Kami telah menggunakan deskriptor fail 0 sebagai hujah untuk ujian, yang mewakili |_+_|.

Jika |_+_| disambungkan ke tetingkap terminal ujian akan terbukti benar. Jika |_+_| disambungkan ke fail atau paip, ujian akan gagal.

Kami boleh menggunakan mana-mana fail teks yang mudah untuk menjana input kepada skrip. Di sini kami menggunakan satu yang dipanggil dummy.txt.

ls

Output menunjukkan bahawa skrip mengiktiraf bahawa input tidak datang daripada papan kekunci, ia datang daripada fail. Jika anda memilihnya, anda boleh mengubah tingkah laku skrip anda dengan sewajarnya.

Iklan

Itu adalah dengan ubah hala fail, mari cuba dengan paip.

cat

Skrip menyedari bahawa inputnya sedang disalurkan ke dalamnya. Atau lebih tepat lagi, ia mengiktiraf sekali lagi bahawa |_+_| strim tidak disambungkan ke tetingkap terminal.

Mari jalankan skrip tanpa paip mahupun ubah hala.

ls

|_+_| strim disambungkan ke tetingkap terminal, dan skrip melaporkannya dengan sewajarnya.

Untuk menyemak perkara yang sama dengan aliran keluaran, kami memerlukan skrip baharu. Taip yang berikut ke dalam editor dan simpan sebagai output.sh.

stdout

Gunakan arahan berikut untuk menjadikannya boleh laku:

stderr

Satu-satunya perubahan ketara pada skrip ini adalah dalam ujian dalam kurungan segi empat sama. Kami menggunakan digit 1 untuk mewakili deskriptor fail untuk |_+_|.

Jom cuba. Kami akan menyalurkan output melalui |__+_|.

stdout

Iklan

Skrip mengakui bahawa outputnya tidak akan terus ke tetingkap terminal.

Kami juga boleh menguji skrip dengan mengalihkan output ke fail.

stdout

Tiada output ke tetingkap terminal, kami dikembalikan secara senyap ke prompt arahan. Seperti yang kita jangkakan.

Kita boleh melihat ke dalam fail capture.txt untuk melihat apa yang telah ditangkap. Gunakan arahan berikut untuk melakukannya.

stderr

Sekali lagi, ujian mudah dalam skrip kami mengesan bahawa |__+_| strim tidak dihantar terus ke tetingkap terminal.

Iklan

Jika kami menjalankan skrip tanpa sebarang paip atau ubah hala, ia harus mengesan bahawa |_+_| sedang dihantar terus ke tetingkap terminal.

stdout

Dan itulah yang kita lihat.

Aliran Kesedaran

Mengetahui cara untuk mengetahui sama ada skrip anda disambungkan ke tetingkap terminal, atau paip, atau sedang diubah hala, membolehkan anda melaraskan kelakuannya dengan sewajarnya.

Pengelogan dan output diagnostik boleh menjadi lebih atau kurang terperinci, bergantung pada sama ada ia pergi ke skrin atau ke fail. Mesej ralat boleh dilog ke fail yang berbeza daripada output program biasa.

Seperti biasa, lebih banyak pengetahuan membawa lebih banyak pilihan.

Perintah Linux
Fail tar · pv · kucing · tac · chmod · cengkaman · perbezaan · sed · Dengan · lelaki · pushd · popd · fsck · testdisk · seq · fd · pandoc · CD · $PATH · awk · sertai · jq · lipat · uniq · journalctl · ekor · negeri · ls · fstab · dibuang · kurang · chgrp · chown · rev · tengok · rentetan · taip · menamakan semula · zip · buka zip · lekapkan · umount · pasang · fdisk · mkfs · rm · rmdir · rsync · df · gpg · kita · nano · mkdir · daripada · ln · tampalan · menukar · rclone · carik-carik · SRM
Proses alias · skrin · atas · bagus · renice · kemajuan · jejak · sistem · tmux · chsh · sejarah · di · kumpulan · percuma · yang · dmesg · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · masa tamat · dinding · ya · bunuh · tidur · sudo · miliknya · masa · tambah kumpulan · usermod · kumpulan · lshw · menutup · but semula · berhenti · matikan · passwd · lscpu · crontab · Tarikh · bg · fg
Rangkaian netstat · ping · traceroute · ip · ss · siapakah · fail2ban · bmon · awak · jari · nmap · ftp · keriting · wget · who · siapakah saya · Dalam · iptables · ssh-keygen · ufw

BERKAITAN: Komputer Riba Linux Terbaik untuk Pembangun dan Penggemar

BACA SETERUSNYA Foto Profil untuk Dave McKay Dave McKay
Dave McKay pertama kali menggunakan komputer apabila pita kertas yang ditebuk sedang popular, dan dia telah memprogramkan sejak itu. Selepas lebih 30 tahun dalam industri IT, beliau kini seorang wartawan teknologi sepenuh masa. Semasa kerjayanya, beliau telah bekerja sebagai pengaturcara bebas, pengurus pasukan pembangunan perisian antarabangsa, pengurus projek perkhidmatan IT, dan, yang terbaru, sebagai Pegawai Perlindungan Data. Tulisannya telah diterbitkan oleh howtogeek.com, cloudsavvyit.com, itenterpriser.com, dan opensource.com. Dave ialah seorang penginjil Linux dan penyokong sumber terbuka.
Baca Bio Penuh

Artikel Yang Menarik