Ubah hala output ke fail. Mengubah hala strim input/output standard

1403

Mengubah hala "2>&1", ">/dev/null" atau strim output pada Unix (bash/sh)

Penilaian anda: karya hebat sangat bagus bagus biasa Tidak membacanya boleh diterima biasa-biasa buruk sangat buruk tidak membaca

Aliran keluaran

Mesej skrip adalah output kepada strim yang jelas - strim output. Jadi apa yang kita keluarkan melalui

echo "Hello, dunia!"

Bukan sahaja dipaparkan pada skrin, tetapi, dari sudut pandangan sistem, dan khususnya jurubahasa arahan sh dan bash, ia dikeluarkan melalui aliran keluaran tertentu. Dalam kes gema, strim nombor 1 (stdout) yang dikaitkan dengan skrin.

Sesetengah program dan skrip juga menggunakan aliran keluaran yang berbeza - nombor 2 (stderr). Mereka memaparkan mesej ralat di sana. Ini memungkinkan untuk memisahkan maklumat biasa dan mesej ralat daripada aliran dan laluan dan memprosesnya secara berasingan.

Sebagai contoh, anda boleh menyekat output mesej maklumat, hanya meninggalkan mesej ralat. Atau hantar mesej ralat ke fail berasingan untuk pengelogan.

Apakah itu ">somefile"

Entri ini dalam Unix (dalam jurubahasa bash dan sh) menunjukkan pengalihan aliran keluaran.

Dalam contoh berikut, kami akan mengubah hala semua mesej maklumat (biasa) arahan ls ke fail myfile.txt, dengan itu hanya mempunyai senarai ls dalam fail ini:

$ ls > myfile.txt


Dalam kes ini, selepas menekan Enter, anda tidak akan melihat apa-apa pada skrin, tetapi fail myfile.txt akan mengandungi semua yang sepatutnya dipaparkan pada skrin.

Walau bagaimanapun, mari kita lakukan operasi yang sengaja tersilap:

$ ls /masdfasdf > myfile.txt


Jadi apa yang akan berlaku? Kerana direktori masdfasdf tidak wujud dalam akar sistem fail (saya menganggap begitu - bagaimana jika anda lakukan?), maka arahan ls akan menghasilkan ralat. Walau bagaimanapun, ia akan membuang ralat ini bukan melalui aliran stdout biasa (1), tetapi melalui aliran ralat stderr (2). Dan ubah hala ditetapkan hanya untuk stdout ("> myfile.txt").

Kerana kami tidak mengubah hala strim stderr(2) ke mana-mana - mesej ralat akan muncul pada skrin dan TIDAK akan muncul dalam fail myfile.txt

Sekarang mari jalankan arahan ls supaya data maklumat ditulis pada fail myfile.txt dan mesej ralat ditulis pada fail myfile.err, tanpa apa-apa yang muncul pada skrin semasa pelaksanaan:

$ ls >myfile.txt 2>myfile.err


Di sini kita menemui untuk pertama kalinya petunjuk nombor strim sebagai ubah hala. Entri "2>myfile.err" menunjukkan bahawa strim nombor 2 (stderr) harus diubah hala ke fail myfile.err.

Sudah tentu, kita boleh mengarahkan kedua-dua strim ke fail yang sama atau ke peranti yang sama.

2>&1

Anda selalunya boleh menemui entri sedemikian dalam skrip. Ia bermaksud: "Ubah hala strim nombor 2 ke strim nombor 1", atau "Strim stderr - ubah hala melalui strim stdout". Itu. Kami menghalakan semua mesej ralat melalui rangkaian yang melaluinya mesej biasa, bukan ralat biasanya dicetak.

$ ls /asfasdf 2>&1


Berikut ialah contoh lain di mana semua mesej diubah hala ke fail myfile.txt:

$ ls /asfasdf >myfile.txt 2>&1


Dalam kes ini, semua mesej, kedua-dua ralat dan biasa, akan ditulis ke myfile.txt, kerana Kami mula-mula mengubah hala strim stdout ke fail, dan kemudian menunjukkan bahawa ralat harus dibuang ke stdout - sewajarnya, ke dalam fail myfile.txt

/dev/null

Walau bagaimanapun, kadangkala kita hanya perlu menyembunyikan semua mesej - tanpa menyimpannya. Itu. hanya sekat output. Peranti maya /dev/null digunakan untuk ini. Dalam contoh berikut, kami akan mengarahkan semua output mesej biasa daripada arahan ls ke /dev/null:

$ ls > /dev/null


Tiada apa-apa kecuali mesej ralat akan dipaparkan pada skrin. Dan dalam contoh berikut, mesej ralat akan disekat:

$ ls > /dev/null 2>&1


Selain itu, rekod ini bersamaan dengan rekod borang:

$ ls >/dev/null 2>/dev/null


Dan dalam contoh berikut kami hanya akan menyekat mesej ralat:

$ ls 2>/dev/null

Sila ambil perhatian bahawa anda tidak lagi boleh menentukan "2>&1" di sini, kerana strim (1) tidak diubah hala ke mana-mana dan dalam kes ini mesej ralat hanya akan muncul pada skrin.

Apa yang didahulukan - telur atau ayam?

Saya akan berikan anda 2 contoh di sini.

Contoh 1)

$ ls >/dev/null 2>&1


Contoh 2)

$ ls 2>&1 >/dev/null


Dari segi rupa, jumlahnya tidak berubah dengan menyusun semula tempat suku kata. Tetapi susunan petunjuk ubah hala adalah penting!

Maksudnya ialah jurubahasa membaca dan menggunakan ubah hala dari kiri ke kanan. Dan sekarang kita akan melihat kedua-dua contoh.

Contoh 1

1) ">/dev/null" - kami mengarahkan aliran 1 (stdout) ke /dev/null. Semua mesej yang memasuki aliran (1) akan dihantar ke /dev/null.

2) "2>&1" - kami mengubah hala strim 2 (stderr) ke strim 1 (stdout). Tapi sebab thread 1 sudah dikaitkan dengan /dev/null - semua mesej masih akan berakhir di /dev/null.

Keputusan: skrin kosong.

Contoh 2

1) "2>&1" - kami mengubah hala aliran ralat stderr (2) ke aliran stdout (1). Pada masa yang sama, kerana thread 1 dikaitkan dengan terminal secara lalai - kami akan berjaya melihat mesej ralat pada skrin.

2) ">/dev/null" - dan di sini kita ubah hala utas 1 ke /dev/null. Dan kami tidak akan melihat mesej biasa.

Keputusan: Kami akan melihat mesej ralat pada skrin, tetapi tidak akan melihat mesej biasa.

Kesimpulan: ubah hala strim dahulu, kemudian pautkan kepadanya.

Walaupun program biasanya berurusan dengan aliran standard untuk I/O, seperti yang dinyatakan, shell mempunyai kemudahan khas untuk mengubah hala I/O.

5.5.1 Operator >,< и >>

Simbol " digunakan untuk menunjukkan pengalihan > ", "< "Dan" >> ". Penggunaan yang paling biasa adalah untuk mengubah hala output arahan ke fail. Berikut ialah contoh:

$ ls -l > /home/jim/dir.txt

Perintah ini akan menyimpan dalam fail /home/jim/dir.txt senarai fail dan subdirektori direktori yang semasa semasa perintah itu dilaksanakan ls; Selain itu, jika fail yang dinyatakan tidak wujud, ia akan dibuat; jika ia wujud, ia akan ditimpa; jika anda mahu output arahan dilampirkan pada penghujung fail sedia ada, maka bukannya simbol yang anda perlukan > guna >> . Dalam kes ini, kehadiran ruang sebelum atau selepas aksara > atau >> adalah tidak material dan berfungsi hanya untuk kemudahan pengguna.

Anda boleh menghantar output bukan sahaja ke fail, tetapi juga ke input arahan lain atau ke peranti (seperti pencetak). Jadi, untuk mengira bilangan perkataan dalam fail /home/jim/report.txt, anda boleh menggunakan arahan berikut:

$ cat /home/jim/report.txt > wc -w

dan untuk mencetak fail, gunakan arahan:

$ cat /home/jim/report.txt > lpr

Seperti yang anda lihat, pengendali > berfungsi untuk mengalihkan aliran keluaran. Berhubung dengan aliran input, fungsi yang serupa dilakukan oleh pengendali < . Contoh arahan di atas untuk mengira bilangan perkataan dalam fail tertentu boleh ditulis semula seperti berikut (perhatikan ketiadaan arahan kucing):

$wc -w< /home/jim/report.txt

Pilihan ubah hala ini sering digunakan dalam pelbagai skrip untuk arahan yang biasanya menerima (atau mengharapkan) input papan kekunci. Dalam skrip yang mengautomasikan beberapa operasi rutin, anda boleh memberikan arahan maklumat yang diperlukan daripada fail di mana perkara yang perlu dimasukkan untuk melaksanakan arahan ini diprarakam.

Disebabkan oleh fakta bahawa simbol < , > Dan >> bertindak pada aliran standard, ia boleh digunakan bukan sahaja dengan cara biasa, seperti yang biasa dilakukan, tetapi juga dengan cara yang sedikit berbeza. Jadi, arahan berikut adalah setara:

$ kucing > fail

$cat>fail

$ >fail kucing

$ > fail kucing

Walau bagaimanapun, dengan sendirinya (tanpa sebarang arahan yang mana aliran standard ditakrifkan) simbol ubah hala tidak boleh digunakan, jadi seseorang tidak boleh, sebagai contoh, dengan menaip

$file1 > fail2

dapatkan salinan fail. Tetapi ini tidak mengurangkan kepentingan mekanisme ini, kerana benang standard ditakrifkan untuk sebarang arahan. Dalam kes ini, anda boleh mengubah hala bukan sahaja input dan output standard, tetapi juga aliran lain. Untuk melakukan ini, nyatakan nombor strim yang diubah hala sebelum simbol ubah hala. Stdin input standard ialah nombor 0, stdout keluaran standard ialah nombor 1, mesej ralat standard stderr ialah nombor 2. Maksudnya, format penuh arahan ubah hala ialah (ingat bahawa ruang berhampiran > adalah pilihan):

perintah N>M

di mana N Dan M— bilangan aliran standard (0,1,2) atau nama fail. Penggunaan simbol dalam beberapa kes < , > Dan >> tanpa menyatakan nombor saluran atau nama fail adalah mungkin hanya kerana 1 digantikan secara lalai untuk nombor yang hilang, iaitu output standard. Ya, pengendali > tanpa menyatakan nombor ditafsirkan sebagai 1 > .

Di samping hanya mengalihkan strim standard, ia juga mungkin bukan sahaja untuk mengubah hala strim ke satu saluran atau yang lain, tetapi untuk membuat salinan kandungan strim standard. Terdapat simbol khas untuk ini & , yang diletakkan di hadapan nombor saluran yang strim dialihkan:

perintah N > &M

Perintah ini bermakna bahawa output nombor saluran N dihantar kedua-duanya ke output standard dan diduplikasi ke dalam nombor saluran M. Sebagai contoh, agar mesej ralat diduplikasi pada output standard, anda perlu memberikan arahan 2>&1, sementara 1>&2 pendua stdout kepada stderr. Ciri ini amat berguna apabila mengubah hala output ke fail, kerana kami kemudiannya melihat mesej pada skrin dan menyimpannya ke fail.

5.5.2 Operator |

Pilihan khas untuk pengalihan keluaran ialah saluran perisian (kadangkala dipanggil paip atau penghantar). Untuk melakukan ini, dua atau lebih arahan, supaya output yang sebelumnya berfungsi sebagai input untuk yang seterusnya, disambungkan (atau dipisahkan, jika anda lebih suka) dengan aksara bar menegak - "|". Dalam kes ini, aliran keluaran standard arahan terletak di sebelah kiri simbol | , dihantar ke input standard program yang terletak di sebelah kanan simbol | . Sebagai contoh:

$ kucing myfile | grep Linux | wc -l

Baris ini bermakna bahawa output arahan adalah kucing, iaitu teks daripada fail myfile, akan dihantar ke input arahan grep, yang akan menyerlahkan hanya baris yang mengandungi perkataan "Linux". Keluaran arahan grep akan, seterusnya, diarahkan ke input arahan wc -l, yang akan mengira bilangan baris tersebut.

Paip program digunakan untuk menggabungkan beberapa atur cara kecil, setiap satu daripadanya hanya melakukan transformasi khusus pada aliran inputnya, untuk mencipta arahan umum yang menghasilkan beberapa transformasi yang lebih kompleks.

Perlu diingatkan bahawa shell secara serentak memanggil semua arahan yang termasuk dalam saluran paip untuk pelaksanaan, melancarkan contoh berasingan shell untuk setiap arahan, supaya sebaik sahaja program pertama mula menghasilkan sesuatu dalam aliran keluarannya, arahan seterusnya mula memprosesnya. Dengan cara yang sama, setiap arahan berikutnya melakukan operasinya sendiri, menunggu data daripada arahan sebelumnya dan menghasilkan keputusannya sebagai input yang seterusnya. Jika anda mahu arahan selesai sepenuhnya sebelum arahan seterusnya bermula, anda boleh menggunakannya pada satu baris sebagai simbol saluran paip | , dan titik bertitik ; . Sebelum setiap titik koma, cangkerang akan berhenti dan menunggu semua arahan sebelumnya yang disertakan dalam saluran paip untuk menyelesaikan pelaksanaan.

Status keluar (nilai boolean dikembalikan selepas program selesai) daripada paip adalah sama dengan status keluar yang dikembalikan oleh arahan terakhir dalam saluran paip. Anda boleh meletakkan simbol "!" di hadapan arahan pertama saluran paip, maka status keluar dari saluran paip akan menjadi penafian logik status keluar dari arahan terakhir. Cangkang menunggu semua arahan saluran paip selesai sebelum menetapkan nilai pulangan.

5.5.3 Penapis

Contoh terakhir di atas (dengan arahan grep) boleh digunakan untuk menggambarkan satu lagi konsep penting, iaitu program penapis. Penapis ialah arahan (atau program) yang mengambil aliran data input, melakukan beberapa transformasi padanya dan mengeluarkan hasilnya kepada output standard (dari mana ia boleh diubah hala ke tempat lain mengikut budi bicara pengguna). Perintah penapis termasuk arahan yang telah disebutkan di atas kucing, lebih, kurang, wc, cmp, berbeza, serta arahan berikut.

Jadual 5.1. Perintah penapis

Pasukan

Penerangan Ringkas

grep, fgrep, egrep

Mencari fail input atau input standard untuk baris yang mengandungi corak yang ditentukan dan menulisnya ke output standard

Menggantikan semua aksara yang berlaku dalam aliran input yang disenaraikan dalam senarai yang diberikan dengan aksara yang sepadan daripada senarai kedua yang ditentukan

kom

Membandingkan dua fail baris demi baris dan mengeluarkan 3 lajur kepada output standard: satu - baris yang berlaku hanya dalam 1 fail, yang kedua - baris yang berlaku hanya dalam fail ke-2: dan baris ketiga - yang muncul dalam kedua-dua fail

Memformat fail teks atau kandungan input standard untuk pencetakan

sed

Editor rentetan yang digunakan untuk melakukan beberapa transformasi pada aliran data input (diambil daripada fail atau daripada input standard)

Penapis khas ialah arahan tee, yang "memecahkan" aliran input, menghalakannya pada satu sisi ke output standard, dan di sebelah yang lain ke fail (yang namanya anda mesti nyatakan). Adalah mudah untuk melihat bahawa dengan tindakannya arahan tee serupa dengan pengendali ubah hala 1>&fail.

Keupayaan penapis boleh diperluaskan dengan ketara melalui penggunaan ungkapan biasa, yang membolehkan anda mengatur, sebagai contoh, carian menggunakan pelbagai corak, selalunya sangat kompleks.

Banyak yang boleh dikatakan tentang ubah hala dan penapis. Tetapi bahan ini tersedia dalam kebanyakan buku di UNIX dan Linux, contohnya Petersen [P1.4] dan Kelly-Bootle [P1.8]. Oleh itu, kita akan menghadkan diri kita kepada apa yang telah diperkatakan dan terus mempertimbangkan apa yang dipanggil persekitaran atau persekitaran yang dicipta oleh tempurung.

V. Kostromin (kos dan rus-linux dot net) - 5.5. Ubah hala I/O, saluran dan penapis

Mana-mana program ialah "mesin automatik" yang direka untuk memproses data: menerima satu maklumat sebagai input, ia menghasilkan yang lain sebagai hasil kerjanya. Walaupun maklumat masuk dan/atau keluar mungkin sifar, iaitu, tiada. Data yang dipindahkan ke program untuk diproses adalah inputnya, apa yang dihasilkannya sebagai hasil kerja adalah output. Mengatur input dan output untuk setiap program adalah tugas sistem pengendalian.

Setiap program berfungsi dengan data jenis tertentu: teks, grafik, bunyi, dll. Seperti yang mungkin telah menjadi jelas, antara muka pengurusan sistem utama di Linux ialah terminal, yang direka untuk memindahkan maklumat teks daripada pengguna kepada sistem dan belakang. Memandangkan hanya maklumat teks boleh dimasukkan dan dikeluarkan dari terminal, input dan output program yang dikaitkan dengan terminal juga mestilah teks. Walau bagaimanapun, keperluan untuk beroperasi dengan data teks tidak mengehadkan keupayaan pengurusan sistem, tetapi, sebaliknya, mengembangkannya. Seseorang boleh membaca output mana-mana program dan memikirkan apa yang berlaku dalam sistem, dan program yang berbeza ternyata serasi antara satu sama lain kerana mereka menggunakan jenis perwakilan data yang sama - teks.

Perintah dan skrip boleh menerima input dalam dua cara: daripada input standard (dipautkan ke papan kekunci) atau daripada fail. Pemisahan yang serupa wujud untuk output: output arahan atau skrip dihantar ke skrin terminal secara lalai, tetapi anda boleh mengubah halanya ke fail. Jika ralat berlaku semasa operasi. mesej tentang mereka juga dipaparkan pada skrin, dan aliran ralat juga boleh dialihkan ke fail.

Mari kita lihat dahulu beberapa arahan yang boleh digunakan untuk mengatur I/O.

Perintah Output ke Peranti Output Standard

Linux menyediakan beberapa arahan untuk mencetak mesej ke output standard:

  • echo - Cetak rentetan ke output standard.
  • printf - Cetak teks berformat ke output standard.
  • ya - Cetak teks berulang ke output standard.
  • seq - Cetak urutan nombor ke output standard
  • kosong Kosongkan skrin atau tetingkap.

Sebagai contoh, apabila menggunakan arahan gema, jika anda menentukan aksara kawalan \c, maka apabila output selesai, tidak akan ada peralihan kepada baris baharu:

$ echo "Siapa nama awak?\c"

Siapa nama awak?$

Di sini $ ialah simbol jemputan.

Baris ini juga boleh mengira nilai pembolehubah shell dan juga arahan lain. Sebagai contoh, arahan berikut memberitahu anda apakah direktori rumah pengguna semasa (pembolehubah persekitaran $HOME) dan terminal yang disambungkannya (arahan tty disertakan dalam petikan belakang supaya jurubahasa akan meletakkan hasil pelaksanaannya pada baris).

$ echo "Direktori rumah anda ialah $HOME, anda disambungkan ke terminal - `tty` "

Direktori rumah anda ialah /home/knoppix, anda disambungkan ke terminal - /dev/tty1

Memandangkan petikan berganda mempunyai tujuan khas dalam penterjemah cangkerang, untuk memasukkan petikan berganda dalam rentetan keluaran, anda perlu membuat asal tujuan khasnya menggunakan garis miring ke belakang (\). Ini membatalkan penetapan mana-mana watak khas.

Sebagai contoh, untuk memaparkan rentetan "/dev/tty1" anda perlu jalankan:

$echo “\”/dev/tty1\””

Arahan input daripada peranti input standard

Perintah baca membaca satu baris daripada input standard dan menulis kandungannya kepada pembolehubah yang ditentukan. Apabila menentukan beberapa pembolehubah, perkataan pertama ditulis kepada yang pertama, perkataan kedua kepada yang kedua, dsb. yang terakhir mengandungi seluruh baris.

Skrip berikut memanggil arahan baca yang berasingan untuk membaca setiap pembolehubah.


$ ujian kucing
#!/bin/bash
echo "Nama: \c"
baca nama
echo "Nama akhir: \c"
baca nama keluarga
echo “Nama pertama =” $nama “Nama keluarga =” $nama keluarga

Kemudian untuk melaksanakan skrip ini, anda perlu memberikan fail ujian pelaksanaan yang betul: ujian chmod 0755 dan jalankannya./test. Keputusan pelaksanaan: Nama pertama: Ivan Nama keluarga: Petrov Nama pertama=Ivan Nama keluarga=Petrov

INPUT, OUTPUT DAN ALIRAN RALAT STANDARD

Setiap program yang dilancarkan daripada penterjemah arahan menerima tiga aliran I/O terbuka:

Input standard (sldin) - output standard (sldout) - output ralat standard (stderr)

Secara lalai, benang ini dikaitkan dengan terminal. Itu. Mana-mana program yang tidak menggunakan strim selain daripada yang standard akan menunggu input daripada papan kekunci terminal; semua output daripada program itu, termasuk mesej ralat, akan muncul pada skrin terminal.

Selain itu, setiap proses (arahan, skrip, dsb.) yang dilaksanakan dalam penterjemah shell dikaitkan dengan beberapa fail terbuka yang mana proses boleh membaca datanya dan ke dalamnya ia boleh menulisnya. Setiap fail ini dikenal pasti dengan nombor yang dipanggil deskriptor fail, tetapi tiga fail pertama ialah strim I/O lalai:

Deskriptor Fail
Strim input standard 0
Keluaran Standard 1
Strim ralat standard 2

Pada hakikatnya, 12 fail terbuka dicipta, tetapi fail dengan deskriptor 0, 1, dan 2 dikhaskan untuk input, output dan ralat standard. Pengguna juga boleh bekerja dengan fail yang mempunyai deskriptor fail 3 hingga 9 (terpelihara).

Fail input standard (sldin) mempunyai pemegang 0. Daripada fail ini, proses mengekstrak data input mereka. Secara lalai, aliran input dikaitkan dengan papan kekunci (peranti /dev/tty), tetapi selalunya ia datang melalui paip daripada proses lain atau daripada fail biasa.

Fail output standard (stdout) mempunyai pemegang 1. Semua output daripada proses ditulis ke fail ini. Secara lalai, data dikeluarkan ke skrin terminal (peranti/dev/tty), tetapi ia juga boleh dialihkan ke fail atau disalurkan ke proses lain.

Fail aliran ralat standard (siderr) mempunyai deskriptor 2. Mesej ralat yang berlaku semasa pelaksanaan arahan ditulis pada fail ini. Secara lalai, mesej ralat dikeluarkan ke skrin terminal (peranti /dev/tty), tetapi ia juga boleh diubah hala ke fail. Mengapa memperuntukkan fail khas untuk ralat pembalakan? Hakikatnya ialah ini adalah cara yang sangat mudah untuk mengasingkan data output sebenar daripada hasil kerja arahan, serta peluang yang baik untuk mengatur penyelenggaraan pelbagai jenis fail log dengan berkesan.

Sebilangan besar utiliti hanya menggunakan aliran standard. Untuk program sedemikian, shell membenarkan aliran I/O diubah hala secara bebas. Sebagai contoh, anda boleh menyekat mesej ralat, menetapkan input atau output daripada fail.

Itu. Apabila memanggil arahan, anda boleh menentukan di mana input harus diterima dan di mana output harus dihantar, serta mesej ralat. Secara lalai, melainkan dinyatakan sebaliknya, bekerja dengan terminal adalah diandaikan: data dimasukkan dari papan kekunci dan dipaparkan pada skrin. Tetapi jurubahasa shell mempunyai mekanisme pengalihan yang membenarkan aliran standard dikaitkan dengan fail yang berbeza. Dalam kes ini, apabila mengubah hala aliran ralat standard, deskriptor fail (2) mesti ditentukan. Ini tidak diperlukan untuk aliran input dan output.

Kes khas yang berguna untuk menggunakan mekanisme ubah hala adalah untuk mengubah hala ke /dev/null, yang membolehkan anda menyingkirkan mesej yang tidak perlu pada skrin. Menggunakan mekanisme yang sama, anda boleh membuat fail kosong:

% cat myfile - akan mencipta fail kosong myfile dalam direktori semasa.

/dev/null ialah fail khas yang dipanggil. "peranti kosong" Menulis kepadanya berlaku dengan jayanya, tanpa mengira jumlah maklumat "dirakam". Membaca daripada /dev/null adalah bersamaan dengan membaca penghujung fail EOF.

Mengubah hala Strim I/O dijalankan, seperti DOS (Lebih tepat, OS DOS menggunakan sintaks untuk mengalihkan aliran daripada UNIX) menggunakan simbol:

- ubah hala aliran keluaran standard
- pengalihan aliran keluaran standard dalam mod tambah
- ubah hala aliran input standard
- terima data daripada input standard sehingga pembatas ditemui

Walau bagaimanapun, tidak seperti DOS, apabila mencipta saluran program antara dua proses, OS UNIX/Linux melancarkan kedua-dua proses secara serentak dan memindahkan maklumat melalui penimbal sistem (tanpa rakaman perantaraan ke cakera keras). Oleh itu, saluran perisian dalam OS UNIX/Linux adalah cara pertukaran yang sangat cekap. Jika penimbal sistem melimpah (contohnya, jika program ``menghantar'' mengeluarkan maklumat ke saluran lebih cepat daripada program ``menerima'' boleh memprosesnya), OS secara automatik menggantung proses yang menulis ke saluran sehingga penimbal dibebaskan.

Pengendali Lencongan Paling Lazim

Bil. Penerangan Sintaks
1 fail arahan Mengarahkan output standard ke fail baharu

2 arahan 1 fail Mengarahkan output standard ke fail yang ditentukan

3 arahan fail Mengarahkan output standard ke fail yang ditentukan (mod lampirkan)

4 fail arahan 2&1 Mengarahkan output dan ralat standard ke fail yang ditentukan

5 arahan 2 fail Mengarahkan ralat standard ke fail yang ditentukan

6 arahan 2 fail Mengarahkan ralat standard ke fail yang ditentukan (mod tambah)

7 fail arahan 2&1 Mengarahkan output dan ralat standard ke fail yang ditentukan (mod lampirkan)

8 command file1 file2 Menerima input daripada fail pertama dan menghantar output ke fail kedua

9 fail arahan sebagai input standard menerima data daripada fail yang ditentukan

Perintah 10 pembatas Menerima data daripada input standard sehingga pembatas ditemui

11 arahan &m Menerima data daripada fail dengan deskriptor m sebagai input standard

12 arahan &m Mengarahkan output standard ke deskriptor fail m

Pengendali n&m membenarkan fail dengan deskriptor n dialihkan ke lokasi yang sama seperti fail dengan deskriptor m. Terdapat beberapa pengendali yang serupa pada baris arahan, dalam hal ini mereka dikira dari kiri ke kanan.

perintah exec dan menggunakan deskriptor fail

Perintah exec menggantikan shell semasa dengan arahan yang ditentukan. Biasanya ia digunakan untuk menutup penterjemah semasa dan memulakan yang lain. Tetapi ia juga mempunyai kegunaan lain.

Sebagai contoh, arahan seperti

Fail Exec menjadikan fail yang ditentukan sebagai input standard bagi semua arahan. Laksanakannya dalam
tidak ada gunanya dalam mod interaktif - ia bertujuan untuk digunakan dalam skrip,
supaya semua arahan yang datang selepas ia membaca data input mereka daripada fail. Dalam kes ini
mesti ada arahan di hujung skrip

Exec & – yang menutup aliran input standard (dalam kes ini fail). Teknik yang serupa digunakan
terutamanya dalam skrip yang dijalankan apabila anda log keluar.

Perintah exec ialah penunjuk kepada fail dengan deskriptor 0 (stdin). Penunjuk ini boleh dipulihkan hanya selepas skrip selesai dijalankan.
Jika skrip berhasrat untuk meneruskan membaca data dari papan kekunci, maka anda perlu menyimpan
penunjuk kepada aliran input sebelumnya. Di bawah ialah skrip pendek yang menunjukkan cara melakukan ini.

$ kucing f_desc
#!/bin/bash
exec 3&0 0fail
baca linel
baca baris2
eksekutif 0&3
gema $1inel
echo $line2

Perintah exec pertama menyimpan penunjuk kepada input standard (stdin) dalam deskriptor fail 3
(sebarang integer antara 3 dan 9 dibenarkan) dan kemudian membuka fail untuk dibaca. Dua seterusnya membaca arahan
membaca dua baris teks daripada fail. Perintah exec kedua memulihkan penuding kepada input standard: sekarang
ia dikaitkan dengan fail stdin, bukan fail. Arahan gema terakhir memaparkan kandungan baris yang dibaca pada skrin,
yang disimpan dalam pembolehubah linel dan Iine2.

Hasil skrip:
$./f_desc
hello!
Selamat tinggal!

Masa yang baik, pembaca saya!
Dalam artikel ini saya ingin mensistemkan pengetahuan saya mengikut prinsip asas pengendalian aliran dan saluran program dalam penterjemah dan secara umum dalam OS Linux, serta tentang kemungkinan ubah hala data aliran.
Pada mulanya, saya ingin ambil perhatian bahawa penterjemah berfungsi dengan tiga aliran standard:

  1. stdout ini keluaran standard, yang menyediakan output arahan. Deskriptor strim ialah 1.
  2. stderr ini aliran ralat standard, yang mencetak ralat arahan. Deskriptornya ialah 2.
  3. stdin ini input standard, yang menyediakan input kepada arahan. Deskriptornya ialah 0.

Sekarang mari kita terangkan dengan kata-kata mudah apa maksud ketiga-tiga perkara ini:

stdout- aliran keluaran standard. Ini, secara ringkas, ialah maklumat yang kita lihat dalam penterjemah semasa melaksanakan arahan. Iaitu, semua mesej (tanpa mesej ralat) yang arahan yang dilaksanakan dalam penterjemah melaporkan dan memaparkan pada terminal (baca: skrin). (output ke skrin ditetapkan secara lalai, tetapi anda juga boleh menentukan output, contohnya ke fail atau ubah hala ke arahan lain; saya akan memberitahu anda bagaimana ini dilakukan di bawah)

stderr- aliran ralat. Ini adalah ralat semasa melaksanakan arahan dalam bash, yang secara lalai adalah output ke stdout, iaitu, ke terminal (sekali lagi, melainkan output ke lokasi lain ditentukan)

stdin- aliran input. Ini, secara ringkas, adalah apa yang kita masukkan dari papan kekunci ke dalam penterjemah untuk melaksanakan arahan.

Aliran ini digambarkan dengan baik dalam rajah yang diambil dari http://rus-linux.net/:

Dalam imej ini: Stdin, ditunjukkan dalam warna hijau, mempunyai pemegang 0
Stdout, ditunjukkan dalam warna merah, mempunyai pemegang 1
Stderr, ditunjukkan dalam warna biru, mempunyai pemegang 2

Seterusnya, saya akan memberitahu anda cara aliran ini boleh diubah hala ke/daripada fail. Iaitu, apabila melaksanakan arahan, supaya mesej atau ralat tidak dipaparkan pada skrin, tetapi ditulis pada fail. Untuk apa itu? Contohnya, anda sedang melaksanakan beberapa arahan yang outputnya tidak muat dalam tetingkap terminal. Anda memberitahunya untuk menyimpan output standard ke satu fail dan ralat standard ke yang lain. Oleh itu, semua ralat dan jika output standard diperlukan boleh dilihat secara terperinci dengan membuka fail yang disimpan.

Jadi, pengalihan benang dilakukan seperti ini:

$ perintah n>fail

Baris ini menunjukkan: pelaksanaan perintah perintah dan pengalihan aliran (di mana n= pemegang strim) ke fail fail. Apabila melakukan ubah hala ini, jika fail destinasi wujud, ia akan ditimpa. Dalam kes ini, jika n tidak dinyatakan, maka keluaran piawai diandaikan.

$arahan n>>fail

Perintah ini mempunyai sintaks yang serupa, tetapi di sini simbol ">>" ditentukan. Dengan pengalihan ini, jika fail destinasi wujud, output arahan akan dilampirkan pada data sedia ada.

$arahan< file

dalam contoh ini arahan perintah dilaksanakan dan menggunakan fail sebagai sumber input fail, bukannya input papan kekunci

Kadangkala perlu untuk menggabungkan aliran ralat standard dengan aliran keluaran standard supaya ralat dan output program biasa boleh diproses bersama. Untuk tujuan ini, gabungan dengan simbol digunakan: &. Contoh tindakan ini:

Cari / -name .name_file > /path/to/file 2>&1

Apabila arahan ini dilaksanakan, fail dicari dari akar sistem fail dengan nama .nama_fail dan mengalihkan hasil carian (stdout dan stderr) ke fail /path/to/file. Reka bentuk > /path/to/file 2>&1 mengubah hala keluaran standard ke /path/to/file dan ralat percetakan kepada output standard. Yang berkata: menulis 2>&1 sebelum > tidak akan berfungsi, kerana apabila jurubahasa membaca 2>&1 , ia belum tahu di mana aliran keluaran standard diubah hala, jadi aliran ralat dan keluaran tidak akan digabungkan.

$ arahan > fail 2>&1

sama seperti menulis:

$ perintah &> fail

$ arahan 2>&fail

Jika output perlu diabaikan, ia boleh diarahkan ke peranti /dev/null, ini adalah sejenis "lubang hitam" yang mengambil sebarang jumlah maklumat dan mengubahnya menjadi tiada.

Saya rasa maklumat yang diberikan tentang pengalihan aliran akan mencukupi untuk memahami intipatinya, sekarang saya akan memberitahu anda tentang pemindahan penghantar.

Saluran paip dalam Linux ialah keupayaan beberapa atur cara untuk bekerja bersama apabila keluaran satu atur cara dipindahkan terus kepada input yang lain tanpa menggunakan fail sementara perantaraan. Sintaks untuk menggunakan saluran paip adalah seperti berikut:

$perintah1 | perintah2

Dalam contoh ini, arahan dilaksanakan perintah1, aliran keluarannya digunakan sebagai aliran input apabila melaksanakan perintah2.

Itu sahaja untuk hari ini. Saya akan gembira menerima komen dan tambahan. Terima kasih.

Salam sejahtera, McSim!

Pengendali pengalihan arahan digunakan untuk menukar lokasi lalai aliran input dan output arahan ke beberapa lokasi lain. Lokasi aliran input dan output dipanggil pemegang.

Jadual berikut menerangkan operator ubah hala input dan output arahan.

Operator ubah hala

Penerangan

Menulis output arahan dan bukannya baris arahan ke fail atau peranti seperti pencetak.

Membaca aliran input arahan daripada fail dan bukannya dari papan kekunci.

Menambahkan output arahan ke penghujung fail tanpa mengalih keluar maklumat sedia ada daripada fail.

Membaca output satu deskriptor sebagai input kepada deskriptor lain.

Membaca input satu pemegang sebagai output pemegang yang lain.

Membaca output satu arahan dan menulisnya ke input arahan lain. Prosedur ini dikenali sebagai penyaluran.

Secara lalai, input arahan (pemegang STDIN) dihantar dari papan kekunci ke penterjemah arahan Cmd.exe, kemudian Cmd.exe menghantar output arahan (pemegang STDOUT) ke tetingkap gesaan arahan.

Jadual berikut menunjukkan deskriptor yang tersedia.

Nombor 0 hingga 9 mewakili 10 deskriptor pertama. Jurubahasa arahan Cmd.exe digunakan untuk menjalankan program dan mengubah hala mana-mana daripada 10 pemegang. Untuk menentukan pemegang yang diperlukan, masukkan nombornya sebelum pengendali ubah hala. Jika pemegang tidak ditakrifkan, maka secara lalai pengendali ubah hala input "<» будет ноль (0), а оператором перенаправления вывода «>" akan menjadi satu (1). Selepas memasuki operator "<» или «>"Adalah perlu untuk menunjukkan di mana untuk membaca dan di mana untuk menulis data. Anda boleh menentukan nama fail atau mana-mana deskriptor sedia ada.

Untuk menentukan ubah hala kepada pemegang sedia ada, gunakan ampersand (&) diikuti dengan nombor pemegang yang diingini (contohnya, & nombor_penangan). Contohnya, untuk mengubah hala pemegang 2 (STDERR) kepada mengendalikan 1 (STDOUT), masukkan:

Deskriptor pendua

Operator ubah hala "&" menduplikasi output atau input daripada satu pemegang yang ditentukan kepada pemegang yang ditentukan yang lain. Sebagai contoh, untuk menghantar output arahan dir ke File.txt dan hantar output ralat ke File.txt, masukkan:

dir>c:\file.txt 2>&1

Apabila menduplikasi deskriptor, semua ciri asalnya disalin. Sebagai contoh, jika pemegang adalah tulis sahaja, maka semua penduanya akan tulis sahaja. Anda tidak boleh menduplikasi pemegang baca sahaja ke dalam pemegang tulis sahaja.

Arahan input arahan (<)

Untuk mengubah hala input pad kekunci berangka ke fail atau peranti, gunakan "<». Например, для ввода команды menyusun daripada fail List.txt masukkan:

menyusun

Kandungan File.txt akan muncul pada baris arahan sebagai senarai dalam susunan abjad.

Operator "<» открывает заданное имя файла с доступом только для чтения. Поэтому с его помощью нельзя записывать в файл. Например, при запуске программы с оператором <&2 все попытки прочитать дескриптор 0 ни к чему не приведут, так как изначально он был открыт с доступом только для записи.

Catatan

  • Pemegang 0 ialah lalai untuk pengendali ubah hala input "<».

Ubah hala keluaran arahan (>)

Output hampir semua arahan dipaparkan dalam tetingkap command prompt. Malah arahan yang mengeluarkan data ke cakera atau pencetak menghasilkan mesej dan gesaan dalam tetingkap Prompt Perintah.

Untuk mengubah hala output arahan daripada tetingkap Command Prompt kepada fail atau peranti, gunakan operator ">". Operator ini digunakan dengan kebanyakan arahan. Sebagai contoh, untuk mengubah hala keluaran arahan dir dalam fail Dirlist.txt masukkan:

dir>dirlist.txt

Jika fail Dirlist.txt tidak wujud, penterjemah arahan Cmd.exe akan menciptanya. Jika fail wujud, Cmd.exe akan menggantikan maklumat dalam fail dengan data yang diterima daripada arahan dir.

Untuk menjalankan arahan pembuangan penghalaan netsh dan kemudian menghantar hasil kerjanya ke Route.cfg, masukkan:

pembuangan penghalaan netsh>c:\route.cfg

Operator ">" membuka fail yang ditentukan dengan akses tulis sahaja. Oleh itu, fail tidak boleh dibaca menggunakan operator ini. Contohnya, semasa menjalankan program dengan pengendali ubah hala<&0 все попытки записать дескриптор 1 ни к чему не приведут, так как изначально дескриптор 0 был открыт с доступом только для чтения.

Catatan.

  • Pemegang 1 ialah lalai untuk operator ubah hala output ">".

Menggunakan operator "<&» для перенаправления ввода и дублирования

Untuk menggunakan operator ubah hala input, fail yang ditentukan mesti sudah wujud. Jika fail input wujud, penterjemah arahan Cmd.exe membukanya dengan akses baca sahaja dan menghantar kandungannya kepada arahan seolah-olah ia adalah input pad kekunci berangka. Apabila pemegang ditentukan, penterjemah arahan Cmd.exe menduplikasikannya ke dalam pemegang yang wujud pada sistem.

Contohnya, untuk membaca File.txt ke dalam deskriptor input 0 (STDIN), masukkan:

< file.txt

Untuk membuka fail File.txt, isih kandungannya dan kemudian hantar ke tetingkap gesaan arahan (STDOUT), taip:

menyusun< file.txt

Untuk mencari File.txt dan ubah hala pemegang 1 (STDOUT) dan kendalikan 2 (STDERR) ke Search.txt, masukkan:

findfile file.txt>search.txt 2<&1

Untuk menduplikasi deskriptor 3 yang ditentukan pengguna sebagai input kepada deskriptor 0 (STDIN), masukkan:

Menggunakan Operator ">&" untuk Ubah Hala Input dan Pendua

Apabila anda mengubah hala output ke fail dan menentukan nama fail sedia ada, penterjemah arahan Cmd.exe membuka fail dengan akses tulis sahaja dan menimpa kandungannya. Jika pemegang ditentukan, penterjemah arahan Cmd.exe menduplikasi fail ke dalam pemegang sedia ada.

Untuk menduplikasi deskriptor 3 yang ditentukan pengguna ke dalam deskriptor 1, masukkan:

Untuk mengubah hala semua output, termasuk output deskriptor 2 (STDERR), arahan ipconfig ke dalam pemegang 1 (STDOUT) dan kemudian mengalihkan output ke Output.log, masukkan:

ipconfig.exe>>output.log 2>&1

Menggunakan Operator ">>" untuk Menambah Output

Untuk menambahkan output perintah ke penghujung fail tanpa kehilangan maklumat yang disimpan di dalamnya, gunakan dua kali ganda lebih besar daripada aksara (>>). Sebagai contoh, arahan berikut menambah penyenaraian direktori yang dibuat oleh arahan itu dir, ke fail Dirlist.txt:

dir>>dirlist.txt

Untuk menambah output arahan netstat pada akhir fail Tcpinfo.txt masukkan:

netstat>>tcinfo.txt

Menggunakan operator saluran (|)

Operator paip talian menegak (|) mengambil output satu arahan (STDOUT lalai) dan menghalakannya ke input arahan lain (STDIN lalai). Sebagai contoh, arahan berikut mengisih direktori:

dir | menyusun

Dalam contoh ini, kedua-dua arahan dijalankan serentak, tetapi arahan menyusun berhenti seketika sehingga output arahan diterima dir. Pasukan menyusun menggunakan output arahan dir sebagai inputnya dan kemudian menghantar outputnya kepada deskriptor 1 (STDOUT).

Menggabungkan Perintah dengan Operator Ubah Arah

Dengan menggabungkan arahan penapis dengan arahan dan nama fail lain, anda boleh membuat arahan tersuai. Contohnya, untuk menyimpan nama fail yang mengandungi rentetan "LOG", gunakan arahan berikut:

dir /b | cari "LOG" > loglist.txt

Keluaran arahan dir dihantar kepada arahan penapis cari. Nama fail yang mengandungi rentetan "LOG" disimpan dalam fail Loglist.txt sebagai senarai (contohnya, NetshConfig.log, Logdat.svd dan Mylog.bat).

Apabila menggunakan lebih daripada satu penapis dalam satu arahan, ia mesti dipisahkan menggunakan paip (|). Sebagai contoh, arahan berikut mencari setiap direktori pada pemacu C untuk fail yang mempunyai rentetan "Log" dalam nama mereka dan memaparkannya halaman demi halaman:

dir c:\ /s /b | cari "LOG" | lebih

Kehadiran paip (|) menunjukkan kepada Cmd.exe bahawa arahan output dir perlu dihantar ke arahan penapis cari. Pasukan cari memilih hanya nama fail yang mengandungi rentetan "LOG". Pasukan lebih memaparkan nama fail yang diperolehi oleh arahan cari dengan jeda selepas setiap skrin diisi.