Apa itu stdin, stderr dan stdout dalam Bash

What Are Stdin Stderr



Setiap kali menjalankan arahan di terminal, stdin , stderr , dan stdout adalah tiga aliran data yang dibuat oleh bash. Sekiranya anda sudah biasa dengan baris arahan, anda mungkin telah memanfaatkan ciri-ciri ini. Pada asasnya, mereka membenarkan perpaipan / pengalihan data dari satu arahan ke perintah yang lain.

Mari kita lihat caranya stdin , stderr , dan stdout berfungsi dan bagaimana anda boleh menggunakannya juga.







stdin, stdout dan stderr

Dalam pengkomputeran, istilah aliran merujuk kepada sesuatu yang dapat memindahkan data. Di sini, ketiga aliran membawa teks sebagai data.



Sama dengan aliran air, aliran data juga mempunyai dua titik akhir. Terdapat sumber dan aliran keluar. Apa sahaja arahan yang anda jalankan di terminal akan berada di kedua-dua titik aliran. Dengan menggunakan aliran, anda boleh menyambungkan dua tetingkap terminal, dua perintah yang berbeza, dan juga fail!



Mari kita buat penjelasan cepat mengenai aliran khas.





  • stdin: bermaksud input standard. Ia memerlukan teks sebagai input.
  • stdout: bermaksud output standard. Output teks arahan disimpan dalam aliran stdout.
  • stderr: bermaksud ralat standard. Setiap kali arahan menghadapi ralat, mesej ralat disimpan dalam aliran ini.

Di Linux, hampir semua aliran diperlakukan seperti fail. Sama seperti anda boleh membaca / menulis fail, anda juga dapat membaca / menulis data dari aliran ini.

Cara mudah untuk mengakses sebarang fail adalah dengan menggunakan nombor deskriptor fail unik yang berkaitan dengannya. Dalam kes aliran ini, ada nilai unik yang diberikan untuk setiap aliran tersebut.



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

stdin, stdout, dan stderr dalam tindakan

Mari kita mulakan dengan mempelajari lebih lanjut mengenai aliran ini melalui tindakan, kita akan bermula dengan stdin.

Jalankan arahan berikut.

$membaca

Perintah itu memerlukan input dari papan kekunci. Di sini, alat baca mendapat input dari stdin. Sekarang mari kita lihat stdout.

Jalankan arahan terlebih dahulu.

$ls -tempat

Di sini, perintah ls menyenaraikan fail dalam direktori semasa. Senarai dihantar ke stdout dan terminal mencetaknya. Mari periksa stderr sekarang.

Terdapat pelbagai cara kesalahan berlaku. Untuk contoh ini, menghantar argumen yang tidak sah akan menyebabkan ralat.

$ls -tempatapa sahaja

Di sini, tidak ada fail yang dinamakan apa-apa. Itulah sebabnya mesej yang dikembalikan dihantar stderr .

Paip

Ini adalah teknik biasa yang memanfaatkan sepenuhnya aliran stdin dan stdout. Mari kita jelaskan dengan contoh.

$membuang 'Hai dunia' | cengkamanhello

Di sini, | tanda bertanggungjawab untuk paip. Keluarannya membuang menjana ditulis dalam stdout aliran. Kemudian, paip mengalihkan kandungan stdout ke stdin untuk perintah grep. Begitulah grep mengetahui kandungan untuk menjalankan operasi.

Sekiranya anda ingin memasukkan kedua stderr dan stdout ke arahan seterusnya, maka gunakan | & sebagai gantinya.

$membuangHai dunia| & kucing

$apa sahaja| & kucing

Mengalihkan aliran

Sekarang kita tahu bagaimana aliran ini berfungsi, mari kita lihat bagaimana anda boleh mengalihkannya. Paip adalah bentuk pengalihan. Namun, ia hanya melibatkan stdin dan stdout. Bash membenarkan kawalan khusus ke atas ketiga-tiga aliran tersebut.

Untuk mengalihkan kandungan stdout ke file, tambahkan> sudut diikuti dengan nama fail sasaran.

$membuangHai dunia>hello.txt

Di sini, output arahan echo akan disimpan dalam fail hello.txt.

Sekiranya fail itu sudah ada, maka perintah di atas akan menimpanya. Untuk mengelakkannya, pastikan nama failnya unik. Sekiranya anda tidak mahu menimpa, anda mungkin mahu menggunakan >> sebagai gantinya. Ia menambahkan output pada akhir fail sasaran.

$membuang 'Hai dunia' >>hello.txt

Matlamat stdin adalah bekerja dengan input. Ini juga boleh dialihkan. Sebagai contoh, bukannya mengetik input dari papan kekunci, ia boleh dimuat dari fail.

Dalam arahan ini, kucing akan mengambil inputnya terus dari fail hello.txt.

$kucing <hello.txt

Mari kita lihat pengalihan dengan contoh yang berbeza. Kali ini, ia akan melibatkan skrip Python.

$# pyin.py
$ nama= input('Masukkan nama n')
$e-mel = input('Masukkan email n')
$mencetak('Nama anda% s dan e-mel adalah% s'%(nama, e-mel))

Input untuk skrip terletak di hello.txt.

$kucinghello.txt

Mari hantar fail sebagai input untuk skrip.

$ python3 pyin.py <hello.txt

Menariknya, anda boleh mengarahkan kedua-duanya stdin dan stdout dalam baris arahan yang sama. Di sini, arahan berikut akan menggunakan hello.txt sebagai stdin dan hantarkan stdout arahan ke fail.

$ python3 pyin.py <hello.txt >pengeluaran.txt

Mengarahkan stderr sama dengan stdout. Walau bagaimanapun, anda perlu menyebutkan ID keterangan 2 untuk menunjukkan stderr. Jika tidak, ia hanya akan menggunakan stdout.

Di sini, saya akan mengalihkan kandungan stderr ke fail teks.

$apa sahaja2>ralat.txt

Mengarahkan Stdout dan Stderr

Ya, mungkin untuk mengarahkan kedua-duanya secara serentak. Yang anda perlukan hanyalah menyebutkan keterangan ID 1 dan 2 sebelum pengalihan semula.

$membuangHai dunia1>output.log2>debug.log

Pemikiran terakhir

stdin , stdout , dan stderr adalah ciri-ciri hebat yang ditawarkan bash secara lalai. Sekiranya anda menggunakan skrip bash, menggunakannya dapat sangat berguna dalam situasi yang rumit.

Ingin mengetahui lebih lanjut mengenai skrip bash? Mari mulakan dengan ini panduan pemula untuk skrip bash !

Selamat mencuba!