Bagaimana untuk mengubah hala output konsol ke fail. Ubah hala output ke fail. Aliran Output Standard Linux

  • Terjemahan

Jika anda telah menguasai asas terminal, anda mungkin bersedia untuk menggabungkan arahan yang telah anda pelajari. Kadang-kadang melaksanakan perintah shell satu demi satu sudah cukup untuk menyelesaikan masalah tertentu, tetapi dalam beberapa kes memasukkan arahan demi arahan terlalu membosankan dan tidak rasional. Dalam situasi seperti ini, beberapa simbol khas, seperti kurungan sudut, berguna.

Untuk shell, penterjemah arahan Linux, aksara tambahan ini tidak membazir ruang skrin. Mereka adalah pasukan berkuasa yang boleh menggabungkan maklumat yang berbeza, memisahkan apa yang sebelum ini keseluruhannya dan melakukan lebih banyak lagi. Salah satu ciri shell yang paling mudah, namun paling berkuasa dan digunakan secara meluas ialah pengalihan strim input/output standard.

Tiga aliran I/O standard

Untuk memahami perkara yang akan kita bincangkan di sini, adalah penting untuk mengetahui dari mana datangnya data yang boleh diubah hala dan ke mana ia pergi. Linux mempunyai tiga aliran I/O standard.

Yang pertama ialah aliran input standard. Dalam sistem, ini adalah benang No. 0 (kerana dalam komputer, pengiraan biasanya bermula dari sifar). Nombor benang juga dipanggil deskriptor. Strim ini mewakili beberapa maklumat yang dihantar ke terminal, khususnya, arahan yang dihantar ke shell untuk dilaksanakan. Biasanya, data memasuki strim ini apabila pengguna memasukkannya dari papan kekunci.

Aliran kedua ialah aliran keluaran standard, bernombor 1. Ini ialah aliran data yang dikeluarkan oleh shell selepas melakukan beberapa tindakan. Biasanya, data ini berakhir dalam tetingkap terminal yang sama di mana arahan yang menyebabkannya muncul telah dimasukkan.

Dan akhirnya, aliran ketiga ialah aliran ralat standard, ia mempunyai pemegang 2. Strim ini serupa dengan aliran keluaran standard, kerana biasanya apa yang masuk ke dalamnya berakhir pada skrin terminal. Walau bagaimanapun, ia sememangnya berbeza daripada output standard, dan akibatnya, aliran ini boleh dikawal secara berasingan jika dikehendaki. Ini berguna, sebagai contoh, dalam situasi seterusnya. Terdapat pasukan yang memproses isipadu yang besar data, melakukan operasi yang kompleks dan rawan ralat. Anda ingin memastikan bahawa muatan yang dijana oleh arahan ini tidak bercampur dengan mesej ralat. Ini dicapai melalui pengalihan yang berasingan bagi aliran keluaran dan ralat.

Seperti yang anda mungkin sudah meneka, pengalihan I/O bermakna bekerja dengan strim yang diterangkan di atas dan mengubah hala data di mana pengaturcara memerlukannya. Ini dilakukan menggunakan simbol > dan< в pelbagai kombinasi, penggunaannya bergantung pada ke mana data yang diubah hala harus pergi.

Ubah hala keluaran standard

Katakan anda ingin mencipta fail yang akan ditulis tarikh semasa dan masa. Untuk memudahkan urusan, terdapat arahan, dinamakan dengan tepat tarikh , yang mengembalikan apa yang kita perlukan. Biasanya mengarahkan data output kepada output standard. Untuk membolehkan data ini muncul dalam fail, anda perlu menambah simbol > selepas arahan, sebelum nama fail sasaran. Sebelum dan selepas > anda perlu meletakkan ruang.

Apabila menggunakan ubah hala, mana-mana fail yang dinyatakan selepas > akan ditimpa. Jika tiada apa-apa yang berharga dalam fail dan kandungannya boleh hilang, dalam reka bentuk kami ia dibenarkan untuk digunakan sudah fail sedia ada. Biasanya lebih baik menggunakan nama fail dalam kes ini yang belum wujud. Fail ini akan dibuat selepas arahan dilaksanakan. Mari kita panggil tarikh.txt . Sambungan fail selepas titik biasanya tidak begitu penting, tetapi sambungan membantu memastikan perkara itu teratur. Jadi inilah arahan kami:

$date>date.txt
Ini bukan untuk mengatakan bahawa arahan ini sendiri sangat berguna, bagaimanapun, berdasarkannya, kita sudah boleh melakukan sesuatu yang lebih menarik. Katakan anda ingin mengetahui cara trafik Internet anda mengubah hala ke titik akhir tertentu dengan merekodkan data setiap hari. Perintah traceroute akan membantu dalam menyelesaikan masalah ini, yang melaporkan butiran tentang laluan trafik antara komputer kami dan titik akhir yang ditentukan semasa memanggil arahan dalam bentuk URL. Data termasuk maklumat tentang semua penghala yang dilalui trafik.

Memandangkan kami sudah mempunyai fail dengan tarikh, adalah wajar untuk menambahkan data yang diterima daripada traceroute ke fail ini. Untuk melakukan ini, anda perlu menggunakan dua > simbol, diletakkan satu demi satu. Akibatnya pasukan baru, yang mengubah hala output ke fail, tetapi tidak menimpanya, tetapi menambah data baharu selepas yang lama, akan kelihatan seperti ini:

$ traceroute google.com >> date.txt
Sekarang apa yang perlu kita lakukan ialah menukar nama fail kepada sesuatu yang lebih bermakna menggunakan perintah mv, yang mengambil nama fail asal sebagai hujah pertama dan nama fail baharu sebagai yang kedua:

$ mv date.txt trace1.txt

Ubah hala input standard

Menggunakan tanda< вместо >kita boleh mengubah hala input standard dengan menggantikannya dengan kandungan fail.

Katakan terdapat dua fail: list1.txt dan list2.txt, setiap satu mengandungi senarai rentetan yang tidak diisih. Setiap senarai mempunyai elemen yang unik, tetapi beberapa elemen dalam senarai adalah sama. Kita boleh mencari baris yang berada dalam kedua-dua senarai pertama dan kedua dengan menggunakan arahan kom, tetapi sebelum menggunakannya, senarai mesti diisih.

Terdapat perintah isihan yang mengembalikan senarai diisih ke terminal tanpa menyimpan data yang diisih ke fail dari mana ia diambil. Anda boleh menghantar versi diisih setiap senarai ke fail baharu, menggunakan perintah >, dan kemudian gunakan arahan kom. Walau bagaimanapun, pendekatan ini memerlukan sekurang-kurangnya dua arahan, walaupun perkara yang sama boleh dilakukan dalam satu baris tanpa membuat fail yang tidak diperlukan.

Jadi kita boleh menggunakan arahan< для перенаправления отсортированной версии каждого файла команде comm . Вот что у нас получилось:

$ comm<(sort list1.txt) <(sort list2.txt)
Tanda kurung di sini mempunyai maksud yang sama seperti dalam matematik. Shell memproses arahan dalam kurungan dahulu, dan kemudian segala-galanya. Dalam contoh kami, baris daripada fail diisih terlebih dahulu, dan kemudian hasilnya dihantar ke arahan comm, yang kemudiannya memaparkan hasil membandingkan senarai.

Mengubah hala strim ralat standard

Akhir sekali, mari kita bincangkan tentang pengalihan ralat standard. Ini mungkin diperlukan, sebagai contoh, untuk mencipta fail log dengan ralat atau untuk menggabungkan mesej ralat dan data yang dikembalikan oleh arahan tertentu dalam satu fail.

Sebagai contoh, bagaimana jika anda ingin mencari seluruh sistem anda untuk mendapatkan maklumat tentang antara muka wayarles yang boleh diakses oleh pengguna yang tidak mempunyai keistimewaan root? Untuk melakukan ini, anda boleh menggunakan yang berkuasa cari arahan.

Biasanya, apabila pengguna biasa menjalankan arahan cari di seluruh sistem, ia akan mengeluarkan kedua-dua data berguna dan ralat ke terminal. Pada masa yang sama, biasanya terdapat lebih banyak yang terakhir daripada yang pertama, yang menjadikannya sukar untuk mencari apa yang anda perlukan dalam output arahan. Penyelesaian kepada masalah ini agak mudah: hanya ubah semula aliran ralat standard ke fail menggunakan perintah 2> (ingat, 2 ialah deskriptor untuk aliran ralat standard). Akibatnya, hanya apa yang dihantar oleh arahan ke skrin akan muncul. keluaran standard:

$ find / -name wireless 2> denied.txt
Perkara yang perlu dilakukan jika anda perlu menyimpan hasil kerja pasukan fail berasingan tanpa mencampurkan data ini dengan maklumat ralat? Memandangkan strim boleh diubah hala secara bebas antara satu sama lain, kami boleh menambah arahan untuk mengubah hala output standard ke fail pada akhir binaan kami:

$ find / -name wireless 2> denied.txt > found.txt
Sila ambil perhatian bahawa kurungan sudut pertama disertakan dengan nombor - 2>, dan yang kedua tanpanya. Ini kerana output standard mempunyai pemegang 1, dan perintah > bertujuan untuk mengubah hala output standard jika tiada nombor pemegang dinyatakan.

Akhir sekali, jika anda mahu semua output arahan berakhir dalam satu fail, anda boleh mengubah hala kedua-dua aliran ke lokasi yang sama menggunakan perintah &>:

$ find / -name wireless &> results.txt

Keputusan

Di sini kami hanya mengkaji asas mekanisme untuk mengubah hala aliran dalam penterjemah baris arahan Linux, tetapi walaupun sedikit yang anda pelajari hari ini memberi anda secara maya kemungkinan tanpa had. Lagipun, seperti semua perkara lain yang berkaitan dengan bekerja di terminal, menguasai pengalihan strim memerlukan latihan. Oleh itu, kami mengesyorkan anda memulakan percubaan anda sendiri dengan > dan< .

Pembaca yang dihormati! Adakah kamu tahu contoh yang menarik menggunakan pengalihan benang dalam Linux untuk membantu pemula menjadi lebih selesa dengan teknik terminal ini?

Anda sudah biasa dengan dua kaedah untuk bekerja dengan output skrip baris arahan:

  • Memaparkan data output pada skrin.
  • Ubah hala output ke fail.
Kadangkala anda perlu menunjukkan sesuatu pada skrin dan menulis sesuatu pada fail, jadi anda perlu memahami cara Linux mengendalikan input dan output, yang bermaksud mempelajari cara menghantar hasil skrip ke tempat yang anda perlukan. Mari kita mulakan dengan bercakap tentang deskriptor fail standard.

Deskriptor fail standard

Segala-galanya dalam Linux adalah fail, termasuk input dan output. sistem operasi mengenal pasti fail menggunakan deskriptor.

Setiap proses dibenarkan mempunyai sehingga sembilan pemegang fail terbuka. bash shell menyimpan tiga pemegang pertama dengan ID 0, 1 dan 2. Inilah maksudnya.

  • 0 , STDIN - aliran input standard.
  • 1, STDOUT - aliran keluaran standard.
  • 2, STDERR - aliran ralat standard.
Tiga pemegang khas ini mengendalikan input dan output kepada skrip.
Anda perlu benar-benar memahami aliran standard. Mereka boleh dibandingkan dengan asas di mana interaksi skrip dengan dunia luar. Mari lihat butiran mengenai mereka.

STDIN

STDIN ialah aliran input standard shell. Untuk terminal, input standard ialah papan kekunci. Apabila skrip menggunakan aksara ubah hala input -< , Linux заменяет дескриптор файла input standard kepada yang dinyatakan dalam arahan. Sistem membaca fail dan memproses data seolah-olah ia dimasukkan dari papan kekunci.

banyak arahan bash terima input daripada STDIN jika baris arahan tidak menyatakan fail dari mana data harus diambil. Sebagai contoh, ini adalah benar untuk arahan kucing.

Apabila anda masuk perintah kucing pada baris arahan, tanpa menyatakan sebarang parameter, ia menerima input daripada STDIN. Selepas anda memasuki baris seterusnya, kucing hanya memaparkannya pada skrin.

STDOUT

STDOUT ialah aliran keluaran standard shell. Secara lalai ini ialah skrin. Kebanyakan bash mengarahkan data output ke STDOUT, yang menyebabkannya muncul dalam konsol. Data boleh diubah hala ke fail dengan melampirkannya pada kandungannya menggunakan perintah >>.

Jadi kami mempunyai fail data yang kami boleh menambah lebih banyak data menggunakan arahan ini:

Pwd >> myfile
Apakah output pwd yang akan ditambahkan pada fail myfile , tetapi data yang sudah ada di dalamnya tidak akan pergi ke mana-mana.

Mengubah hala output arahan ke fail

Setakat ini begitu baik, tetapi bagaimana jika anda cuba melakukan sesuatu seperti berikut dengan mengakses xfile yang tidak wujud, semuanya direka untuk menyebabkan mesej ralat dihantar ke myfile.

Ls –l xfile > myfile
Selepas melaksanakan arahan ini, kami akan melihat mesej ralat pada skrin.


Percubaan untuk mengakses fail yang tidak wujud

Ralat dijana semasa cuba mengakses fail yang tidak wujud, tetapi shell tidak mengubah hala mesej ralat ke fail dengan mencetaknya ke skrin. Tetapi kami mahu mesej ralat dimasukkan ke dalam fail. Apa nak buat? Jawapannya mudah - gunakan deskriptor standard ketiga.

STDERR

STDERR ialah aliran ralat standard shell. Secara lalai, pemegang ini menghala ke perkara yang sama yang ditunjuk oleh STDOUT, itulah sebabnya kami melihat mesej pada skrin apabila ralat berlaku.

Jadi, katakan kita mahu mengubah hala mesej ralat ke, katakan, fail log atau tempat lain, bukannya mencetaknya ke skrin.

▍Ubah hala aliran ralat

Seperti yang anda sedia maklum, pemegang fail STDERR ialah 2. Kami boleh mengubah hala ralat dengan meletakkan pemegang ini sebelum arahan ubah hala:

Ls -l xfile 2>myfile cat ./myfile
Mesej ralat kini akan pergi ke myfile.


Mengubah hala mesej ralat ke fail

▍Ubah hala ralat dan aliran keluaran

Semasa menulis skrip baris arahan, mungkin terdapat situasi di mana anda perlu mengubah hala kedua-dua mesej ralat dan output standard. Untuk mencapai ini, anda perlu menggunakan arahan ubah hala untuk deskriptor yang sesuai, dengan menyatakan fail di mana ralat dan output standard harus pergi:

Ls –l myfile xfile anotherfile 2> errorcontent 1> correctcontent

Mengubah hala ralat dan output standard

Cangkang akan mengalihkan arahan ls yang biasanya dihantar kepada STDOUT ke dalam fail kandungan yang betul terima kasih kepada binaan 1>. Mesej ralat yang akan pergi ke STDERR berakhir dalam fail kandungan ralat disebabkan oleh arahan ubah hala 2>.

Jika perlu, kedua-dua STDERR dan STDOUT boleh diubah hala ke fail yang sama menggunakan perintah &>:


Mengubah hala STDERR dan STDOUT ke fail yang sama

Selepas arahan dilaksanakan, perkara yang dimaksudkan untuk STDERR dan STDOUT berakhir dalam fail kandungan.

Mengubah hala keluaran dalam skrip

Terdapat dua kaedah untuk mengubah hala keluaran dalam skrip baris arahan:
  • Ubah hala sementara, atau ubah hala keluaran satu baris.
  • Ubah hala kekal, atau ubah hala semua atau sebahagian daripada keluaran skrip.

▍Ubah hala keluaran sementara

Dalam skrip, anda boleh mengubah hala keluaran satu baris ke STDERR. Untuk melakukan ini, hanya gunakan arahan ubah hala, menyatakan deskriptor STDERR dan mendahului nombor deskriptor dengan aksara ampersand (&):

#!/bin/bash echo "Ini adalah ralat" >&2 echo "Ini adalah output biasa"
Jika anda menjalankan skrip, kedua-dua baris akan muncul pada skrin, kerana, seperti yang anda sedia maklum, secara lalai ralat dikeluarkan di tempat yang sama seperti data biasa.


Ubah hala sementara

Mari jalankan skrip supaya output STDERR pergi ke fail.

./myscript 2> myfile
Seperti yang anda lihat, kini output biasa dihantar ke konsol, dan mesej ralat pergi ke fail.


Mesej ralat ditulis pada fail

▍Ubah hala keluaran kekal

Jika skrip anda perlu mengubah hala banyak output ke skrin, adalah menyusahkan untuk menambah arahan yang sesuai pada setiap panggilan gema. Sebaliknya, anda boleh menetapkan output untuk dialihkan ke pemegang khusus untuk tempoh skrip menggunakan perintah exec:

#!/bin/bash exec 1>outfile echo "Ini adalah ujian untuk mengubah hala semua output" echo "daripada skrip shell ke fail lain." echo "tanpa perlu mengubah hala setiap baris"
Mari jalankan skrip.


Mengubah hala semua output ke fail

Jika anda melihat fail yang dinyatakan dalam arahan ubah hala keluaran, anda akan mendapati bahawa semua yang dikeluarkan oleh arahan gema berakhir dalam fail tersebut.

Perintah exec boleh digunakan bukan sahaja pada permulaan skrip, tetapi juga di tempat lain:

#!/bin/bash exec 2>myerror echo "Ini ialah permulaan daripada skrip" echo "kini mengubah hala semua output ke lokasi lain" exec 1>myfile echo "Ini harus pergi ke fail myfile" echo "dan ini harus pergi ke fail myerror" >&2
Inilah yang anda dapat selepas menjalankan skrip dan melihat fail yang kami ubah hala output.


Mengubah hala output ke fail yang berbeza

Perintah exec mula-mula mengubah hala output daripada STDERR ke fail myerror . Output beberapa arahan gema kemudiannya dihantar ke STDOUT dan dicetak ke skrin. Perintah exec kemudian menyebabkan apa sahaja yang berakhir di STDOUT dihantar ke fail myfile , dan akhirnya kami menggunakan arahan ubah hala ke STDERR dalam arahan gema, yang menyebabkan baris yang sepadan ditulis ke myerror fail.

Sebaik sahaja anda telah menguasai ini, anda akan dapat mengubah hala output ke tempat yang anda mahukan. Sekarang mari kita bincangkan tentang pengalihan masukan.

Mengubah hala input dalam skrip

Untuk mengubah hala input, anda boleh menggunakan teknik yang sama yang kami gunakan untuk mengubah hala output. Sebagai contoh, arahan exec membolehkan anda menjadikan fail sebagai sumber data untuk STDIN:

Exec 0< myfile
Perintah ini memberitahu shell bahawa sumber input mestilah myfile dan bukannya STDIN biasa. Mari lihat pengalihan masukan dalam tindakan:

#!/bin/bash exec 0< testfile count=1 while read line do echo "Line #$count: $line" count=$(($count + 1)) done
Inilah yang akan muncul pada skrin selepas menjalankan skrip.


Ubah hala input

Dalam artikel terdahulu, anda mempelajari cara menggunakan arahan baca untuk membaca input pengguna daripada papan kekunci. Jika anda mengubah hala input dengan menjadikan sumber data sebagai fail, maka arahan baca, apabila cuba membaca data daripada STDIN, akan membacanya daripada fail, dan bukan dari papan kekunci.

Sesetengah pentadbir Linux menggunakan pendekatan ini untuk membaca dan kemudian memproses fail log.

Mencipta ubah hala keluaran anda sendiri

Dengan mengubah hala input dan output dalam skrip, anda tidak terhad kepada tiga deskriptor fail standard. Seperti yang telah disebutkan, anda boleh mempunyai sehingga sembilan pemegang terbuka. Baki enam, bernombor 3 hingga 8, boleh digunakan untuk mengubah hala input atau output. Mana-mana daripada mereka boleh diberikan kepada fail dan digunakan dalam kod skrip.

Anda boleh menetapkan pemegang untuk mengeluarkan data menggunakan perintah exec:

#!/bin/bash exec 3>myfile echo "Ini harus dipaparkan pada skrin" echo "dan ini harus disimpan dalam fail" >&3 echo "Dan ini harus kembali pada skrin"
Selepas menjalankan skrip, sebahagian daripada output akan muncul pada skrin, bahagian - dalam fail dengan deskriptor 3.


Mengubah hala keluaran menggunakan pemegangnya sendiri

Mencipta Deskriptor Fail untuk Kemasukan Data

Anda boleh mengubah hala input dalam skrip dengan cara yang sama seperti anda mengubah hala output. Simpan STDIN dalam pemegang lain sebelum mengubah hala input.

Selepas selesai membaca fail, anda boleh memulihkan STDIN dan menggunakannya seperti biasa:

#!/bin/bash exec 6<&0 exec 0< myfile count=1 while read line do echo "Line #$count: $line" count=$(($count + 1)) done exec 0<&6 read -p "Are you done now? " answer case $answer in y) echo "Goodbye";; n) echo "Sorry, this is the end.";; esac
Mari cuba senarionya.


Ubah hala input

Dalam contoh ini, deskriptor fail 6 digunakan untuk menyimpan rujukan kepada STDIN. Kemudian pengalihan masukan dilakukan, fail menjadi sumber data untuk STDIN. Input kepada arahan baca kemudian datang daripada STDIN yang diubah hala, iaitu, daripada fail.

Selepas membaca fail, kami menetapkan semula STDIN dengan mengubah hala ke mengendalikan 6. Sekarang, untuk memastikan semuanya berfungsi dengan betul, skrip bertanyakan soalan kepada pengguna, menunggu input papan kekunci dan memproses perkara yang dimasukkan.

Menutup pemegang fail

Cangkang secara automatik menutup pemegang fail selepas skrip selesai. Walau bagaimanapun, dalam beberapa kes adalah perlu untuk menutup pemegang secara manual sebelum skrip selesai berjalan. Untuk menutup pemegang, ia mesti diubah hala ke &- . Ia kelihatan seperti ini:

#!/bin/bash exec 3> myfile echo "Ini adalah baris ujian data" >&3 exec 3>&- echo "Ini tidak akan berfungsi" >&3
Selepas melaksanakan skrip, kami akan menerima mesej ralat.


Percubaan untuk mengakses deskriptor fail tertutup

Masalahnya ialah kami cuba mengakses deskriptor yang tidak wujud.

Berhati-hati apabila menutup pemegang fail dalam skrip. Jika anda menghantar data ke fail, kemudian menutup pemegang, kemudian membukanya semula, shell akan menggantikan fail sedia ada dengan yang baru. Iaitu, semua yang ditulis sebelum ini ke fail ini akan hilang.

Mendapatkan maklumat tentang pemegang terbuka

Untuk mendapatkan senarai semua pemegang terbuka di Linux, anda boleh menggunakan perintah lsof. Pada banyak pengedaran, seperti Fedora, utiliti lsof terletak di /usr/sbin. Perintah ini agak berguna kerana ia memaparkan maklumat tentang setiap pemegang yang dibuka pada sistem. Ini termasuk apa yang dibuka oleh proses yang berjalan di latar belakang dan apa yang dibuka oleh pengguna log masuk.

Perintah ini mempunyai banyak kunci, mari kita lihat yang paling penting.

  • -p Membolehkan anda menentukan ID proses.
  • -d Membolehkan anda menentukan bilangan deskriptor yang anda ingin dapatkan maklumat.
Untuk mengetahui PID proses semasa, anda boleh menggunakan khas pembolehubah persekitaran$$ di mana shell menulis PID semasa.

Suis -a digunakan untuk melaksanakan operasi logik DAN pada hasil yang dikembalikan dengan menggunakan dua suis lain:

Lsof -a -p $$ -d 0,1,2

Memaparkan maklumat tentang pemegang terbuka

Jenis fail yang dikaitkan dengan STDIN, STDOUT dan STDERR ialah CHR (mod aksara). Memandangkan mereka semua menunjuk ke terminal, nama fail sepadan dengan nama peranti yang diberikan kepada terminal. Ketiga-tiga fail standard boleh dibaca dan boleh ditulis.

Mari kita lihat memanggil perintah lsof daripada skrip di mana, sebagai tambahan kepada yang standard, deskriptor lain dibuka:

#!/bin/bash exec 3> myfile1 exec 6> myfile2 exec 7< myfile3 lsof -a -p $$ -d 0,1,2,3,6,7
Inilah yang berlaku jika anda menjalankan skrip ini.


Lihat pemegang fail yang dibuka oleh skrip

Skrip membuka dua pemegang untuk output (3 dan 6) dan satu untuk input (7). Laluan ke fail yang digunakan untuk mengkonfigurasi deskriptor juga ditunjukkan.

Penindasan Output

Kadang-kadang anda perlu memastikan bahawa arahan dalam skrip, yang, sebagai contoh, boleh dilaksanakan seperti proses latar belakang, tiada apa yang dipaparkan pada skrin. Untuk melakukan ini, anda boleh mengubah hala output ke /dev/null . Ini adalah sesuatu seperti "lubang hitam".

Berikut ialah contoh cara menyekat mesej ralat:

Ls -al badfile anotherfile 2> /dev/null
Pendekatan yang sama digunakan jika, sebagai contoh, anda perlu mengosongkan fail tanpa memadamnya:

Cat /dev/null > myfile

Keputusan

Hari ini anda belajar tentang cara input dan output berfungsi dalam skrip baris arahan. Kini anda tahu cara mengendalikan deskriptor fail, mencipta, melihat dan menutupnya serta mengetahui tentang mengalihkan aliran input, output dan ralat. Semua ini sangat penting dalam pembangunan skrip bash.

Lain kali kita bincang Isyarat Linux, cara memprosesnya dalam skrip, tentang menjalankan kerja berjadual dan tentang tugas latar belakang.

Pembaca yang dihormati! Bahan ini menyediakan asas untuk bekerja dengan aliran input, output dan ralat. Kami pasti bahawa di kalangan anda ada profesional yang boleh memberitahu anda tentang semua ini apa yang hanya datang dengan pengalaman. Jika ya, kami menyampaikan kepada anda.

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; dan jika fail yang ditentukan tidak wujud, maka ia akan dicipta; 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 itu tidak menjadikannya kurang penting mekanisme ini, kerana aliran 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 bilangan strim yang diubah hala sebelum simbol ubah hala. Standard input stdin ialah nombor 0, standard output stdout ialah nombor 1, standard stream error stream stderr ialah nombor 2. Iaitu format penuh Perintah ubah hala kelihatan seperti ini (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 > .

Kecuali ubah hala mudah aliran standard, ia juga mungkin bukan sahaja untuk mengubah hala strim ke satu saluran atau yang lain, tetapi untuk membuat salinan kandungan aliran 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 kemudian melihat mesej pada skrin dan menyimpannya ke fail.

5.5.2 Operator |

Pilihan khas untuk pengalihan keluaran adalah untuk mengatur saluran program(kadang-kadang dipanggil saluran 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 seterusnya 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 koma bernoktah, 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 data daripada standard baris input, mengandungi corak yang ditentukan, dan keluarkannya 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

Format untuk percetakan fail teks atau kandungan input standard

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 dikembangkan dengan ketara dengan menggunakan ungkapan biasa, membolehkan anda mengatur, sebagai contoh, carian menggunakan pelbagai templat, 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

Anda sudah biasa dengan dua kaedah untuk bekerja dengan output skrip baris arahan:

  • Memaparkan data output pada skrin.
  • Ubah hala output ke fail.
Kadangkala anda perlu menunjukkan sesuatu pada skrin dan menulis sesuatu pada fail, jadi anda perlu memahami cara Linux mengendalikan input dan output, yang bermaksud mempelajari cara menghantar hasil skrip ke tempat yang anda perlukan. Mari kita mulakan dengan bercakap tentang deskriptor fail standard.

Deskriptor fail standard

Segala-galanya dalam Linux adalah fail, termasuk input dan output. Sistem pengendalian mengenal pasti fail menggunakan deskriptor fail.

Setiap proses dibenarkan mempunyai sehingga sembilan pemegang fail terbuka. Bash shell menyimpan tiga pemegang pertama dengan ID 0, 1 dan 2. Inilah maksudnya.

  • 0 , STDIN - aliran input standard.
  • 1, STDOUT - aliran keluaran standard.
  • 2, STDERR - aliran ralat standard.
Tiga pemegang khas ini mengendalikan input dan output kepada skrip.
Anda perlu benar-benar memahami aliran standard. Mereka boleh dibandingkan dengan asas di mana interaksi skrip dengan dunia luar dibina. Mari lihat butiran mengenai mereka.

STDIN

STDIN ialah aliran input standard shell. Untuk terminal, input standard ialah papan kekunci. Apabila skrip menggunakan aksara ubah hala input -< , Linux заменяет дескриптор файла стандартного ввода на тот, который указан в команде. Система читает файл и обрабатывает данные так, будто они введены с клавиатуры.

Banyak arahan bash menerima input daripada STDIN melainkan baris arahan menentukan fail untuk mengambil data. Sebagai contoh, ini adalah benar untuk arahan kucing.

Apabila anda memasukkan arahan kucing pada baris arahan tanpa menyatakan sebarang parameter, ia menerima input daripada STDIN. Selepas anda memasuki baris seterusnya, kucing hanya memaparkannya pada skrin.

STDOUT

STDOUT ialah aliran keluaran standard shell. Secara lalai ini ialah skrin. Kebanyakan bash mengarahkan data output ke STDOUT, yang menyebabkannya muncul dalam konsol. Data boleh diubah hala ke fail dengan melampirkannya pada kandungannya menggunakan perintah >>.

Jadi kami mempunyai fail data yang kami boleh menambah lebih banyak data menggunakan arahan ini:

Pwd >> myfile
Apakah output pwd yang akan ditambahkan pada fail myfile , tetapi data yang sudah ada di dalamnya tidak akan pergi ke mana-mana.

Mengubah hala output arahan ke fail

Setakat ini begitu baik, tetapi bagaimana jika anda cuba melakukan sesuatu seperti berikut dengan mengakses xfile yang tidak wujud, semuanya direka untuk menyebabkan mesej ralat dihantar ke myfile.

Ls –l xfile > myfile
Selepas melaksanakan arahan ini, kami akan melihat mesej ralat pada skrin.


Percubaan untuk mengakses fail yang tidak wujud

Ralat dijana semasa cuba mengakses fail yang tidak wujud, tetapi shell tidak mengubah hala mesej ralat ke fail dengan mencetaknya ke skrin. Tetapi kami mahu mesej ralat dimasukkan ke dalam fail. Apa nak buat? Jawapannya mudah - gunakan deskriptor standard ketiga.

STDERR

STDERR ialah aliran ralat standard shell. Secara lalai, pemegang ini menghala ke perkara yang sama yang ditunjuk oleh STDOUT, itulah sebabnya kami melihat mesej pada skrin apabila ralat berlaku.

Jadi, katakan kita mahu mengubah hala mesej ralat ke, katakan, fail log atau tempat lain, bukannya mencetaknya ke skrin.

▍Ubah hala aliran ralat

Seperti yang anda sedia maklum, pemegang fail STDERR ialah 2. Kami boleh mengubah hala ralat dengan meletakkan pemegang ini sebelum arahan ubah hala:

Ls -l xfile 2>myfile cat ./myfile
Mesej ralat kini akan pergi ke myfile.


Mengubah hala mesej ralat ke fail

▍Ubah hala ralat dan aliran keluaran

Semasa menulis skrip baris arahan, mungkin terdapat situasi di mana anda perlu mengubah hala kedua-dua mesej ralat dan output standard. Untuk mencapai ini, anda perlu menggunakan arahan ubah hala untuk deskriptor yang sesuai, dengan menyatakan fail di mana ralat dan output standard harus pergi:

Ls –l myfile xfile anotherfile 2> errorcontent 1> correctcontent

Mengubah hala ralat dan output standard

Cangkang akan mengalihkan arahan ls yang biasanya dihantar kepada STDOUT ke dalam fail kandungan yang betul terima kasih kepada binaan 1>. Mesej ralat yang akan pergi ke STDERR berakhir dalam fail kandungan ralat disebabkan oleh arahan ubah hala 2>.

Jika perlu, kedua-dua STDERR dan STDOUT boleh diubah hala ke fail yang sama menggunakan perintah &>:


Mengubah hala STDERR dan STDOUT ke fail yang sama

Selepas arahan dilaksanakan, perkara yang dimaksudkan untuk STDERR dan STDOUT berakhir dalam fail kandungan.

Mengubah hala keluaran dalam skrip

Terdapat dua kaedah untuk mengubah hala keluaran dalam skrip baris arahan:
  • Ubah hala sementara, atau ubah hala keluaran satu baris.
  • Ubah hala kekal, atau ubah hala semua atau sebahagian daripada keluaran skrip.

▍Ubah hala keluaran sementara

Dalam skrip, anda boleh mengubah hala keluaran satu baris ke STDERR. Untuk melakukan ini, hanya gunakan arahan ubah hala, menyatakan deskriptor STDERR dan mendahului nombor deskriptor dengan aksara ampersand (&):

#!/bin/bash echo "Ini adalah ralat" >&2 echo "Ini adalah output biasa"
Jika anda menjalankan skrip, kedua-dua baris akan muncul pada skrin, kerana, seperti yang anda sedia maklum, secara lalai ralat dikeluarkan di tempat yang sama seperti data biasa.


Ubah hala sementara

Mari jalankan skrip supaya output STDERR pergi ke fail.

./myscript 2> myfile
Seperti yang anda lihat, kini output biasa dihantar ke konsol, dan mesej ralat pergi ke fail.


Mesej ralat ditulis pada fail

▍Ubah hala keluaran kekal

Jika skrip anda perlu mengubah hala banyak output ke skrin, adalah menyusahkan untuk menambah arahan yang sesuai pada setiap panggilan gema. Sebaliknya, anda boleh menetapkan output untuk dialihkan ke pemegang khusus untuk tempoh skrip menggunakan perintah exec:

#!/bin/bash exec 1>outfile echo "Ini adalah ujian untuk mengubah hala semua output" echo "daripada skrip shell ke fail lain." echo "tanpa perlu mengubah hala setiap baris"
Mari jalankan skrip.


Mengubah hala semua output ke fail

Jika anda melihat fail yang dinyatakan dalam arahan ubah hala keluaran, anda akan mendapati bahawa semua yang dikeluarkan oleh arahan gema berakhir dalam fail tersebut.

Perintah exec boleh digunakan bukan sahaja pada permulaan skrip, tetapi juga di tempat lain:

#!/bin/bash exec 2>myerror echo "Ini adalah permulaan skrip" echo "kini mengalihkan semua output ke lokasi lain" exec 1>myfile echo "Ini harus pergi ke myfile file" echo "dan ini harus pergi ke fail myerror" >&2
Inilah yang anda dapat selepas menjalankan skrip dan melihat fail yang kami ubah hala output.


Mengubah hala output ke fail yang berbeza

Perintah exec mula-mula mengubah hala output daripada STDERR ke fail myerror . Output beberapa arahan gema kemudiannya dihantar ke STDOUT dan dicetak ke skrin. Perintah exec kemudian menyebabkan apa sahaja yang berakhir di STDOUT dihantar ke fail myfile , dan akhirnya kami menggunakan arahan ubah hala ke STDERR dalam arahan gema, yang menyebabkan baris yang sepadan ditulis ke myerror fail.

Sebaik sahaja anda telah menguasai ini, anda akan dapat mengubah hala output ke tempat yang anda mahukan. Sekarang mari kita bincangkan tentang pengalihan masukan.

Mengubah hala input dalam skrip

Untuk mengubah hala input, anda boleh menggunakan teknik yang sama yang kami gunakan untuk mengubah hala output. Sebagai contoh, arahan exec membolehkan anda menjadikan fail sebagai sumber data untuk STDIN:

Exec 0< myfile
Perintah ini memberitahu shell bahawa sumber input mestilah myfile dan bukannya STDIN biasa. Mari lihat pengalihan masukan dalam tindakan:

#!/bin/bash exec 0< testfile count=1 while read line do echo "Line #$count: $line" count=$(($count + 1)) done
Inilah yang akan muncul pada skrin selepas menjalankan skrip.


Ubah hala input

Dalam artikel terdahulu, anda mempelajari cara menggunakan arahan baca untuk membaca input pengguna daripada papan kekunci. Jika anda mengubah hala input dengan menjadikan sumber data sebagai fail, maka arahan baca, apabila cuba membaca data daripada STDIN, akan membacanya daripada fail, dan bukan dari papan kekunci.

Sesetengah pentadbir Linux menggunakan pendekatan ini untuk membaca dan kemudian memproses fail log.

Mencipta ubah hala keluaran anda sendiri

Dengan mengubah hala input dan output dalam skrip, anda tidak terhad kepada tiga deskriptor fail standard. Seperti yang telah disebutkan, anda boleh mempunyai sehingga sembilan pemegang terbuka. Baki enam, bernombor 3 hingga 8, boleh digunakan untuk mengubah hala input atau output. Mana-mana daripada mereka boleh diberikan kepada fail dan digunakan dalam kod skrip.

Anda boleh menetapkan pemegang untuk mengeluarkan data menggunakan perintah exec:

#!/bin/bash exec 3>myfile echo "Ini harus dipaparkan pada skrin" echo "dan ini harus disimpan dalam fail" >&3 echo "Dan ini harus kembali pada skrin"
Selepas menjalankan skrip, sebahagian daripada output akan muncul pada skrin, bahagian - dalam fail dengan deskriptor 3.


Mengubah hala keluaran menggunakan pemegangnya sendiri

Mencipta Deskriptor Fail untuk Kemasukan Data

Anda boleh mengubah hala input dalam skrip dengan cara yang sama seperti anda mengubah hala output. Simpan STDIN dalam pemegang lain sebelum mengubah hala input.

Selepas selesai membaca fail, anda boleh memulihkan STDIN dan menggunakannya seperti biasa:

#!/bin/bash exec 6<&0 exec 0< myfile count=1 while read line do echo "Line #$count: $line" count=$(($count + 1)) done exec 0<&6 read -p "Are you done now? " answer case $answer in y) echo "Goodbye";; n) echo "Sorry, this is the end.";; esac
Mari cuba senarionya.


Ubah hala input

Dalam contoh ini, deskriptor fail 6 digunakan untuk menyimpan rujukan kepada STDIN. Kemudian pengalihan masukan dilakukan, fail menjadi sumber data untuk STDIN. Input kepada arahan baca kemudian datang daripada STDIN yang diubah hala, iaitu, daripada fail.

Selepas membaca fail, kami menetapkan semula STDIN dengan mengubah hala ke mengendalikan 6. Sekarang, untuk memastikan semuanya berfungsi dengan betul, skrip bertanyakan soalan kepada pengguna, menunggu input papan kekunci dan memproses perkara yang dimasukkan.

Menutup pemegang fail

Cangkang secara automatik menutup pemegang fail selepas skrip selesai. Walau bagaimanapun, dalam beberapa kes adalah perlu untuk menutup pemegang secara manual sebelum skrip selesai berjalan. Untuk menutup pemegang, ia mesti diubah hala ke &- . Ia kelihatan seperti ini:

#!/bin/bash exec 3> myfile echo "Ini adalah baris ujian data" >&3 exec 3>&- echo "Ini tidak akan berfungsi" >&3
Selepas melaksanakan skrip, kami akan menerima mesej ralat.


Percubaan untuk mengakses deskriptor fail tertutup

Masalahnya ialah kami cuba mengakses deskriptor yang tidak wujud.

Berhati-hati apabila menutup pemegang fail dalam skrip. Jika anda menghantar data ke fail, kemudian menutup pemegang, kemudian membukanya semula, shell akan menggantikan fail sedia ada dengan yang baru. Iaitu, semua yang ditulis sebelum ini ke fail ini akan hilang.

Mendapatkan maklumat tentang pemegang terbuka

Untuk mendapatkan senarai semua pemegang terbuka di Linux, anda boleh menggunakan perintah lsof. Pada banyak pengedaran, seperti Fedora, utiliti lsof terletak di /usr/sbin. Perintah ini agak berguna kerana ia memaparkan maklumat tentang setiap pemegang yang dibuka pada sistem. Ini termasuk apa yang dibuka oleh proses yang berjalan di latar belakang dan apa yang dibuka oleh pengguna log masuk.

Perintah ini mempunyai banyak kunci, mari kita lihat yang paling penting.

  • -p Membolehkan anda menentukan ID proses.
  • -d Membolehkan anda menentukan bilangan deskriptor yang anda ingin dapatkan maklumat.
Untuk mengetahui PID proses semasa, anda boleh menggunakan pembolehubah persekitaran khas $$, di mana shell menulis PID semasa.

Suis -a digunakan untuk melaksanakan operasi logik DAN pada hasil yang dikembalikan dengan menggunakan dua suis lain:

Lsof -a -p $$ -d 0,1,2

Memaparkan maklumat tentang pemegang terbuka

Jenis fail yang dikaitkan dengan STDIN, STDOUT dan STDERR ialah CHR (mod aksara). Memandangkan mereka semua menunjuk ke terminal, nama fail sepadan dengan nama peranti yang diberikan kepada terminal. Ketiga-tiga fail standard boleh dibaca dan boleh ditulis.

Mari kita lihat memanggil perintah lsof daripada skrip di mana, sebagai tambahan kepada yang standard, deskriptor lain dibuka:

#!/bin/bash exec 3> myfile1 exec 6> myfile2 exec 7< myfile3 lsof -a -p $$ -d 0,1,2,3,6,7
Inilah yang berlaku jika anda menjalankan skrip ini.


Lihat pemegang fail yang dibuka oleh skrip

Skrip membuka dua pemegang untuk output (3 dan 6) dan satu untuk input (7). Laluan ke fail yang digunakan untuk mengkonfigurasi deskriptor juga ditunjukkan.

Penindasan Output

Kadang-kadang anda perlu memastikan bahawa arahan dalam skrip, yang, sebagai contoh, boleh dilaksanakan sebagai proses latar belakang, tidak memaparkan apa-apa pada skrin. Untuk melakukan ini, anda boleh mengubah hala output ke /dev/null . Ini adalah sesuatu seperti "lubang hitam".

Berikut ialah contoh cara menyekat mesej ralat:

Ls -al badfile anotherfile 2> /dev/null
Pendekatan yang sama digunakan jika, sebagai contoh, anda perlu mengosongkan fail tanpa memadamnya:

Cat /dev/null > myfile

Keputusan

Hari ini anda belajar tentang cara input dan output berfungsi dalam skrip baris arahan. Kini anda tahu cara mengendalikan deskriptor fail, mencipta, melihat dan menutupnya serta mengetahui tentang mengalihkan aliran input, output dan ralat. Semua ini sangat penting dalam pembangunan skrip bash.

Lain kali kita akan bercakap tentang isyarat Linux, cara mengendalikannya dalam skrip, menjalankan kerja berjadual dan tugas latar belakang.

Pembaca yang dihormati! Bahan ini menyediakan asas untuk bekerja dengan aliran input, output dan ralat. Kami pasti bahawa di kalangan anda ada profesional yang boleh memberitahu anda tentang semua ini apa yang hanya datang dengan pengalaman. Jika ya, kami menyampaikan kepada anda.

Pengalihan semula biasanya dicapai dengan memasukkan aksara khas ">" antara arahan. Biasanya sintaks kelihatan seperti ini:

Perintah1 > fail1

melaksanakan arahan1, menulis output standard ke fail1.

Pasukan1< файл1

melaksanakan arahan1 menggunakan fail1 sebagai sumber input (bukan papan kekunci).

Pasukan1< файл1 >fail2

menggabungkan dua versi sebelumnya. Melaksanakan arahan1 dengan input daripada fail1 dan output kepada fail2

Penghantar

Saluran paip adalah keupayaan beberapa program untuk bekerja bersama, apabila output satu program pergi terus ke input yang lain tanpa menggunakan perantaraan. fail-fail sementara. Sintaks:

pasukan1 | pasukan2

Melaksanakan perintah1 menggunakan aliran keluarannya sebagai aliran input apabila melaksanakan perintah2, yang bersamaan dengan menggunakan dua ubah hala dan fail sementara:

Perintah1 > Perintah Fail Sementara2< ВременныйФайл rm ВременныйФайл

Contoh saluran paip arahan yang baik ialah menggabungkan gema dengan arahan lain untuk mencapai interaktiviti dalam persekitaran bukan interaktif, contohnya:

echo -e "Nama Pengguna\nKata Laluan" | ftp localhost

Ini memulakan klien yang menyambung ke localhost sebagai Nama Pengguna, tekan Enter dan kemudian masukkan kata laluan Kata laluan.

Ubah hala ke/daripada deskriptor fail standard

Dalam pasukan cangkerang UNIX, yang berasal dari cangkerang Bourne, dua langkah sebelumnya boleh diperbaiki dengan menentukan nombor (penerangan fail) sejurus sebelum aksara pengalihan. Nombor ini menunjukkan aliran yang digunakan untuk ubah hala. UNIX mempunyai aliran input/output standard berikut:

Cth:

Perintah1 2 > fail1

Dalam cengkerang arahan yang diperoleh daripada C Shell, mengikut peraturan sintaks, untuk menunjukkan aliran yang mana pengalihan dijalankan, anda perlu menambah aksara & selepas aksara pengalihan.

Selalunya aliran ralat standard digabungkan dengan aliran keluaran standard supaya ralat dan output program biasa boleh diproses bersama. Cth:

Cari / -name .profile> results.txt 2>&1

akan cuba mencari semua fail bernama .profile. Jika anda menjalankan arahan ini tanpa ubah hala, ia akan mengarahkan hasil carian ke , dan mesej ralat (contohnya, mengenai hak akses yang tidak mencukupi semasa cuba mencari dalam direktori yang dilindungi) ke . Secara lalai, peranan ini dilakukan oleh konsol. Jika output standard diarahkan ke fail hasil, maka ralat masih akan dihantar ke konsol. Untuk memastikan bahawa kedua-dua ralat dan hasil carian dihantar ke fail results.txt, ralat standard dan aliran output digabungkan menggunakan 2>&1 .

Menulis 2>&1 sebelum ini > tidak akan berfungsi kerana apabila jurubahasa membaca 2>&1 , ia belum tahu ke mana aliran keluaran standard dialihkan, jadi ralat dan aliran keluaran tidak akan digabungkan.

Jika hasil gabungan akan disalurkan ke input program lain, maka urutannya 2>&1 mesti berada di hadapan tanda penghantar. Cth:

Cari / -nama .profil 2>&1 | kurang

Borang arahan ringkas:

Perintah>fail2>&1

kelihatan seperti itu:

Perintah &> fail

Perintah>&fail

Rantai penghantar

Arahan ubah hala dan perpaipan boleh dirantai bersama untuk menghasilkan arahan yang lebih kompleks, contohnya:

ls | grep ".sh" | sort>shlist

Mendapat senarai kandungan direktori semasa, yang ditapis, meninggalkan hanya baris yang mengandungi ".sh", maka senarai yang ditapis ini diisih secara leksikal dan hasil akhir dimasukkan ke dalam fail shlist. Binaan jenis ini sering dijumpai dalam skrip shell UNIX.

Ubah hala kepada berbilang pin

Perintah standard boleh mengalihkan output arahan ke beberapa tempat sekaligus. Contoh:

Ls -lrt | fail tee1

mengarahkan output standard arahan ls -lrt(senarai fail) dalam konsol dan dalam fail1.

Ubah hala dengan tambah

DALAM shell arahan anda boleh mengubah hala ke fail yang dilampirkan pada penghujung. Dalam kes ini, maklumat yang disimpan dalam fail tidak akan dipadamkan, tetapi semua maklumat baru akan ditambahkan pada penghujung fail ini. Sintaks:

Perintah1>> fail1

Dokumen Terbenam

Sesetengah cangkerang, dan juga bahasa gunaan (PHP), Perl, membenarkan sintaks dokumen terbina dalam (lihat sintaks Heredoc), yang membolehkan anda mengarahkan aliran input daripada fail program itu sendiri, contohnya: cat « EOF Any teks diletakkan di sini, termasuk Simbol khas EOF

Tandatangan akhir penghujung dokumen terbenam EOF (nilai sewenang-wenangnya boleh digunakan, tetapi EOF sering digunakan - mengikut maksud) mesti bermula pada permulaan baris.