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!