Ubah hala aliran keluaran. Ubah hala I/O standard dan ralat. Strim, saluran program dan ubah hala

Salah satu yang paling menarik dan topik yang berguna Untuk pentadbir sistem dan pengguna baharu yang baru mula memahami cara bekerja dengan terminal - ini adalah pengalihan strim input/output Linux. Ciri terminal ini membolehkan anda mengubah hala keluaran perintah ke fail, atau kandungan fail kepada input arahan, untuk menggabungkan arahan bersama-sama dan untuk membentuk saluran paip arahan.

Dalam artikel ini, kita akan melihat cara pengalihan strim I/O dilakukan di Linux, pengendali yang digunakan untuk ini dan di mana semua ini boleh digunakan.

Semua arahan yang kami laksanakan mengembalikan kami tiga jenis data:

  • Hasil arahan, biasanya data teks yang diminta oleh pengguna;
  • Mesej ralat - memaklumkan tentang proses pelaksanaan arahan dan keadaan tidak dijangka yang telah timbul;
  • Kod pemulangan ialah nombor yang membolehkan anda menilai sama ada program berfungsi dengan betul.

Di Linux, semua bahan dianggap fail, termasuk aliran input keluaran linux- fail. Setiap pengedaran mempunyai tiga fail aliran utama yang boleh digunakan oleh program, ini ditakrifkan oleh shell dan dikenal pasti dengan nombor deskriptor fail mereka:

  • STDIN atau 0- fail ini dikaitkan dengan papan kekunci dan kebanyakan arahan menerima data untuk berfungsi dari sini;
  • STDOUT atau 1- ini adalah output standard; program menghantar semua hasil kerjanya di sini. Ia dikaitkan dengan skrin, atau lebih tepat, dengan terminal di mana program sedang berjalan;
  • STDERR atau 2- semua mesej ralat adalah output ke fail ini.

Ubah hala I/O membolehkan anda menggantikan salah satu daripada fail ini dengan fail anda sendiri. Sebagai contoh, anda boleh memaksa atur cara untuk membaca data daripada fail masuk sistem fail, dan bukannya papan kekunci, anda juga boleh mengeluarkan ralat ke fail dan bukannya ke skrin, dsb. Semua ini dilakukan menggunakan simbol "<" Dan ">" .

Ubah hala output ke fail

Semuanya sangat mudah. Anda boleh mengubah hala output ke fail menggunakan simbol >. Sebagai contoh, mari kita simpan output arahan teratas:

atas -bn 5 > atas.log

Pilihan -b menyebabkan program berjalan dalam bukan interaktif mod kumpulan, dan n - mengulangi operasi lima kali untuk mendapatkan maklumat tentang semua proses. Sekarang mari kita lihat apa yang berlaku dengan kucing:

Simbol ">" menimpa maklumat daripada fail jika sudah ada sesuatu di sana. Untuk menambah data pada penggunaan akhir ">>" . Sebagai contoh, ubah hala output ke fail linux juga untuk bahagian atas:

atas -bn 5 >> atas.log

Secara lalai, deskriptor fail output standard digunakan untuk ubah hala. Tetapi anda boleh menentukan ini secara eksplisit. Perintah ini akan memberikan hasil yang sama:

atas -bn 5 1>atas.log

Ubah hala ralat ke fail

Untuk mengubah hala output ralat ke fail, anda perlu menyatakan secara eksplisit deskriptor fail yang akan anda halakan. Untuk ralat, ini adalah nombor 2. Contohnya, apabila cuba mendapatkan akses kepada direktori superuser, ls akan membuang ralat:

Anda boleh mengubah hala ralat standard ke fail seperti ini:

ls -l /root/ 2> ls-error.log
$ cat ls-error.log

Untuk menambah data pada penghujung fail, gunakan simbol yang sama:

ls -l /root/ 2>>ls-error.log

Ubah hala keluaran standard dan ralat ke fail

Anda juga boleh mengubah hala semua output, ralat dan output standard ke satu fail. Terdapat dua cara untuk melakukan ini. Yang pertama, yang lebih tua, adalah untuk melepasi kedua-dua pemegang:

ls -l /root/ >ls-error.log 2>&1

Pertama, output arahan ls akan dihantar ke fail ls-error.log menggunakan aksara ubah hala pertama. Kemudian semua ralat akan dihantar ke fail yang sama. Kaedah kedua adalah lebih mudah:

ls -l /root/ &> ls-error.log

Anda juga boleh menggunakan penambahan dan bukannya menulis semula:

ls -l /root/ &>> ls-error.log

Input standard daripada fail

Kebanyakan program, kecuali perkhidmatan, menerima data untuk kerja mereka melalui input standard. Secara lalai, input standard mengharapkan input daripada papan kekunci. Tetapi anda boleh memaksa program membaca data daripada fail menggunakan pengendali "<" :

kucing

Anda juga boleh mengubah hala keluaran ke fail dengan serta-merta. Sebagai contoh, mari susun semula senarai:

menyusun sort.output

Oleh itu, kami mengalihkan input/output ke linux dalam satu arahan.

Penggunaan terowong

Anda boleh bekerja bukan sahaja dengan fail, tetapi juga mengalihkan output satu arahan sebagai input yang lain. Ini sangat berguna untuk melaksanakan operasi yang kompleks. Sebagai contoh, mari kita paparkan lima fail yang diubah suai baru-baru ini:

ls -lt | kepala -n 5

Dengan utiliti xargs, anda boleh menggabungkan arahan supaya input standard diluluskan sebagai parameter. Sebagai contoh, mari salin satu fail ke beberapa folder:

ujian gema/tmp/ | xargs -n 1 cp -v testfile.sh

Di sini pilihan -n 1 menentukan bahawa hanya satu parameter harus dibekalkan bagi setiap arahan, dan pilihan -v untuk cp membolehkan maklumat terperinci tentang pergerakan dicetak. Satu lagi arahan berguna dalam kes sedemikian ialah tee. Ia membaca data daripada input standard dan menulis kepada output atau fail standard. Sebagai contoh:

echo "Ujian operasi Tee" | fail tee1

Dalam kombinasi dengan arahan lain, ini boleh digunakan untuk mencipta arahan berbilang arahan yang kompleks.

kesimpulan

Dalam artikel ini, kami membincangkan asas pengalihan strim I/O Linux. Sekarang anda tahu bagaimana untuk mengubah hala output ke fail linux atau output daripada fail. Ia sangat mudah dan mudah. Jika anda mempunyai sebarang soalan, tanya dalam komen!

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 perintah1 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 shell arahan UNIX, yang berkembang daripada cangkerang Bourne, boleh menambah baik pada dua langkah sebelumnya 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 diperolehi daripada C Shell, mengikut peraturan sintaks, untuk menunjukkan aliran yang mana pengalihan dibuat, anda perlu menambah aksara & selepas aksara pengalihan.

Selalunya aliran ralat standard digabungkan dengan aliran keluaran standard supaya ralat dan output program biasa boleh dikendalikan 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 di 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

Arahan standard boleh mengubah hala 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 dan menambahkannya ke 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.

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 nombor 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 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 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 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 data daripada standard baris input, yang 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

Tiga arah I/O didedikasikan - input standard, output dan aliran ralat ( stdin, stdout, stderr ). Secara lalai, ketiga-tiga utas dikaitkan dengan terminal. Dalam kes ini, program memaparkan semua mesejnya, termasuk ralat, ke terminal. Shell membolehkan anda mengubah hala strim standard ini, menetapkan I/O dan pengumpulan benang.

Mengubah hala strim I/O.

>fail Mengubah hala output standard ke fail fail

>>fail -Ubah hala output standard ke fail fail dengan menambah pada akhir fail.

-mendapatkan input standard daripada fail fail.

prog1 | prog2 -Pindahkan aliran keluaran program prog1 ke aliran input program prog2.

n>fail fail.

n>>fail -Ubah hala strim standard dengan deskriptor n ke fail fail dengan menambah pada akhir fail.

n>&m -Menggabungkan benang dengan pemegang n Dan m .

$ prog1 >/dev/null 2>&1

/dev/null ialah peranti pseudo yang memusnahkan aliran yang diarahkan ke dalamnya.

Melewati aliran keluaran satu program ke aliran input yang lain sering digunakan. Sebagai contoh:

$ gzip -d archive.tar.gz | tar –xf

Di sinilah fail dibuka archive.tar.gz , dibungkus oleh dua pengarkib. Aliran keluaran daripada utiliti gzip dihantar ke aliran input kepada utiliti tar . Begitu juga, operasi yang sama boleh dilakukan dengan cara lain:

$ gzip -d archive.tar.gz

$ tar -xf archive.tar

Kerana bahasa Bourne Shell ialah bahasa pengaturcaraan prosedur; seperti bahasa lain yang serupa, ia mempunyai operator yang membolehkan anda mengawal urutan pelaksanaan arahan. Pengendali yang diperlukan adalah untuk memeriksa syarat tertentu, bergantung pada pemenuhan yang mana perjalanan program selanjutnya ditentukan. Pengendali sedemikian adalah arahan ujian. Perintah ini menyemak bahawa beberapa syarat dipenuhi. Pasukan ujian Terdapat dua pilihan panggilan:

keadaan ujian

[ syarat ]

Perlu diingatkan bahawa mesti ada ruang antara kurungan dan keadaan, jika tidak Shell tidak akan mengenali "[" sebagai arahan ujian . Apabila berjaya disiapkan ujian pulangan "0" .

Syarat untuk menyemak fail:

-f fail Fail "fail" ialah fail biasa.

-d fail Fail " fail" ialah sebuah direktori.
-c fail Fail "fail" adalah fail khas.
-r fail Fail "fail" telah membaca kebenaran.

-w fail Fail "fail" mempunyai kebenaran menulis.

-x fail Fail "fail" mempunyai kebenaran untuk melaksanakan.

-s fail Fail "fail" tidak kosong.

Syarat untuk menyemak rentetan:

rentetan1=rentetan2 rentetan rentetan1 Dan rentetan2 padankan.

string1!=string2 rentetan rentetan1 Dan rentetan2 tidak sepadan.

-n rentetan1 Talian rentetan1 wujud.

-z rentetan1 Talian rentetan1 tidak wujud.

Syarat untuk operasi dengan integer:

x -eq y x sama dengan y

x -ne y x tidak sama dengan y

x -gt y x lebih besar daripada y

x -ge y x lebih besar daripada atau sama dengan y

x -lt y x kurang daripada y

x -le y x kurang daripada atau sama dengan y

Dalam kes ini arahan ujian merawat rentetan sama seperti integer. Nilai sifar rentetan kosong juga sepadan.

Operasi logik dalam konteks ujian

! (bukan) Logik "TIDAK"

-o (atau) Logik "ATAU"

-a (dan) Logik "DAN"

Operator bersyarat "jika"

Borang am guna pengendali bersyarat jika diwakili seperti berikut:

jika<условие>

kemudian<список команд>

[elif<условие>

kemudian<список> ]

Ungkapan dalam kurungan segi empat sama adalah pilihan. Itu. kita boleh bayangkan pengubahsuaian "dicincang" yang paling biasa bagi pengendali bersyarat:

jika<условие>

kemudian<список команд>

Dalam kes ini, jika <условие> selesai (kod pelengkap 0) kemudian dilaksanakan <список команд>. Jika tidak <список команд> dilangkau.

Operator pemilihan kes

Secara umum, sintaks pengendali ialah kes seperti berikut:

kes<строка>dalam

Templat 1)

........

Templat2)

........

........

Maknanya <строка> berbanding dengan templat, mengikut urutan. Jika padanan ditemui, maka arahan dalam bahagian yang sepadan akan dilaksanakan. Perlu diingatkan bahawa templat membenarkan penggunaan topeng. Jika tiada padanan ditemui, maka arahan daripada bahagian dengan corak "*" akan dilaksanakan (serupa dengan lalai pemilih suis V DENGAN ).

Sebagai contoh, berikut ialah sekeping skrip permulaan BSD UNIX . Berikut adalah pembolehubah (inetd_enable dan inetd_flags) diperoleh daripada fail lain ( rc.conf).

. /etc/rc.conf

kes ($inetd_enable) dalam

)

jika [ -x /usr/sbin/inetd ]; kemudian

/usr/sbin/inetd $inetd_flags

fi

;;

esac

Operator gelung dengan penghitungan untuk

Sintaks operator untuk

untuk<имя>

<список команд>

Serpihan yang diserlahkan dalam kurungan segi empat sama mungkin tiada. Operator untuk memastikan bahawa gelung dilaksanakan seberapa banyak kali terdapat perkataan dalam senarai nilai. Dalam kes ini, pembolehubah <имя> mengambil secara berurutan makna perkataan daripada senarai. Senarai itu sendiri boleh dibentuk daripada output arahan lain. Jika senarai itu tiada, maka <имя> menerima nilai yang diluluskan sebagai parameter kedudukan kepada skrip.

Penyataan gelung dengan keadaan benar sementara

Sintaks operator sementara secara umum ia mempunyai struktur berikut:

sementara<условие>

<список команд>

Operator sementara adalah lebih baik apabila senarai nilai parameter tidak diketahui terlebih dahulu. Senarai arahan akan dilaksanakan dalam gelung selagi syarat itu kekal benar. Apabila anda mula-mula memasuki gelung, syarat mestilah benar.

Penyataan gelung dengan keadaan palsu sehingga

Sintaks operator sehingga secara umum ia mempunyai struktur berikut:

sehingga<условие>

<список команд>

Senarai arahan akan dilaksanakan dalam gelung selagi syarat kekal palsu. Kali pertama anda memasuki gelung, syarat itu tidak sepatutnya benar. Perlu diingatkan bahawa keadaan gelung diperiksa untuk kepalsuan selepas setiap, termasuk. dan perintah pertama yang dilaksanakan dalam gelung.

Perintah Asas OS UNIX untuk bekerja dengan fail

1. Pasukan pwd.

Sintaks: pwd .

Penerangan: Perintah memaparkan nama direktori semasa untuk shell yang sedang berjalan.

Latihan 1.

Gunakan arahan pwd untuk menentukan direktori rumah anda.

Cerminkan pasukan dan hasil kerjanya dalam laporan.

2. Pasukan lelaki.

Sintaks: lelaki Nama.

Nama ialah nama perintah atau utiliti yang kami minati, panggilan sistem, fungsi perpustakaan, fail.

Penerangan : MANUAL UNIX - manual sistem pengendalian UNIX. Maklumat dari sana boleh didapati di mod interaktif menggunakan utiliti lelaki .

Tugasan 2.

Gunakan utiliti man untuk mencari maklumat tentang arahan pwd.

Tulis maklumat ringkas tentang pasukan dalam laporan (dalam bahasa Rusia).

3. Pasukan CD.

Sintaks: CD nama_direktori.

Penerangan: Ini ialah arahan untuk menukar direktori semasa. DirectoryName ialah nama penuh atau relatif bagi direktori yang anda ingin jadikan semasa.

CD tanpa parameter yang semasa akan membuat direktori rumah anda.

Tugasan 3.

Jadikan direktori semasa satu tahap lebih tinggi. Semak ia, kemudian kembali ke direktori rumah anda. Semak perubahan direktori.

Pelaksanaan arahan yang lengkap akan ditunjukkan dalam laporan.

4. Pasukan ls.

Sintaks: ls nama_direktori

Penerangan: arahan untuk melihat kandungan direktori yang ditentukan.

ls tanpa parameter, mencetak senarai fail daripada direktori semasa.

Senarai yang terhasil tidak akan termasuk fail yang namanya bermula dengan simbol “ . ” - fail yang dicipta oleh pelbagai program sistem untuk tujuan anda sendiri. Tengok senarai penuh fail boleh ditentukan dalam arahan ls kunci “-a”,

mereka. ls -adirectory_name

Kebenaran fail

Dengan setiap fail masuk OS UNIX dikaitkan dengan perkataan 12-bit yang dipanggil "kebenaran" kepada fail.

9 bit bawah perkataan ini digabungkan menjadi tiga kumpulan tiga bit; Setiap kumpulan menentukan hak akses untuk pemilik fail, untuk kumpulannya dan untuk semua pengguna lain. Tiga bit dalam setiap kumpulan bertanggungjawab untuk hak untuk membaca, bertanya dan menggunakan fail.

Untuk mengetahui hak akses kepada fail tertentu, anda boleh menggunakan arahan

, Sebagai contoh:

> ls -l /bin/cat

Sekumpulan aksara yang terletak pada permulaan baris -rwxr-xr-x menunjukkan jenis fail (aksara pertama; tanda tolak bermakna kita sedang berurusan dengan fail biasa, huruf d bermaksud direktori, dsb.) dan hak akses, masing-masing, untuk pemilik (dalam dalam kes ini rwx , iaitu baca, tulis dan laksana), kumpulan dan semua orang lain (dalam kes ini r-x , iaitu tiada hak menulis). Jadi fail /bin/cat boleh dibaca dan dilaksanakan oleh mana-mana pengguna, tetapi hanya pengguna boleh mengubah suainya akar (iaitu pentadbir).

Anda boleh menulis perkataan kebenaran fail sebagai nombor perlapanan(3 aksara - digit perlapanan), tiga digit (pemilik, kumpulan, pengguna lain) setiap aksara dalam nombor perlapanan tiga digit ini dibentuk sebagai jumlah hak: 4 - hak baca, 2 - hak tulis, 1 - penggunaan ( daripada triad binari): (111) 2 =2 0 +2 1 +2 2 =(1+2+4) 10 .

Sebagai contoh, 7 = 1 + 2 + 4 Þ rwx kanan

4 2 1

6 = 0 + 2+ 4 Þ kanan rw- -

4 2 0

Dalam nombor tiga digit, nyatakan hak: 744 Semua hak ditakrifkan untuk pemilik, baca sahaja untuk kumpulan dan baca sahaja untuk pengguna lain.

Untuk menggunakan kebenaran fail, gunakan arahan chmod , yang membolehkan anda menentukan kebenaran baharu sebagai nombor perlapanan, contohnya:

$ chmod 744 filel.c.

Tugasan 4.

a) Untuk menerima maklumat lengkap mengenai arahan ls, gunakan utiliti lelaki. Ubah hala output arahan ke beberapa fail teks.

b) Lihat kandungan penuh direktori semasa dan ubah hala output ini ke fail teks juga.

c) Menggunakan arahan ls -l<имя_файла> Cetak maklumat tentang hak akses kepada fail teks yang anda gunakan dalam langkah 4b, kemudian ubah hala maklumat ini ke fail teks yang sama. Terangkan kesimpulan anda.

5. Pasukan kucing.

Ubah hala I/O.

Untuk melihat kandungan fail teks kecil pada skrin, anda boleh menggunakan arahan:

kucing nama fail

Perhatian! Jangan cuba melihat kandungan direktori dan fail binari dengan cara ini.

Fail ujian yang besar boleh dilihat dengan mudah oleh pasukan lebih (untuk penerangan penggunaan, lihat MANUAL UNIX ). Mengapa arahan menyusahkan di sini? kucing ?

Dalam satu pasukan kucing Anda boleh menentukan berbilang nama fail:

fail kucing1 fail 2 ... fail N

dalam kes ini, kandungan semua fail berturut-turut akan dipaparkan pada skrin.

Anda boleh mengubah hala output ke fail:

fail kucing 1 fail 2 > fail_hasil

Mengalihkan output daripada output standard (skrin) ke fail adalah standard untuk semua arahan. Anda boleh mengubah hala input standard (dari papan kekunci), sebagai contoh, mengambil data untuk program daripada fail, menggunakan tanda "<”.

kucing > new_file - akan mencipta fail teks baharu dengan kandungan yang anda masukkan daripada papan kekunci.

Hentikan proses kemasukan data -

Tugasan 5.

Cipta fail teks baharu menggunakan kucing dan lihat kandungannya. Ubah hala output dari strim standard ke fail lain, nama yang anda masukkan dari papan kekunci, dan sahkan bahawa operasi telah dilakukan dengan betul.

6. Arahan paling mudah untuk bekerja dengan fail : cp, rm, mkdir, mv

Untuk membuat direktori baharu gunakan arahan:

mkdir nama_direktori

Untuk menyalin kandungan satu fail ke yang lain, gunakan arahan:

cp fail_sumber_fail_destinasi.

Pasukan

cp fail 1 fail 2…. fail N direktori destinasi

berfungsi untuk menyalin fail atau fail ke direktori yang sedia ada dengan nama destination_directory di bawah nama mereka sendiri. Daripada nama fail yang disalin, anda boleh menggunakan templatnya. Corak ditentukan menggunakan aksara meta:

* - sepadan dengan semua rentetan aksara, termasuk yang kosong.

Semua watak tunggal

[...] - sepadan dengan mana-mana huruf yang disertakan dalam kurungan. Sepasang aksara yang dipisahkan oleh tanda tolak menentukan julat aksara.

Pasukan

cp-r dir_source dir_destination

berfungsi untuk menyalin rekursif satu direktori (source_dir) ke direktori baharu (destination_dir).

Daripada nama dalam arahan salinan, templat mereka boleh digunakan.

Pasukan

rm fail 1 fail 2…. fail N

membolehkan anda memadam 1 atau lebih fail biasa daripada direktori semasa.

Kad bebas boleh digunakan dan bukannya nama. Jika anda ingin memadam satu atau lebih direktori bersama-sama dengan kandungannya (pemadaman rekursif) dalam arahan rm guna kunci -r

Rm-r dir 1 dir 2

Namakan semula arahan:

mv nama_sumber nama_tujuan

Fail bernama source_name dinamakan semula kepada fail bernama destination_name. Dalam kes ini, sebelum melaksanakan arahan, fail bernama destination_name mestilah tidak wujud.

Tugasan 6.

Buat direktori baharu di dalam direktori rumah anda. Susun fail ujian kecil di sana dengan dua baris kandungan:

“Saya sedang belajar cara bekerja dalam OS UNIX

Saya akan mengatur skrip."

Salin kandungan fail ini ke yang lain dengan nama yang sama, tetapi dalam direktori /home. Alih keluar fail asal yang dibuat daripada direktori anda jika salinan berjaya. Semak kandungan direktori dan fail yang digunakan.

Tugasan 7.

1). Sebaik sahaja anda telah menguasai bekerja secara interaktif dengan arahan UNIX OS yang paling mudah, gunakan editor Kwriter untuk mencipta skrip dengan skrip yang sepadan dengan pelaksanaan berurutan:

Tugasan 3,

Tugasan 4B, 4B,

Tugasan 5,

Tugasan 6.

Dalam tugasan 6, jangan lupa untuk menyemak secara pemrograman sama ada penyalinan fail berjaya, dipaparkan mesej teks dan kandungan direktori yang sepadan.

Ia adalah perlu bahawa dalam fail kelompok pengeluaran permintaan yang kompeten untuk input data dari papan kekunci telah dianjurkan menggunakan arahan: $ echo - n "teks permintaan".

2). Simpan skrip dengan nama Myscript1, jalankan dengan arahan

sh Myscript1

Masukkan data yang diminta dan semak keputusan.

3). Susun laporan tentang kerja makmal yang telah siap, yang sepatutnya mencerminkan kerja anda dalam mod interaktif dan dengan skrip, termasuk teks skrip (dengan ulasan) dan hasil yang diperoleh pada skrin dan dalam fail.

Panggilan sistem getuid dan getpid

Ketahui pengecam pengguna yang melancarkan program untuk pelaksanaan - UID dan ID kumpulan yang dimilikinya ,-GID mungkin menggunakan panggilan sistem getuid() dan getpid() dengan menerapkannya dalam program ini.

Prototaip panggilan sistem:

#termasuk

#termasuk

uid_t getuid(void);

gid_t getgid(void);

Tugasan 8.

Tulis, susun dan jalankan program yang mencetak ID pengguna dan ID kumpulan pengguna yang menjalankan program.

Sertakan program dengan keputusan dalam laporan.

Soalan kawalan

1. Konsep fail dalam OS UNIX . Apa dah jadi direktori rumah?

2. Apakah cara pengelompokan perintah wujud? Shell -jurubahasa? memberikan contoh penggunaan.

3. Bagaimanakah I/O diubah hala?

4. Apakah saluran paip arahan? beri contoh.

5. Dengan cara Shell melakukan operasi aritmetik pada Shell -pembolehubah?

6. Apakah peraturan untuk menjana nama fail?

7. Bagaimanakah penggantian arahan dilakukan?

8. Bagaimana untuk mentafsir rentetan cmd1&cmd2& ?

9. Bagaimana untuk mentafsir rentetan cmd1 && cmd2 & ?

10. Bagaimana untuk mentafsir rentetan cmd1 || cmd2& ?

11. Seperti dalam UNIX Adakah kebenaran fail ditakrifkan? Apakah arahan yang boleh anda gunakan untuk melihatnya untuk fail tertentu?

12. Bagaimana untuk menentukan pengecam pengguna yang melancarkan program dan pengecam kumpulannya?

Kerja makmal № 3.

Proses dalam sistem pengendalian UNIX.

Matlamat kerja

Belajar untuk mencipta proses dan menguasai mengubah konteks pengguna proses menggunakan panggilan sistem yang digunakan dalam atur cara dalam bahasa DENGAN, V OS UNIX.

1. Kaji organisasi proses dalam UNIX : konsep proses, konteks proses, kitaran hidup proses, pengenalan proses, struktur hierarki proses. Tulis kepada DENGAN dan nyahpepijat atur cara mengikut tugasan 1.

2. Biasakan diri anda dengan mencipta proses dalam UNIX , dengan organisasi penyiapan proses. Tulis dan nyahpepijat atur cara (language DENGAN ) selaras dengan Tugasan 2, masukkannya dalam laporan.

3. Terokai parameter fungsi utama() dalam bahasa DENGAN , Pembolehubah Persekitaran dan hujah baris arahan. Tulis program dalam bahasa DENGAN selaras dengan Tugasan 3, nyahpepijat dan masukkannya dalam laporan bersama-sama dengan hasilnya.

4. Terokai keluarga fungsi untuk mengatur panggilan sistem exec().

5. Tulis program dalam bahasa DENGAN mengikut versi Tugasan 4 yang diberikan oleh guru, nyahpepijat program dan menunjukkan hasil yang diperoleh kepada guru. Sertakan program dengan keputusan dalam laporan.

6. Mempertahankan hasil kerja kepada guru dengan menjawab soalan ujian.

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 заменяет дескриптор файла стандартного ввода на тот, который указан в команде. Система читает файл и обрабатывает данные так, будто они введены с клавиатуры.

banyak arahan bash terima input daripada STDIN jika baris arahan tidak menyatakan fail dari mana data harus diambil. Sebagai contoh, ini 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 menambahkannya 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.


Cuba untuk mengakses fail yang tidak wujud

Ralat dijana apabila 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 dinyatakan, 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. Kini, 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 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. Kesemua tiga fail standard tersedia untuk membaca dan menulis.

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.