Apa itu stdin, stdout, dan stderr di Linux?

stdin,, stdoutdan stderradalah tiga aliran data yang dibuat saat Anda meluncurkan perintah Linux. Anda dapat menggunakannya untuk mengetahui apakah skrip Anda sedang disalurkan atau dialihkan. Kami tunjukkan caranya.

Aliran Bergabung dengan Dua Poin

Segera setelah Anda mulai belajar tentang Linux dan Unix-seperti sistem operasi, Anda akan menemukan istilah stdin, stdoutdan stederr. Ini adalah tiga aliran standar yang dibuat saat perintah Linux dijalankan. Dalam komputasi, aliran adalah sesuatu yang dapat mentransfer data. Dalam kasus aliran ini, data tersebut adalah teks.

Aliran data, seperti aliran air, memiliki dua ujung. Mereka memiliki sumber dan arus keluar. Perintah Linux mana pun yang Anda gunakan menyediakan satu ujung dari setiap aliran. Ujung lainnya ditentukan oleh shell yang meluncurkan perintah. Ujung itu akan terhubung ke jendela terminal, terhubung ke pipa, atau diarahkan ke file atau perintah lain, sesuai dengan baris perintah yang meluncurkan perintah.

Aliran Standar Linux

Di Linux,  stdinadalah aliran input standar. Ini menerima teks sebagai masukannya. Keluaran teks dari perintah ke shell dikirimkan melalui aliran stdout(keluar standar). Pesan kesalahan dari perintah dikirim melalui aliran stderr(kesalahan standar).

Jadi Anda dapat melihat bahwa ada dua aliran keluaran, stdoutdan stderr, dan satu aliran masukan stdin,. Karena pesan kesalahan dan keluaran normal masing-masing memiliki salurannya sendiri untuk membawanya ke jendela terminal, pesan kesalahan tersebut dapat ditangani secara independen satu sama lain.

Aliran Ditangani Seperti File

Stream di Linux — seperti hampir semua hal lainnya — diperlakukan seolah-olah itu adalah file. Anda dapat membaca teks dari file, dan Anda dapat menulis teks ke dalam file. Kedua tindakan ini melibatkan aliran data. Jadi konsep menangani aliran data sebagai file tidak terlalu sulit.

Setiap file yang terkait dengan suatu proses dialokasikan nomor unik untuk mengidentifikasinya. Ini dikenal sebagai deskriptor file. Kapan pun tindakan diperlukan untuk dilakukan pada file, deskriptor file digunakan untuk mengidentifikasi file.

Nilai-nilai ini selalu digunakan untuk stdin, stdout,dan stderr:

  • 0 : stdin
  • 1 : stdout
  • 2 : stderr

Bereaksi terhadap Pipa dan Pengalihan

Untuk memudahkan pengenalan seseorang pada suatu subjek, teknik yang umum adalah dengan mengajarkan versi topik yang disederhanakan. Misalnya, dengan tata bahasa, kita diberitahu bahwa aturannya adalah "I before E, kecuali after C." Namun sebenarnya, ada lebih banyak pengecualian untuk aturan ini daripada kasus yang mematuhinya.

Dalam nada yang sama, ketika berbicara tentang stdin,, stdoutdan stderr lebih mudah untuk menghilangkan aksioma yang diterima bahwa suatu proses tidak tahu atau peduli di mana tiga aliran standarnya diakhiri. Haruskah suatu proses peduli apakah outputnya menuju ke terminal atau dialihkan ke dalam file? Dapatkah ia mengetahui apakah inputnya berasal dari keyboard atau sedang disalurkan ke dalamnya dari proses lain?

Sebenarnya, suatu proses mengetahui — atau setidaknya dapat mengetahuinya, jika memilih untuk diperiksa — dan dapat mengubah perilakunya sesuai jika pembuat perangkat lunak memutuskan untuk menambahkan fungsionalitas itu.

Kita bisa melihat perubahan perilaku ini dengan sangat mudah. Coba dua perintah ini:

ls

ls | kucing

The lsberperilaku perintah berbeda jika output ( stdout) sedang disalurkan ke perintah lain. Ini adalah  lsyang beralih ke output kolom tunggal, itu bukan konversi yang dilakukan oleh cat. Dan lsmelakukan hal yang sama jika outputnya dialihkan:

ls> capture.txt

kucing capture.txt

Mengalihkan stdout dan stderr

Ada keuntungan memiliki pesan kesalahan yang dikirimkan oleh aliran khusus. Ini berarti kita dapat mengarahkan output perintah ( stdout) ke file dan masih melihat pesan kesalahan ( stderr) di jendela terminal. Anda dapat bereaksi terhadap kesalahan jika perlu, saat terjadi. Ini juga menghentikan pesan kesalahan mengkontaminasi file yang stdouttelah dialihkan ke.

Ketik teks berikut ke dalam editor dan simpan ke file bernama error.sh.

#! / bin / bash echo "Tentang mencoba mengakses file yang tidak ada" cat bad-filename.txt

Jadikan skrip dapat dieksekusi dengan perintah ini:

chmod + x error.sh

Baris pertama dari skrip menggemakan teks ke jendela terminal, melalui  stdoutaliran. Baris kedua mencoba mengakses file yang tidak ada. Ini akan menghasilkan pesan kesalahan yang dikirimkan melalui stderr.

Jalankan skrip dengan perintah ini:

./error.sh

Kita dapat melihat bahwa kedua aliran output, stdoutdan stderr, telah ditampilkan di jendela terminal.

Mari kita coba untuk mengarahkan output ke file:

./error.sh> capture.txt

Pesan kesalahan yang dikirim melalui stderrmasih dikirim ke jendela terminal. Kami dapat memeriksa konten file untuk melihat apakah stdout outputnya masuk ke file.

kucing capture.txt

Keluaran dari stdindialihkan ke file seperti yang diharapkan.

The >simbol redirection bekerja dengan stdoutsecara default. Anda dapat menggunakan salah satu deskriptor file numerik untuk menunjukkan aliran keluaran standar mana yang ingin Anda alihkan.

Untuk mengalihkan secara eksplisit  stdout, gunakan instruksi pengalihan ini:

1>

Untuk mengalihkan secara eksplisit  stderr, gunakan instruksi pengalihan ini:

2>

Mari kita coba uji lagi, dan kali ini kita akan menggunakan 2>:

./error.sh 2> capture.txt

Pesan kesalahan diarahkan ulang dan stdoutechopesan dikirim ke jendela terminal:

Mari kita lihat apa yang ada di file capture.txt.

kucing capture.txt

The stderrpesan di capture.txt seperti yang diharapkan.

Mengalihkan stdout dan stderr

Tentunya, jika kita dapat mengarahkan salah satu stdoutatau stderrke file secara terpisah satu sama lain, kita harus dapat mengarahkan keduanya pada saat yang sama, ke dua file yang berbeda?

Ya kita bisa. Perintah ini akan mengarahkan stdoutke file bernama capture.txt dan stderrke file bernama error.txt.

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

Karena kedua aliran keluaran - keluaran standar dan kesalahan standar - diarahkan ke file, tidak ada keluaran yang terlihat di jendela terminal. Kami kembali ke prompt baris perintah seolah-olah tidak ada yang terjadi.

Mari kita periksa konten setiap file:

kucing capture.txt
kucing error.txt

Mengalihkan stdout dan stderr ke File yang Sama

Itu rapi, kami memiliki setiap aliran keluaran standar ke file khusus nya sendiri. Satu-satunya kombinasi lain yang dapat kita lakukan adalah mengirim keduanya stdoutdan stderrke file yang sama.

Kami dapat mencapai ini dengan perintah berikut:

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

Mari kita hancurkan.

  • ./error.sh : Meluncurkan file skrip error.sh.
  • > capture.txt : Mengalihkan stdoutstreaming ke file capture.txt. >adalah singkatan dari 1>.
  • 2> & 1 : Ini menggunakan instruksi &> redirect. Instruksi ini memungkinkan Anda untuk memberi tahu shell untuk membuat satu aliran sampai ke tujuan yang sama dengan aliran lainnya. Dalam kasus ini, kami mengatakan "alihkan streaming 2 stderr,, ke tujuan yang sama dengan streaming 1,, stdoutsedang dialihkan".

Tidak ada keluaran yang terlihat. Itu menggembirakan.

Mari kita periksa file capture.txt dan lihat apa yang ada di dalamnya.

kucing capture.txt

Baik aliran stdoutdan stderrtelah dialihkan ke satu file tujuan.

Agar keluaran dari aliran dialihkan dan dibuang secara diam-diam, arahkan keluaran ke /dev/null.

Mendeteksi Pengalihan dalam Skrip

Kami membahas bagaimana sebuah perintah dapat mendeteksi jika salah satu aliran sedang dialihkan, dan dapat memilih untuk mengubah perilakunya yang sesuai. Bisakah kita mencapai ini dalam skrip kita sendiri? Ya kita bisa. Dan itu adalah teknik yang sangat mudah untuk dipahami dan digunakan.

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

#! / bin / bash if [-t 0]; lalu echo stdin berasal dari keyboard lain echo stdin berasal dari pipa atau file fi

Gunakan perintah berikut untuk membuatnya dapat dieksekusi:

chmod + x input.sh

Bagian yang cerdas adalah ujian dalam tanda kurung siku. Opsi -t(terminal) mengembalikan nilai true (0) jika file yang terkait dengan deskriptor file berakhir di jendela terminal. Kami telah menggunakan deskriptor file 0 sebagai argumen untuk pengujian, yang mewakili   stdin.

Jika stdindihubungkan ke jendela terminal, pengujian akan terbukti benar. Jika stdinterhubung ke file atau pipa, pengujian akan gagal.

Kita dapat menggunakan file teks yang mudah digunakan untuk menghasilkan masukan ke skrip. Di sini kami menggunakan yang disebut dummy.txt.

./input.sh <dummy.txt

Outputnya menunjukkan bahwa skrip mengenali bahwa input tidak berasal dari keyboard, itu berasal dari sebuah file. Jika Anda memilih, Anda dapat memvariasikan perilaku skrip Anda.

Itu dengan pengalihan file, mari kita coba dengan pipa.

kucing dummy.txt | ./input.sh

Skrip mengenali bahwa inputnya sedang disalurkan ke dalamnya. Atau lebih tepatnya, ia mengenali sekali lagi bahwa stdinaliran tidak terhubung ke jendela terminal.

Mari kita jalankan skrip tanpa pipa atau pengalihan.

./input.sh

The stdinaliran terhubung ke jendela terminal, dan script laporan ini sesuai.

Untuk memeriksa hal yang sama dengan aliran keluaran, kita membutuhkan skrip baru. Ketik berikut ini ke dalam editor dan simpan sebagai output.sh.

#! / bin / bash if [-t 1]; lalu echo stdout akan pergi ke jendela terminal lain echo stdout sedang dialihkan atau disalurkan ke fi

Gunakan perintah berikut untuk membuatnya dapat dieksekusi:

chmod + x input.sh

Satu-satunya perubahan signifikan pada skrip ini adalah dalam pengujian di tanda kurung siku. Kami menggunakan angka 1 untuk mewakili deskriptor file stdout.

Ayo coba. Kami akan menyalurkan output melalui cat.

./output | kucing

Skrip mengenali bahwa outputnya tidak langsung menuju jendela terminal.

Kami juga dapat menguji skrip dengan mengarahkan output ke file.

./output.sh> capture.txt

Tidak ada output ke jendela terminal, kami diam-diam kembali ke command prompt. Seperti yang kami harapkan.

Kita dapat melihat ke dalam file capture.txt untuk melihat apa yang ditangkap. Gunakan perintah berikut untuk melakukannya.

cat capture.sh

Sekali lagi, tes sederhana dalam skrip kami mendeteksi bahwa stdoutaliran tidak dikirim langsung ke jendela terminal.

Jika kita menjalankan skrip tanpa pipa atau pengalihan apa pun, skrip tersebut akan mendeteksi bahwa skrip stdouttersebut dikirim langsung ke jendela terminal.

./output.sh

Dan itulah yang kami lihat.

Aliran Kesadaran

Mengetahui cara mengetahui apakah skrip Anda terhubung ke jendela terminal, atau pipa, atau sedang dialihkan, memungkinkan Anda untuk menyesuaikan perilakunya.

Logging dan keluaran diagnostik bisa lebih atau kurang rinci, tergantung pada apakah itu akan ditampilkan ke layar atau ke file. Pesan kesalahan dapat dicatat ke file yang berbeda dari output program normal.

Seperti yang biasanya terjadi, lebih banyak pengetahuan membawa lebih banyak pilihan.