Asas cangkang. Asas pengaturcaraan dalam shell arahan shell. Faedah Barisan Perintah

Apakah cangkerang dan mengapa ia diperlukan?

Cangkang perintah dalam mana-mana sistem seperti unix, yang termasuk GNU/Linux, ialah program biasa, dilancarkan dalam konsol teks (yang digunakan semakin kurang) dan dalam persekitaran grafik - dalam tetingkap emulator terminal, tersedia pada mana-mana sistem Linux.

Tugasnya adalah mudah dan jelas: menerima baris (atau baris) input, menghuraikannya dan, berdasarkan hasil analisis ini, bertindak balas dengan sewajarnya - laksanakan arahan, jalankan program, paparkan mesej diagnostik, dsb.

Dalam hampir semua pengedaran Linux, pengguna diberikan arahan arahan secara lalai. bash shell(Bourne Again SHell ialah satu lagi cangkang Bourne; Steve Bourne ialah pengarang cangkerang arahan pertama dalam Unix - sh). Malah, ia telah menjadi standard tidak rasmi, dan peningkatannya kefungsian berterusan secara berterusan. Terdapat cengkerang arahan lain - tcsh ( Versi C-shell), ksh (Korn Shell), zsh, dsb. – masing-masing mempunyai kelebihan dan kekurangannya sendiri, serta kumpulan peminatnya sendiri. Walau bagaimanapun, bash lebih biasa kepada pelbagai pengguna dengan tahap pengalaman yang berbeza, itulah sebabnya saya memilihnya. Perlu juga diperhatikan bahawa tidak kira apa keupayaan yang dimiliki oleh pelbagai cangkang, semuanya serasi dengan nenek moyang ideologi mereka - Bourn Shell (sh). Dalam erti kata lain, skrip yang ditulis untuk sh akan berfungsi dengan betul dalam mana-mana shell moden (sebaliknya biasanya tidak benar).

Faedah Barisan Perintah

Persoalannya mungkin timbul: mengapa bersusah payah dengan baris arahan jika terdapat antara muka grafik yang mudah dan cantik? Terdapat banyak sebab untuk ini. Pertama, tidak semua operasi adalah lebih mudah atau lebih pantas untuk digunakan GUI. Kedua, setiap program mengikut prinsip asas sistem Unix: lakukan dengan jelas kerja tertentu dan lakukan dengan baik. Dalam erti kata lain, anda sentiasa memahami perkara yang berlaku apabila anda menjalankan utiliti tertentu (jika ada sesuatu yang tidak jelas sepenuhnya, anda harus merujuk kepada manual lelaki). Ketiga, dengan menguasai arahan, mencuba kombinasi dan gabungan parameter mereka, pengguna mengkaji sistem, memperoleh nilai pengalaman praktikal. Anda mendapat akses kepada ini alat yang berkesan, seperti saluran paip yang membolehkan anda mengatur rangkaian perintah untuk pemprosesan data, cara mengalihkan input/output, dan sebagai tambahan, anda boleh memprogramkan secara terus dalam shell arahan. Mungkin ia patut memikirkan pengaturcaraan dengan lebih terperinci, terutamanya kerana banyak skrip sistem dalam Linux (contohnya, skrip untuk melancarkan perkhidmatan sistem) ditulis untuk shell.

Command shell sebagai bahasa pengaturcaraan

Jadi, shell arahan boleh dianggap sebagai bahasa pengaturcaraan dan sebagai persekitaran perisian pelaksanaan secara serentak. Sudah tentu, bahasa ini tidak disusun, tetapi ditafsirkan. Ia membenarkan penggunaan pembolehubah: sistem atau sendiri. Urutan pelaksanaan arahan program diubah menggunakan konstruk pemeriksaan keadaan dan memilih pilihan yang sesuai: if-then-else dan case. Sementara, sehingga, dan untuk gelung membolehkan anda mengautomasikan tindakan berulang. Adalah mungkin untuk menggabungkan kumpulan arahan ke dalam blok logik. Anda juga boleh menulis fungsi sebenar yang menghantar parameter kepada mereka. Oleh itu, semua tanda dan ciri bahasa pengaturcaraan lengkap tersedia. Mari cuba dapatkan manfaat berganda daripada ini - bersama-sama dengan mempelajari asas pengaturcaraan, kami akan mengautomasikan kerja harian kami.

Hai dunia! Sistem sandaran mudah

Mengenai keperluan untuk biasa Salinan simpanan Semua orang tahu data itu, tetapi pengguna tidak pernah mempunyai masa yang cukup untuk operasi yang membosankan ini. Penyelesaiannya mudah - atur penciptaan automatik salinan sandaran. Ini akan menjadi tugas pengaturcaraan shell pertama kami.

#!/bin/bash # # Sandarkan direktori dan fail daripada direktori rumah # Skrip kelompok ini boleh dijalankan secara automatik menggunakan cron # cd $HOME jika [ ! -d archives ] kemudian mkdir archives fi cur_date=`date +%Y%m%d%H%M` jika [ $# -eq 0 ] ; kemudian tar czf archive$(cur_date).tar.gz projects bin else tar czf archive$(cur_date).tar.gz $* fi jika [ $? = 0 ] ; kemudian mv archive$(cur_date).tar.gz $HOME/archives echo "$cur_date – Backup completed successfully." else echo "$cur_date - ERROR semasa sandaran." fi

Sebarang skrip arahan (skrip ialah skrip, kerana program shell perintah dipanggil) bermula dengan baris pengecam, di mana penterjemah arahan dinyatakan secara eksplisit, menunjukkan laluan penuh kepadanya. Laluan penuh ialah penyenaraian berurutan semua direktori, bermula dari akar, yang mesti dimasukkan untuk sampai ke fail sasaran, dan, sudah tentu, nama fail ini. Merakam laluan penuh adalah sangat penting untuk mengenal pasti secara unik setiap fail dalam hierarki sistem fail.

Empat baris komen menyusul. Sebaik sahaja cangkerang menemui aksara "#", ia menganggap semua aksara berikutnya sebagai ulasan dan mengabaikannya sepenuhnya sehingga tamat talian semasa. Oleh itu, anda boleh memulakan komen bukan dari awal baris, tetapi mengiringinya dengan beberapa arahan.

Selepas komen ada baris kosong. Ia tidak bermakna kepada shell arahan, dan tiada tindakan diambil. Dalam senario baris kosong biasanya dimasukkan untuk menjadikan kod program lebih mudah dibaca.

Kami akhirnya sampai ke pasukan "sebenar" pertama. Ia membolehkan anda menukar direktori (Tukar Direktori), i.e. beralih dari direktori semasa ke direktori lain yang dihantar ke arahan sebagai hujah. Dalam kebanyakan kes, direktori sasaran dinyatakan secara eksplisit, sebagai contoh, projek cd /tmp atau cd, tetapi dalam kes kami, pembolehubah sistem yang dipratakrif HOME digunakan - ia mengandungi laluan penuh ke direktori rumah pengguna semasa di bawah namanya. skrip arahan sedang dilaksanakan. Ini menghapuskan keperluan untuk membuat perubahan kod setiap kali kami menukar pengguna, kerana arahan itu mengembalikan semua orang ke direktori peribadi mereka. Tanda dolar "$" di hadapan nama pembolehubah bermakna anda perlu mengekstrak nilai yang terkandung dalam pembolehubah itu dan menggantikannya sebagai ganti namanya pada baris arahan. Perlu diingatkan terutamanya bahawa dalam bahasa arahan cangkerang kes surat adalah penting, i.e. HOME, Home dan home adalah tiga pembolehubah berbeza. Dengan persetujuan, dalam surat huruf besar Nama pembolehubah sistem ditunjukkan: HOME, PATH, EDITOR, dsb. Konvensyen ini tidak menghalang pengguna daripada mencipta pembolehubah mereka sendiri dengan nama daripada huruf besar, tetapi mengapa merumitkan hidup anda dengan melanggar norma dan peraturan yang diterima umum? Ia juga tidak disyorkan untuk menukar nilai pembolehubah sistem melainkan benar-benar perlu. Secara umum, kami mengikut peraturan mudah: kami menggunakan pembolehubah sistem untuk tujuan baca sahaja, dan jika kami memerlukan sendiri, kami menulis namanya dalam huruf kecil.

Perintah pertama kami boleh ditulis dengan lebih ringkas:

cd ~

Di sini simbol "~" juga bermaksud direktori rumah pengguna semasa. Veteran baris arahan diungkapkan dengan lebih ringkas lagi:

CD

Ideanya ialah apabila arahan cd tidak diberikan hujah, ia berubah kepada direktori rumah.

Seterusnya ialah reka bentuk perisian klasik untuk menyemak keadaan dan membuat keputusan yang sesuai. Skim umum Adakah ini:

jika<условие>kemudian<одна или несколько команд>fi

Perkataan terakhir binaan (jika dalam susunan terbalik) bertindak sebagai kurungan penutup, i.e. sempadan senarai arahan yang dilaksanakan apabila keadaan adalah benar. Kehadiran fi adalah wajib, walaupun hanya ada satu pasukan dalam senarai.

Untuk menyemak keadaan, sebagai peraturan, perintah ujian atau bentuk tatatanda alternatifnya dalam kurungan segi empat sama digunakan. Dengan kata lain, rekod

jika [! -d arkib ] jika ujian ! -d arkib

benar-benar setara. Saya lebih suka kurungan segi empat sama kerana ia lebih jelas mentakrifkan sempadan keadaan yang sedang diuji. Kedua-dua kurungan kanan dan kiri mesti dipisahkan daripada syarat dengan ruang.

Kriteria untuk menyemak keadaan ditentukan oleh pelbagai bendera. Perintah ujian mengiktiraf senarai yang sangat besar daripada mereka. Dalam contoh kami, bendera -d digunakan, yang membolehkan kami menyemak sama ada nama yang dinyatakan selepas bendera sepadan dengan direktori sebenar. Bendera berikut paling kerap digunakan apabila bekerja dengan fail:

F – adakah ia wujud fail biasa dengan nama yang diberikan;

R – sama ada fail yang ditentukan mempunyai hak untuk membaca daripadanya;

W – sama ada fail yang ditentukan mempunyai hak untuk menulis kepadanya;

X – sama ada fail yang ditentukan mempunyai hak untuk melaksanakannya;

S – sama ada fail yang ditentukan mempunyai saiz bukan sifar.

Dalam kes kami, keadaan didahului oleh Tanda seru, menandakan operasi penafian logik, jadi makna keadaan yang diuji menjadi bertentangan sepenuhnya. Mari cuba tuliskan maksud arahan ini dalam bahasa Rusia biasa:

jika [! -d archives ] Jika direktori arkib tidak wujud (dalam direktori semasa), kemudian mula melaksanakan blok arahan: mkdir archives mencipta direktori arkib (dalam direktori semasa) fi selesai melaksanakan blok arahan.

Seperti yang anda lihat, semuanya ternyata tidak begitu rumit. Dengan sedikit latihan, anda boleh membaca dan mencipta sendiri reka bentuk yang serupa dengan mudah. Perintah penciptaan direktori sangat jelas sehingga tiada penjelasan lanjut diperlukan.

Pada baris seterusnya kami mencipta pembolehubah tempatan kami sendiri, cur_date. Dalam kebanyakan kes, pembolehubah dicipta dengan hanya memberikan nilai tertentu, sebagai contoh:

ten=10 string="Ini adalah baris teks"

Tetapi dalam contoh kami, helah kecil digunakan. Sila ambil perhatian bahawa selepas tanda sama - simbol tugasan - arahan ditulis dalam petikan belakang. Bentuk tatatanda ini membolehkan anda menetapkan kepada pembolehubah bukan rentetan itu sendiri, tetapi hasil pelaksanaannya. Berikut ialah output arahan tarikh yang kembali tarikh semasa dan masa dalam format yang ditentukan oleh senarai parameter:

%Y – tahun semasa dalam bentuk penuh, i.e. daripada empat digit (contohnya, 2009);

%m – nombor bulan semasa (contohnya, 09 – untuk September);

%d – nombor hari semasa;

%H – jam semasa dalam format 24 jam;

%M – minit semasa.

Oleh itu, jika anda menjalankan arahan

cur_date=`tarikh +%Y%m%d%H%M`

pada 10 September 2009 pada 22:45, pembolehubah cur_date akan diberikan nilai rentetan "200909102245". Tujuan helah ini adalah untuk mencipta nama yang unik dan tidak berulang untuk fail arkib. Jika anda berhasrat untuk menjalankan beberapa contoh program dalam masa satu minit, anda boleh menambah baik keunikan nama dengan menambah saat semasa. Bagaimana? Kaji manual utiliti tarikh (tarikh lelaki) - tidak ada yang rumit mengenainya.

Sebelum kita mula membuat fail arkib, kita perlu menentukan direktori mana yang akan kita simpan di dalamnya. Untuk fleksibiliti yang lebih besar, kami boleh menentukan set direktori untuk diarkibkan secara lalai, tetapi menyediakan keupayaan untuk menggantikan set ini dengan senarai direktori yang diluluskan sebagai hujah kepada skrip arahan kami. Untuk tujuan ini, pembolehubah shell arahan khas digunakan: $# – bilangan parameter yang dihantar ke skrip dan $* – semua parameter diluluskan, ditulis dalam format satu baris.

jika [ $# -eq 0 ] ; kemudian

Semak syarat "jika bilangan parameter yang diluluskan adalah sifar", kemudian laksanakan arahan berikut. Ambil perhatian bahawa kata kunci kemudian boleh ditulis pada baris syarat, dipisahkan daripada ungkapan bersyarat dengan koma bertitik.

tar czf archive$(cur_date).tar.gz projects bin

Perintah untuk mencipta fail arkib dan memampatkan fail ini. Utiliti tar itu sendiri tidak melakukan pemampatan, tetapi hanya mengumpul segala-galanya fail yang ditentukan dan direktori ke dalam satu fail tar. Bendera pertama dimaksudkan untuk ini - c (buat). Mampatan dilakukan oleh program luaran - di sini ia adalah gzip, dipanggil oleh bendera kedua - z. Jika sistem anda mempunyai lebih daripada program yang berkesan bzip2, anda boleh memanfaatkannya dengan menukar arahan seperti berikut:

tar cjf archive$(cur_date).tar.bz2 projects bin

Bendera ketiga f menunjukkan bahawa yang berikut ialah nama fail arkib, jadi ia sentiasa yang terakhir dalam senarai bendera. Ambil perhatian bahawa apabila menggantikan, nama pembolehubah disertakan pendakap gigi. Ini dilakukan untuk menyerlahkan pembolehubah secara eksplisit pada baris yang mengelilinginya, dengan itu menghapuskan banyak masalah yang berpotensi. Sambungan fail arkib tidak ditetapkan secara automatik; anda mengisi semua yang anda perlukan sendiri. Saya telah menetapkan projek dan bin sebagai direktori lalai untuk diarkibkan, tetapi anda boleh menulis nama direktori anda yang paling berharga di sini.

Kata kunci else membuka cabang pelaksanaan alternatif. Arahan blok ini mula berfungsi jika semakan syarat mengembalikan hasil "palsu" (dalam contoh kami: "bilangan parameter yang diluluskan adalah bukan sifar," iaitu nama direktori yang ditentukan oleh pengguna). Dalam kes ini arahan akan kelihatan seperti ini:

tar czf archive$(cur_date).tar.gz $*

Di sini direktori lalai digantikan dengan rentetan nama direktori yang diterima secara luaran. Ia adalah mungkin untuk menerima dan memproses setiap satu parameter luaran secara berasingan, tetapi lebih mudah bagi kami untuk melepasi keseluruhan rentetan.

Pada akhir program, pemeriksaan lain dilakukan. Dalam persekitaran Unix, semua arahan mengembalikan kod status penyiapan. Jika arahan itu berjaya, ia mengembalikan kod 0, jika tidak kod keluar akan menjadi bukan sifar. Untuk menyemak kejayaan arahan pengarkiban sebelumnya, kami akan menggunakan satu lagi pembolehubah khas $?, yang sentiasa mengandungi nilai kod penyiapan perintah terkini. Jika dalam pembolehubah $? mengandungi 0, i.e. Fail sandaran telah berjaya dibuat, kemudian kami memindahkannya ke direktori arkib:

mv archive$(cur_date).tar.gz $HOME/archives

dan paparkan mesej yang sepadan:

echo "$cur_date - Sandaran berjaya diselesaikan."

Jika semakan menunjukkan bahawa kod penyiapan operasi pengarkiban bukan sifar, maka mesej ralat dipaparkan:

echo "$cur_date - ERROR semasa sandaran."

Ini melengkapkan skrip arahan kami.

Untuk menyemak operasi program kami, anda perlu menyimpan perkara di atas sumber dalam fail yang dipanggil bckp, sebagai contoh, dan kemudian menjadikannya boleh laku untuk kemudahan:

chmod 750 bckp

dan jalankan:

./bckp

untuk membuat sandaran direktori lalai, dan

./bckp docs progs berfungsi

untuk mencipta salinan sandaran direktori yang disenaraikan (nyatakan nama direktori yang sebenarnya wujud pada sistem anda, jika tidak, anda akan menerima mesej ralat).

Anda boleh meletakkan fail bckp dalam salah satu direktori yang ditentukan dalam pembolehubah PATH sistem. Lokasi yang paling disukai ialah /usr/local/bin atau $HOME/bin jika anda mempunyainya. Selepas ini anda boleh menjalankan bckp sebagai arahan sistem.

Bagaimana untuk mengautomasikan operasi sandaran berjadual

Beberapa perkataan tentang automasi sandaran. Untuk tujuan ini, sistem berfungsi penjadual cron, yang membaca arahan kerja daripada fail crontab khas. Untuk menentukan arahan sedemikian, anda perlu mencipta dan mengedit fail crontab anda menggunakan arahan:

crontab -e

Arahan ditulis dalam format yang ditetapkan dengan ketat (medan dipisahkan oleh ruang):

minit jam hari_bulan_bulan perintah hari_minggu

Satu pilihan untuk menjadualkan operasi sandaran mungkin kelihatan seperti ini:

30 23 10,20,30 * * /usr/local/bin/bckp

Ini bermakna skrip sandaran (anda mesti menyediakan laluan penuh ke fail ini) akan dijalankan pada 23:30 pada 10, 20 dan 30 setiap bulan, tanpa mengira hari dalam seminggu. (Asteris menunjukkan keseluruhan julat nilai yang dibenarkan, dalam kes ini: setiap bulan - dalam medan ke-4, mana-mana hari dalam seminggu - dalam medan ke-5)

Jika anda lebih suka menjejaki jumlah anda mengikut minggu dan sistem anda berjalan 24 jam sehari, maka wajar untuk menjadualkan sandaran semasa waktu perniagaan. beban minimum:

0 5 * * 3.5 /usr/local/bin/bckp

Di sini sandaran akan dibuat pada jam 5:00 pada hari Rabu dan Jumaat pada setiap bulan (asterisk dalam medan ke-4), tanpa mengira tarikh (asterisk dalam medan ke-3).

Anda boleh membaca tentang semua kerumitan penjadualan dalam manual crontab man 5.

Keputusan dan kesimpulan

Skrip sandaran yang dibincangkan dalam artikel ini mempunyai sifat berfungsi sederhana. Tetapi itu bukan maksudnya tugas utama, tetapi supaya pembaca memahami apa yang boleh dilakukan pada baris arahan, dan bukan sahaja menyalin dan melaksanakan cadangan yang dicadangkan. fail kelompok, dan mula berminat untuk mengembangkan fungsinya, mula menyelidik kemungkinan besar yang disediakan oleh cengkerang perintah. Dan jika seseorang, selepas membaca artikel ini, cuba memperbaiki kod yang diberikan di sini, atau menulis versi mereka sendiri, atau melaksanakan idea bebas mereka sendiri, maka saya akan menganggap bahawa matlamat utama telah dicapai.

Sumber untuk muat turun

static.content.url=http://www.site/developerworks/js/artrating/

ArticleID=458335

ArticleTitle=Asas Perintah Perintah cangkerang

  • Tutorial

Mengapa dan untuk siapa artikel itu?

Pada mulanya, ini adalah peringatan untuk pelajar yang mula bekerja dengan sistem seperti Unix. Dalam erti kata lain, artikel itu bertujuan untuk mereka yang tidak mempunyai pengalaman sebelumnya bekerja dengan baris arahan Unix, tetapi atas satu sebab atau yang lain ingin atau perlu belajar cara berinteraksi dengan berkesan dengannya.

Tidak akan ada penceritaan semula mana (dokumentasi), dan artikel itu tidak sama sekali membatalkan atau menggantikan membacanya. Sebaliknya, saya akan bercakap tentang perkara utama (perintah, teknik dan prinsip) yang perlu anda fahami dari awal bekerja dalam cangkerang unix supaya kerja berlaku dengan cekap dan menyenangkan.

Artikel berkenaan melibatkan persekitaran seperti unix yang lengkap, dengan cangkerang berfungsi sepenuhnya (sebaik-baiknya zsh atau bash) dan julat yang agak luas program standard.

Apa itu shell

Shell (shell, aka "baris arahan", aka CLI, aka "konsol", aka "terminal", aka "tetingkap hitam dengan huruf putih") ialah antara muka teks untuk berkomunikasi dengan sistem pengendalian (baik, maksud saya, ini ialah program, yang menyediakan antara muka sedemikian, tetapi kini perbezaan ini tidak ketara).

Secara umum, kerja melalui shell kelihatan seperti ini: pengguna (iaitu anda) memasukkan arahan dari papan kekunci, menekan Enter, sistem melaksanakan arahan, menulis hasil pelaksanaan ke skrin, dan sekali lagi menunggu arahan seterusnya untuk dimasukkan.

Pandangan biasa shella:

Cangkang adalah cara utama untuk berinteraksi dengan semua sistem pelayan seperti Unix.

Di manakah sistem baris arahan ditemui?

Di mana cangkerang unix mungkin menunggu anda, pilihan popular:
  • MacOS (bash);
  • akses jauh ke pelayan untuk kerja atau untuk projek web peribadi;
  • pelayan fail rumah dengan akses jauh;
  • Ubuntu, PC-BSD pada komputer riba/desktop - sistem seperti unix hari ini mudah dipasang dan digunakan.

Apakah masalah yang munasabah untuk diselesaikan dengan cangkerang?

Tugas semula jadi yang mana cangkangnya sesuai, berguna dan sangat diperlukan:
  • kerja interaktif di terminal:
    • melaksanakan kompilasi, menjalankan kerja melalui make;
    • perbandingan fail teks;
    • analisis data ad-hoc pantas (bilangan IP unik dalam log, pengedaran rekod mengikut jam/minit, dsb.);
    • tindakan besar-besaran sekali (membunuh banyak proses; jika anda bekerja dengan sistem kawalan versi, membalikkan atau menyelesaikan sekumpulan fail);
    • diagnostik tentang apa yang berlaku dalam sistem (semaphore, kunci, proses, deskriptor, ruang cakera, dll.);
  • skrip:
    • skrip pemasangan, yang mana anda tidak boleh bergantung pada kehadiran jurubahasa lain - ini bukan untuk pemula;
    • fungsi untuk menyesuaikan shell interaktif (menjejaskan jemputan, menukar direktori, tetapan pembolehubah persekitaran) - juga bukan untuk pemula;
    • skrip sekali sahaja seperti pengekodan semula fail massa;
    • makefiles.

Benar-benar langkah pertama

Mari mulakan: log masuk dan log keluar

Pastikan anda tahu dengan tepat cara memulakan shell dan cara keluar darinya.

Jika anda bekerja pada mesin dengan Ubuntu dipasang, anda perlu melancarkan program Terminal. Apabila selesai, anda hanya boleh menutup tetingkap.

Pada MacOS - lancarkan juga Terminal.

Untuk mengakses pelayan jauh, gunakan ssh (jika anda mempunyai MacOS, Ubuntu atau sistem seperti unix lain secara tempatan) atau putty (jika anda mempunyai Windows).

Siapa saya, di mana saya?

Jalankan arahan berikut:
  • nama hos - memaparkan nama mesin (pelayan) yang sedang anda gunakan;
  • whoami - memaparkan log masuk anda (nama anda dalam sistem);
  • tree -d / |less - perwakilan grafik pseudo bagi pepohon direktori pada mesin; keluar daripada menatal - q ;
  • pwd - memaparkan direktori yang anda berada sekarang; pada baris arahan anda tidak boleh "begitu sahaja", anda mesti berada dalam beberapa direktori (=direktori semasa, direktori kerja). Direktori kerja semasa mungkin dipaparkan dalam gesaan anda.
  • ls - senarai fail dalam direktori semasa; ls /home - senarai fail dalam direktori yang ditentukan;

Sejarah perintah (sejarah)

Sifat penting bagi baris arahan penuh ialah sejarah arahan.

Jalankan beberapa arahan: nama hos, ls, pwd, whoami. Sekarang tekan kekunci atas. Perintah sebelumnya muncul dalam baris input. Anda boleh menggunakan kekunci atas dan bawah untuk bergerak ke hadapan dan ke belakang melalui sejarah. Apabila anda sampai ke nama hos, tekan Enter - arahan akan dilaksanakan semula.

Perintah dari sejarah bukan sahaja boleh dilaksanakan berulang kali, tetapi juga diedit. Tatal sejarah ke arahan ls, tambahkan suis -l kepadanya (ternyata ls -l , terdapat ruang sebelum tolak, tetapi tidak selepas). Tekan Enter - arahan yang diubah suai akan dilaksanakan.

Menatal melalui sejarah, mengedit dan melaksanakan semula arahan ialah tindakan yang paling biasa apabila bekerja pada baris arahan, jadi biasakan diri anda.

Salin tampal

Baris arahan sangat mengutamakan teks: arahan ialah teks, data input untuk kebanyakan program standard ialah teks, dan output paling kerap adalah teks.

Perkara yang menarik tentang teks ialah ia boleh disalin dan ditampal, dan ini juga berlaku pada baris arahan.

Cuba tarikh arahan +"%y-%m-%d, %A"
Adakah anda memasukkannya sepenuhnya dengan tangan atau menyalinnya daripada artikel? Pastikan anda boleh menyalinnya, tampalkannya ke dalam terminal dan laksanakannya.

Sebaik sahaja anda telah mempelajari cara menggunakan man, pastikan anda boleh menyalin dan menjalankan arahan contoh daripada bantuan. Untuk menyemak, cari bahagian CONTOH dalam bantuan program tarikh, salin dan jalankan contoh pertama yang diberikan (sekiranya: tanda dolar bukan sebahagian daripada arahan , ini adalah imej simbolik gesaan input).

Cara tepat untuk menyalin teks dari terminal dan menampalnya ke terminal bergantung pada sistem anda dan tetapannya, jadi berikan arahan sejagat, malangnya, ia tidak akan berfungsi. Di Ubuntu, cuba ini: salin - pilih sahaja dengan tetikus, tampal - butang tengah tetikus. Jika ia tidak berfungsi, atau jika anda mempunyai sistem yang berbeza, lihat di Internet atau tanya rakan yang lebih berpengalaman.

Kunci dan pilihan

Semasa anda meneroka sejarah arahan, anda telah pun mendapati bahawa arahan ls mempunyai sekurang-kurangnya dua pilihan. Jika anda memanggilnya begitu sahaja, ia mengeluarkan senarai mudah:

Akira@latitude-e7240: ~/shell-survival-quide> ls Makefile shell-first-steps.md shell-first-steps.pdf shell-survival-quide.md shell-survival-quide.pdf
Jika anda menambah suis -l, maklumat terperinci dipaparkan untuk setiap fail:

Akira@latitud-e7240: ~/shell-survival-quide> ls -l jumlah 332 -rw-rw-r-- 1 akira akira 198 Feb 13 11:48 Makefile -rw-rw-r-- 1 akira akira 15107 Feb 14 22:26 shell-first-steps.md -rw-rw-r-- 1 akira akira 146226 Feb 13 11:49 shell-first-steps.pdf -rw-rw-r-- 1 akira akira 16626 Feb 13 11 :45 shell-survival-quide.md -rw-rw-r-- 1 akira akira 146203 Feb 13 11:35 shell-survival-quide.pdf
Ini sangat keadaan tipikal: jika pengubah suai khas (kunci, pilihan, parameter) ditambahkan pada panggilan arahan, tingkah laku arahan berubah. Bandingkan: pokok / dan pokok -d / , nama hos dan nama hos -f .

Di samping itu, arahan boleh mengambil nama fail, nama direktori atau ringkasnya rentetan teks. Cuba:

Ls -ld /home ls -l /home grep root /etc/passwd

lelaki

man - Bantu dengan arahan dan program yang tersedia pada mesin anda, serta panggilan sistem dan perpustakaan C standard.

Cuba: man grep , man atoi , man chdir , man man .

Menatal ke hadapan dan ke belakang dilakukan dengan butang "atas", "bawah", "PageUp", "PageDown", keluar dari paparan bantuan dilakukan dengan butang q. Cari teks tertentu dalam artikel bantuan: tekan / (slash ke hadapan), masukkan teks untuk mencari, tekan Enter. Beralih ke kejadian seterusnya - kekunci n.

Semua artikel rujukan dibahagikan kepada kategori. Paling penting:

  • 1 - program boleh laku dan arahan shell (wc, ls, pwd, dll.);
  • 2 - panggilan sistem(garpu, dup2, dll.)
  • 3 - fungsi perpustakaan (printf, scanf, cos, exec).
Adalah perlu untuk menunjukkan dari kategori mana sijil harus ditunjukkan dalam kes-kes kebetulan nama. Sebagai contoh, man 3 printf menerangkan fungsi dari perpustakaan standard C, dan man 1 printf - program konsol dengan nama yang sama.

Anda boleh melihat senarai semua artikel bantuan yang tersedia pada mesin anda menggunakan arahan man -k. (titik itu juga sebahagian daripada komada).

kurang

Apabila masuk tingkap kecil terminal perlu dilihat sangat banyak teks panjang(kandungan beberapa fail, seorang lelaki panjang, dll.), mereka menggunakan program "pager" khas (daripada halaman perkataan, iaitu, flippers halaman). Penatal yang paling popular adalah kurang, dan inilah yang memberikan anda penatalan apabila anda membaca halaman manual.

Cuba dan bandingkan tingkah laku:

Cat /etc/bash.bashrc cat /etc/bash.bashrc |less

Anda boleh memindahkan fail ke kelui terus dalam parameter:

Kurang /etc/bash.bashrc

Menatal ke atas dan ke bawah - butang "atas", "bawah", "PageUp", "PageDown", keluar - butang q. Cari teks tertentu: tekan / (slash ke hadapan), masukkan teks untuk mencari, tekan Enter. Beralih ke kejadian seterusnya - kekunci n. (Adakah anda mengenali arahan tentang manusia? Tidak hairanlah, kurang juga digunakan untuk memaparkan bantuan.)

Hak

Mana-mana fail atau direktori dikaitkan dengan satu set "hak": hak untuk membaca fail, hak untuk menulis pada fail, hak untuk melaksanakan fail. Semua pengguna dibahagikan kepada tiga kategori: pemilik fail, kumpulan pemilik fail dan semua pengguna lain.

Anda boleh melihat kebenaran fail menggunakan ls -l . Sebagai contoh:

> ls -l Makefile -rw-r--r-- 1 pelajar akira 198 Feb 13 11:48 Makefile
Output ini bermakna pemilik (akira) boleh membaca dan menulis fail, kumpulan (pelajar) hanya boleh membaca, dan semua pengguna lain juga hanya boleh membaca.

Jika anda menerima mesej yang ditolak kebenaran semasa bekerja, ini bermakna anda tidak mempunyai hak yang mencukupi untuk objek yang anda ingin bekerjasama.

Baca lebih lanjut dalam man chmod.

STDIN, STDOUT, penghantar (paip)

Dikaitkan dengan setiap program yang sedang berjalan adalah 3 aliran piawai data: aliran data input STDIN, aliran data output STDOUT, aliran keluaran ralat STDERR.

Jalankan program wc, masukkan teks Good day today, tekan Enter, masukkan teks good day, tekan Enter, tekan Ctrl+d. Program wc akan menunjukkan statistik tentang bilangan huruf, perkataan dan baris dalam teks dan akhir anda:

> wc selamat hari hari ini selamat hari 2 5 24
Dalam kes ini, anda membekalkan teks dua baris ke STDIN program dan menerima tiga nombor dalam STDOUT.

Sekarang jalankan kepala arahan -n3 /etc/passwd , ia sepatutnya kelihatan seperti ini:

> head -n3 /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x: 2:2:bin:/bin:/usr/sbin/nologin
Dalam kes ini, program kepala tidak membaca apa-apa daripada STDIN, tetapi menulis tiga baris ke STDOUT.

Anda boleh bayangkan dengan cara ini: program ini ialah paip yang mengalir ke dalamnya STDIN dan STDOUT mengalir keluar.

Sifat paling penting bagi baris arahan Unix ialah program "paip" boleh disambungkan antara satu sama lain: output (STDOUT) satu program boleh dihantar sebagai data input (STDIN) ke program lain.

Pembinaan program bersambung sedemikian dipanggil paip dalam bahasa Inggeris, atau penghantar atau paip dalam bahasa Rusia.

Menggabungkan atur cara ke dalam saluran paip dilakukan dengan simbol | (bar menegak)

Jalankan kepala arahan -n3 /etc/passwd |wc , ia akan kelihatan seperti ini:

> kepala -n3 /etc/passwd |wc 3 3 117
Inilah yang berlaku: program kepala mengeluarkan tiga baris teks dalam STDOUT, yang segera pergi ke input program wc, yang seterusnya mengira bilangan aksara, perkataan dan baris dalam teks yang terhasil.

Anda boleh menggabungkan seberapa banyak program yang anda suka ke dalam saluran paip. Sebagai contoh, anda boleh menambah atur cara wc lain pada saluran paip sebelumnya, yang akan mengira bilangan perkataan dan huruf dalam output wc pertama:

> kepala -n3 /etc/passwd |wc |wc 1 3 24

Mencipta saluran paip (paip) adalah tugas yang sangat biasa apabila bekerja pada baris arahan. Untuk contoh cara ini dilakukan dalam amalan, baca bahagian "Membuat saluran paip satu lapis."

Ubah hala I/O

Output (STDOUT) program bukan sahaja boleh dipindahkan ke program lain melalui saluran paip, tetapi juga hanya ditulis ke fail. Ubah hala ini dilakukan menggunakan > (lebih besar daripada tanda):

Tarikh > /tmp/today.txt
Hasil daripada melaksanakan arahan ini, fail /tmp/today.txt akan muncul pada cakera. Lihat kandungannya menggunakan cat /tmp/today.txt

Jika fail dengan nama yang sama telah wujud, kandungan lamanya akan dimusnahkan. Jika fail itu tidak wujud, ia akan dibuat. Direktori di mana fail dicipta mesti wujud sebelum arahan dilaksanakan.

Jika anda tidak mahu menulis ganti fail, sebaliknya menambah output pada penghujungnya, gunakan >> :

Tarikh >> /tmp/today.txt
Semak apa yang kini ditulis dalam fail.

Di samping itu, anda boleh menghantar mana-mana fail ke program dan bukannya STDIN. Cuba:

Wc

Apa yang perlu dilakukan apabila sesuatu yang tidak jelas

Jika anda menghadapi tingkah laku sistem yang anda tidak fahami, atau ingin mencapai hasil tertentu, tetapi tidak tahu caranya, saya menasihati anda untuk meneruskan mengikut urutan berikut (omong-omong, ini terpakai bukan sahaja untuk cengkerang):
  • Sejelas mungkin, rumuskan soalan atau tugas - tidak ada yang lebih sukar daripada menyelesaikan "sesuatu yang saya tidak tahu apa";
  • ingat jika anda telah menghadapi masalah yang sama atau serupa - dalam kes ini, ia patut mencuba penyelesaian yang berkesan kali terakhir;
  • baca halaman manual yang sesuai (jika anda memahami halaman manual mana yang sesuai dalam kes anda) - mungkin anda akan menemui contoh yang sesuai untuk menggunakan arahan, pilihan yang diperlukan atau pautan ke arahan lain;
  • fikir: adakah mungkin untuk mengubah sedikit tugas? - mungkin, dengan mengubah sedikit syarat, anda akan mendapat masalah yang anda sudah tahu bagaimana untuk menyelesaikannya;
  • tanya soalan anda yang dirumus dengan jelas dalam enjin carian - mungkin jawapannya boleh didapati di Stack Overflow atau tapak lain;
Jika tiada perkara di atas membantu, dapatkan nasihat daripada guru, rakan sekerja atau rakan yang berpengalaman. Dan jangan takut untuk bertanya soalan "bodoh" - tidak memalukan untuk tidak tahu, memalukan untuk tidak bertanya.

Jika anda menyelesaikan masalah yang sukar (sendiri, dengan bantuan Internet atau orang lain), tulis penyelesaian anda sekiranya masalah yang sama timbul lagi untuk anda atau rakan anda. Anda boleh merakamnya dalam fail teks ringkas, dalam Evernote, atau menerbitkannya di rangkaian sosial.

Kaedah kerja

Salin dan tampal- dari halaman manual, dari artikel di StackOverflow, dsb. Baris arahan terdiri daripada teks, gunakan ini: salin dan gunakan arahan contoh, tulis penemuan yang berjaya sebagai kenang-kenangan, terbitkannya di Twitter dan blog.

Tarik arahan sebelumnya dari sejarah, tambah arahan lain pada saluran paip, jalankan, ulangi.Cm. Lihat juga bahagian "Membuat saluran paip satu pelapik."

Perintah asas

  • tukar ke direktori lain: cd ;
  • melihat kandungan fail: kucing, kurang, kepala, ekor;
  • manipulasi fail: cp, mv, rm;
  • melihat kandungan direktori: ls , ls -l , ls -lS ;
  • struktur direktori: tree , tree -d (anda boleh lulus direktori sebagai parameter);
  • cari fail: cari . -nama ... ;

Analitis

  • wc, wc -l;
  • sort -k - susun mengikut medan yang ditentukan;
  • sort -n - pengisihan berangka;
  • perbezaan - perbandingan fail;
  • grep , grep -v , grep -w , grep "\ " , grep -E - cari teks;
  • uniq , uniq -c - keunikan rentetan;
  • awk - dalam pilihan awk "(cetak $1)", untuk meninggalkan hanya medan pertama dari setiap baris, $1 boleh ditukar kepada $2, $3, dsb.;

Diagnostik sistem

  • ps axuww - maklumat tentang proses (menjalankan program) yang berjalan pada mesin;
  • atas - tontonan interaktif proses yang paling intensif sumber;
  • df - ruang cakera terpakai dan kosong;
  • du - jumlah saiz fail dalam direktori (secara rekursif dengan subdirektori);
  • strace , ktrace - sistem apa yang dipanggil proses membuat;
  • lsof - fail apa yang digunakan oleh proses;
  • netstat -na, netstat -nap - port dan soket yang dibuka dalam sistem.

Anda mungkin tidak mempunyai beberapa program; ia perlu dipasang tambahan. Di samping itu, beberapa pilihan program ini hanya tersedia untuk pengguna istimewa (root).

Pelaksanaan pukal dan separa automatik

Pada mulanya, langkau bahagian ini; anda memerlukan arahan dan binaan ini apabila anda sampai ke skrip shell mudah.
  • ujian - memeriksa keadaan;
  • manakala baca - gelung baris demi baris STDIN ;
  • xargs - penggantian rentetan daripada STDIN ke dalam parameter program yang ditentukan;
  • seq - penjanaan jujukan nombor asli;
  • () - menggabungkan output beberapa arahan;
  • ; - lakukan satu demi satu perkara;
  • && - laksanakan jika arahan pertama berjaya diselesaikan;
  • || - jalankan jika arahan pertama gagal;
  • tee - salin output program ke STDOUT dan ke fail pada cakera.

Macam-macam

  • tarikh - tarikh semasa;
  • curl - memuat turun dokumen dari url yang ditentukan dan menulis hasilnya ke STDOUT;
  • sentuh - kemas kini tarikh pengubahsuaian fail;
  • bunuh - hantar isyarat kepada proses;
  • benar - tidak melakukan apa-apa, mengembalikan benar, berguna untuk mengatur gelung kekal;
  • sudo - laksanakan arahan sebagai root "a.

Mewujudkan saluran paip satu pelapik

Mari kita lihat contoh tugas sebenar: kita perlu mematikan semua proses tugas-6-pelayan yang berjalan sebagai pengguna semasa.

Langkah 1.
Fahami program yang menghasilkan kira-kira data yang diperlukan, walaupun tidak dalam bentuk tulennya. Untuk tugas kami, adalah bernilai mendapatkan senarai semua proses dalam sistem: ps axuww. Pelancaran.

Langkah 2.
Lihat data yang diterima dengan mata anda, buat penapis yang akan membuang beberapa data yang tidak diperlukan. Ini selalunya grep atau grep -v . Gunakan kekunci "Naik" untuk mengeluarkan perintah sebelumnya daripada sejarah, tetapkan penapis yang dicipta kepadanya dan jalankannya.

Ps axuww |grep `whoami`
- hanya proses pengguna semasa.

Langkah 3.
Ulangi langkah 2 sehingga anda mendapat data bersih yang anda perlukan.

"
- semua proses dengan nama yang diperlukan (tambah, mungkin, proses tambahan seperti vim task-6-server.c, dll.),

Ps axuww |grep `whoami` | grep "\ " | grep -v vim ps axuww |grep `whoami` | grep "\ " | grep -v vim |grep -v less
- hanya proses dengan nama yang diperlukan

Ps axuww |grep `whoami` | grep "\ " | grep -v vim |grep -v less |awk "(cetak $2)"

Pids proses yang diperlukan, langkah 3 selesai

Langkah 4.
Gunakan pengendali akhir yang sesuai. Menggunakan kekunci "Naik", kami mengeluarkan arahan sebelumnya dari sejarah dan menambah pemprosesan yang akan menyelesaikan penyelesaian kepada masalah:

  • |wc -l untuk mengira bilangan proses;
  • >pids untuk menulis pids ke fail;
  • |xargs kill -9 kill proses.

Tugas latihan

Ingin berlatih kemahiran baru? Cuba tugasan berikut:
  • dapatkan senarai semua fail dan direktori dalam direktori rumah anda;
  • dapatkan senarai semua artikel lelaki dari kategori 2 (panggilan sistem);
  • kira berapa kali perkataan grep muncul dalam halaman manual program grep;
  • kira berapa banyak proses sedang berjalan sebagai akar;
  • cari arahan yang muncul dalam bilangan maksimum kategori bantuan (lelaki);
  • kira berapa kali perkataan var muncul pada halaman ya.ru.
Petunjuk: anda perlu find , grep -o , awk "(print $1)" , ungkapan biasa dalam grep , curl -s .

Apa yang perlu dipelajari seterusnya?

Jika anda mula menyukai baris arahan, jangan berhenti, teruskan meningkatkan kemahiran anda.

Berikut adalah beberapa program yang pasti akan berguna jika anda tinggal di baris arahan:

  • cari dengan pilihan yang kompleks
  • apropos
  • cari
  • telnet
  • netcat
  • tcpdump
  • rsync
  • skrin
  • zgrep, zless
  • visudo
  • crontab -e
  • hantar surat
Di samping itu, dari masa ke masa adalah berbaloi untuk menguasai beberapa jenis bahasa skrip, seperti perl atau python, atau bahkan kedua-duanya.

Siapa yang memerlukan ini?

Adakah berbaloi untuk mempelajari baris arahan dan skrip shell hari ini? Pasti berbaloi. Saya akan berikan hanya beberapa contoh keperluan Facebook untuk calon yang ingin mendapatkan pekerjaan di FB.
  • Tutorial

Mengapa dan untuk siapa artikel itu?

Pada mulanya, ini adalah peringatan untuk pelajar yang mula bekerja dengan sistem seperti Unix. Dalam erti kata lain, artikel itu bertujuan untuk mereka yang tidak mempunyai pengalaman sebelumnya bekerja dengan baris arahan Unix, tetapi atas satu sebab atau yang lain ingin atau perlu belajar cara berinteraksi dengan berkesan dengannya.

Tidak akan ada penceritaan semula mana (dokumentasi), dan artikel itu tidak sama sekali membatalkan atau menggantikan membacanya. Sebaliknya, saya akan bercakap tentang perkara utama (arahan, teknik dan prinsip) yang perlu anda fahami dari awal bekerja dalam shell unix agar kerja itu berkesan dan menyeronokkan.

Artikel itu melibatkan persekitaran seperti unix yang lengkap, dengan cangkerang berfungsi sepenuhnya (sebaik-baiknya zsh atau bash) dan rangkaian program standard yang agak luas.

Apa itu shell

Shell (shell, aka "baris arahan", aka CLI, aka "konsol", aka "terminal", aka "tetingkap hitam dengan huruf putih") ialah antara muka teks untuk berkomunikasi dengan sistem pengendalian (baik, maksud saya, ini ialah program, yang menyediakan antara muka sedemikian, tetapi kini perbezaan ini tidak ketara).

Secara umum, kerja melalui shell kelihatan seperti ini: pengguna (iaitu anda) memasukkan arahan dari papan kekunci, menekan Enter, sistem melaksanakan arahan, menulis hasil pelaksanaan ke skrin, dan sekali lagi menunggu arahan seterusnya untuk dimasukkan.

Jenis shell biasa:

Cangkang adalah cara utama untuk berinteraksi dengan semua sistem pelayan seperti Unix.

Di manakah sistem baris arahan ditemui?

Di mana cangkerang unix mungkin menunggu anda, pilihan popular:
  • MacOS (bash);
  • akses jauh ke pelayan untuk kerja atau untuk projek web peribadi;
  • pelayan fail rumah dengan akses jauh;
  • Ubuntu, PC-BSD pada komputer riba/desktop - sistem seperti unix hari ini mudah dipasang dan digunakan.

Apakah masalah yang munasabah untuk diselesaikan dengan cangkerang?

Tugas semula jadi yang mana cangkangnya sesuai, berguna dan sangat diperlukan:
  • kerja interaktif di terminal:
    • melaksanakan kompilasi, menjalankan kerja melalui make;
    • perbandingan fail teks;
    • analisis data ad-hoc pantas (bilangan IP unik dalam log, pengedaran rekod mengikut jam/minit, dsb.);
    • tindakan besar-besaran sekali (membunuh banyak proses; jika anda bekerja dengan sistem kawalan versi, membalikkan atau menyelesaikan sekumpulan fail);
    • diagnostik tentang apa yang berlaku dalam sistem (semaphore, kunci, proses, deskriptor, ruang cakera, dll.);
  • skrip:
    • skrip pemasangan, yang mana anda tidak boleh bergantung pada kehadiran jurubahasa lain - ini bukan untuk pemula;
    • fungsi untuk menyesuaikan shell interaktif (menjejaskan jemputan, menukar direktori, menetapkan pembolehubah persekitaran) juga bukan untuk pemula;
    • skrip sekali sahaja seperti pengekodan semula fail massa;
    • makefiles.

Benar-benar langkah pertama

Mari mulakan: log masuk dan log keluar

Pastikan anda tahu dengan tepat cara memulakan shell dan cara keluar darinya.

Jika anda bekerja pada mesin dengan Ubuntu dipasang, anda perlu melancarkan program Terminal. Apabila selesai, anda hanya boleh menutup tetingkap.

Pada MacOS - lancarkan juga Terminal.

Untuk mengakses pelayan jauh, gunakan ssh (jika anda mempunyai MacOS, Ubuntu atau sistem seperti unix lain secara tempatan) atau putty (jika anda mempunyai Windows).

Siapa saya, di mana saya?

Jalankan arahan berikut:
  • nama hos - memaparkan nama mesin (pelayan) yang sedang anda gunakan;
  • whoami - memaparkan log masuk anda (nama anda dalam sistem);
  • tree -d / |less - perwakilan grafik pseudo bagi pepohon direktori pada mesin; keluar daripada menatal - q ;
  • pwd - memaparkan direktori yang anda berada sekarang; pada baris arahan anda tidak boleh "begitu sahaja", anda mesti berada dalam beberapa direktori (=direktori semasa, direktori kerja). Direktori kerja semasa mungkin dipaparkan dalam gesaan anda.
  • ls - senarai fail dalam direktori semasa; ls /home - senarai fail dalam direktori yang ditentukan;

Sejarah perintah (sejarah)

Sifat penting bagi baris arahan penuh ialah sejarah arahan.

Jalankan beberapa arahan: nama hos, ls, pwd, whoami. Sekarang tekan kekunci atas. Perintah sebelumnya muncul dalam baris input. Anda boleh menggunakan kekunci atas dan bawah untuk bergerak ke hadapan dan ke belakang melalui sejarah. Apabila anda sampai ke nama hos, tekan Enter - arahan akan dilaksanakan semula.

Perintah dari sejarah bukan sahaja boleh dilaksanakan berulang kali, tetapi juga diedit. Tatal sejarah ke arahan ls, tambahkan suis -l kepadanya (ternyata ls -l , terdapat ruang sebelum tolak, tetapi tidak selepas). Tekan Enter - arahan yang diubah suai akan dilaksanakan.

Menatal melalui sejarah, mengedit dan melaksanakan semula arahan ialah tindakan yang paling biasa apabila bekerja pada baris arahan, jadi biasakan diri anda.

Salin tampal

Baris arahan sangat mengutamakan teks: arahan ialah teks, data input untuk kebanyakan program standard ialah teks, dan output paling kerap adalah teks.

Perkara yang menarik tentang teks ialah ia boleh disalin dan ditampal, dan ini juga berlaku pada baris arahan.

Cuba tarikh arahan +"%y-%m-%d, %A"
Adakah anda memasukkannya sepenuhnya dengan tangan atau menyalinnya daripada artikel? Pastikan anda boleh menyalinnya, tampalkannya ke dalam terminal dan laksanakannya.

Sebaik sahaja anda telah mempelajari cara menggunakan man, pastikan anda boleh menyalin dan menjalankan arahan contoh daripada bantuan. Untuk menyemak, cari bahagian CONTOH dalam bantuan program tarikh, salin dan jalankan contoh pertama yang diberikan (sekiranya: tanda dolar bukan sebahagian daripada arahan , ini adalah imej simbolik gesaan input).

Cara tepat untuk menyalin teks dari terminal dan menampalnya ke terminal bergantung pada sistem anda dan tetapannya, jadi, malangnya, tidak mungkin untuk memberikan arahan universal. Di Ubuntu, cuba ini: salin - pilih sahaja dengan tetikus, tampal - butang tengah tetikus. Jika ia tidak berfungsi, atau jika anda mempunyai sistem yang berbeza, lihat di Internet atau tanya rakan yang lebih berpengalaman.

Kunci dan pilihan

Semasa anda meneroka sejarah arahan, anda telah pun mendapati bahawa arahan ls mempunyai sekurang-kurangnya dua pilihan. Jika anda memanggilnya begitu sahaja, ia mengeluarkan senarai mudah:

Akira@latitude-e7240: ~/shell-survival-quide> ls Makefile shell-first-steps.md shell-first-steps.pdf shell-survival-quide.md shell-survival-quide.pdf
Jika anda menambah suis -l, maklumat terperinci dipaparkan untuk setiap fail:

Akira@latitud-e7240: ~/shell-survival-quide> ls -l jumlah 332 -rw-rw-r-- 1 akira akira 198 Feb 13 11:48 Makefile -rw-rw-r-- 1 akira akira 15107 Feb 14 22:26 shell-first-steps.md -rw-rw-r-- 1 akira akira 146226 Feb 13 11:49 shell-first-steps.pdf -rw-rw-r-- 1 akira akira 16626 Feb 13 11 :45 shell-survival-quide.md -rw-rw-r-- 1 akira akira 146203 Feb 13 11:35 shell-survival-quide.pdf
Ini adalah situasi yang sangat biasa: jika anda menambah pengubah suai khas (kunci, pilihan, parameter) pada panggilan arahan, tingkah laku arahan berubah. Bandingkan: pokok / dan pokok -d / , nama hos dan nama hos -f .

Di samping itu, arahan boleh mengambil nama fail, nama direktori, atau hanya rentetan teks sebagai parameter. Cuba:

Ls -ld /home ls -l /home grep root /etc/passwd

lelaki

man - Bantu dengan arahan dan program yang tersedia pada mesin anda, serta panggilan sistem dan perpustakaan C standard.

Cuba: man grep , man atoi , man chdir , man man .

Menatal ke hadapan dan ke belakang dilakukan dengan butang "atas", "bawah", "PageUp", "PageDown", keluar dari paparan bantuan dilakukan dengan butang q. Cari teks tertentu dalam artikel bantuan: tekan / (slash ke hadapan), masukkan teks untuk mencari, tekan Enter. Beralih ke kejadian seterusnya - kekunci n.

Semua artikel rujukan dibahagikan kepada kategori. Paling penting:

  • 1 - program boleh laku dan arahan shell (wc, ls, pwd, dll.);
  • 2 - panggilan sistem (fork, dup2, dll.)
  • 3 - fungsi perpustakaan (printf, scanf, cos, exec).
Adalah perlu untuk menunjukkan dari kategori mana sijil harus ditunjukkan dalam kes-kes kebetulan nama. Sebagai contoh, man 3 printf menerangkan fungsi daripada perpustakaan standard C, dan man 1 printf menerangkan program konsol dengan nama yang sama.

Anda boleh melihat senarai semua artikel bantuan yang tersedia pada mesin anda menggunakan arahan man -k. (titik itu juga sebahagian daripada komada).

kurang

Apabila anda perlu melihat teks yang sangat panjang dalam tetingkap terminal kecil (kandungan fail, lelaki panjang, dsb.), program "pager" khas digunakan (daripada halaman perkataan, iaitu, penyelak halaman). Penatal yang paling popular adalah kurang, dan inilah yang memberikan anda penatalan apabila anda membaca halaman manual.

Cuba dan bandingkan tingkah laku:

Cat /etc/bash.bashrc cat /etc/bash.bashrc |less

Anda boleh memindahkan fail ke kelui terus dalam parameter:

Kurang /etc/bash.bashrc

Menatal ke atas dan ke bawah - butang "atas", "bawah", "PageUp", "PageDown", keluar - butang q. Cari teks tertentu: tekan / (slash ke hadapan), masukkan teks untuk mencari, tekan Enter. Beralih ke kejadian seterusnya - kekunci n. (Adakah anda mengenali arahan tentang manusia? Tidak hairanlah, kurang juga digunakan untuk memaparkan bantuan.)

Hak

Mana-mana fail atau direktori dikaitkan dengan satu set "hak": hak untuk membaca fail, hak untuk menulis pada fail, hak untuk melaksanakan fail. Semua pengguna dibahagikan kepada tiga kategori: pemilik fail, kumpulan pemilik fail dan semua pengguna lain.

Anda boleh melihat kebenaran fail menggunakan ls -l . Sebagai contoh:

> ls -l Makefile -rw-r--r-- 1 pelajar akira 198 Feb 13 11:48 Makefile
Output ini bermakna pemilik (akira) boleh membaca dan menulis fail, kumpulan (pelajar) hanya boleh membaca, dan semua pengguna lain juga hanya boleh membaca.

Jika anda menerima mesej yang ditolak kebenaran semasa bekerja, ini bermakna anda tidak mempunyai hak yang mencukupi untuk objek yang anda ingin bekerjasama.

Baca lebih lanjut dalam man chmod.

STDIN, STDOUT, penghantar (paip)

Terdapat 3 aliran data standard yang dikaitkan dengan setiap program pelaksanaan: aliran data input STDIN, aliran data output STDOUT, strim output ralat STDERR.

Jalankan program wc, masukkan teks Good day today, tekan Enter, masukkan teks good day, tekan Enter, tekan Ctrl+d. Program wc akan menunjukkan statistik tentang bilangan huruf, perkataan dan baris dalam teks dan akhir anda:

> wc selamat hari hari ini selamat hari 2 5 24
Dalam kes ini, anda membekalkan teks dua baris ke STDIN program dan menerima tiga nombor dalam STDOUT.

Sekarang jalankan kepala arahan -n3 /etc/passwd , ia sepatutnya kelihatan seperti ini:

> head -n3 /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x: 2:2:bin:/bin:/usr/sbin/nologin
Dalam kes ini, program kepala tidak membaca apa-apa daripada STDIN, tetapi menulis tiga baris ke STDOUT.

Anda boleh bayangkan dengan cara ini: program ini ialah paip yang mengalir ke dalamnya STDIN dan STDOUT mengalir keluar.

Sifat paling penting bagi baris arahan Unix ialah program "paip" boleh disambungkan antara satu sama lain: output (STDOUT) satu program boleh dihantar sebagai data input (STDIN) ke program lain.

Pembinaan program bersambung sedemikian dipanggil paip dalam bahasa Inggeris, atau penghantar atau paip dalam bahasa Rusia.

Menggabungkan atur cara ke dalam saluran paip dilakukan dengan simbol | (bar menegak)

Jalankan kepala arahan -n3 /etc/passwd |wc , ia akan kelihatan seperti ini:

> kepala -n3 /etc/passwd |wc 3 3 117
Inilah yang berlaku: program kepala mengeluarkan tiga baris teks dalam STDOUT, yang segera pergi ke input program wc, yang seterusnya mengira bilangan aksara, perkataan dan baris dalam teks yang terhasil.

Anda boleh menggabungkan seberapa banyak program yang anda suka ke dalam saluran paip. Sebagai contoh, anda boleh menambah atur cara wc lain pada saluran paip sebelumnya, yang akan mengira bilangan perkataan dan huruf dalam output wc pertama:

> kepala -n3 /etc/passwd |wc |wc 1 3 24

Mencipta saluran paip (paip) adalah tugas yang sangat biasa apabila bekerja pada baris arahan. Untuk contoh cara ini dilakukan dalam amalan, baca bahagian "Membuat saluran paip satu lapis."

Ubah hala I/O

Output (STDOUT) program bukan sahaja boleh dipindahkan ke program lain melalui saluran paip, tetapi juga hanya ditulis ke fail. Ubah hala ini dilakukan menggunakan > (lebih besar daripada tanda):

Tarikh > /tmp/today.txt
Hasil daripada melaksanakan arahan ini, fail /tmp/today.txt akan muncul pada cakera. Lihat kandungannya menggunakan cat /tmp/today.txt

Jika fail dengan nama yang sama telah wujud, kandungan lamanya akan dimusnahkan. Jika fail itu tidak wujud, ia akan dibuat. Direktori di mana fail dicipta mesti wujud sebelum arahan dilaksanakan.

Jika anda tidak mahu menulis ganti fail, sebaliknya menambah output pada penghujungnya, gunakan >> :

Tarikh >> /tmp/today.txt
Semak apa yang kini ditulis dalam fail.

Di samping itu, anda boleh menghantar mana-mana fail ke program dan bukannya STDIN. Cuba:

Wc

Apa yang perlu dilakukan apabila sesuatu yang tidak jelas

Jika anda menghadapi tingkah laku sistem yang anda tidak fahami, atau ingin mencapai hasil tertentu, tetapi tidak tahu caranya, saya menasihati anda untuk meneruskan mengikut urutan berikut (omong-omong, ini terpakai bukan sahaja untuk cengkerang):
  • Sejelas mungkin, rumuskan soalan atau tugas - tidak ada yang lebih sukar daripada menyelesaikan "sesuatu yang saya tidak tahu apa";
  • ingat jika anda telah menghadapi masalah yang sama atau serupa - dalam kes ini, ia patut mencuba penyelesaian yang berkesan kali terakhir;
  • baca halaman manual yang sesuai (jika anda memahami halaman manual mana yang sesuai dalam kes anda) - mungkin anda akan menemui contoh yang sesuai untuk menggunakan arahan, pilihan yang diperlukan atau pautan ke arahan lain;
  • fikir: adakah mungkin untuk mengubah sedikit tugas? - mungkin, dengan mengubah sedikit syarat, anda akan mendapat masalah yang anda sudah tahu bagaimana untuk menyelesaikannya;
  • tanya soalan anda yang dirumus dengan jelas dalam enjin carian - mungkin jawapannya boleh didapati di Stack Overflow atau tapak lain;
Jika tiada perkara di atas membantu, dapatkan nasihat daripada guru, rakan sekerja atau rakan yang berpengalaman. Dan jangan takut untuk bertanya soalan "bodoh" - tidak memalukan untuk tidak tahu, memalukan untuk tidak bertanya.

Jika anda menyelesaikan masalah yang sukar (sendiri, dengan bantuan Internet atau orang lain), tulis penyelesaian anda sekiranya masalah yang sama timbul lagi untuk anda atau rakan anda. Anda boleh merakamnya dalam fail teks ringkas, dalam Evernote, atau menerbitkannya di rangkaian sosial.

Kaedah kerja

Salin dan tampal- dari halaman manual, dari artikel di StackOverflow, dsb. Baris arahan terdiri daripada teks, gunakan ini: salin dan gunakan arahan contoh, tulis penemuan yang berjaya sebagai kenang-kenangan, terbitkannya di Twitter dan blog.

Tarik arahan sebelumnya dari sejarah, tambah arahan lain pada saluran paip, jalankan, ulangi.Cm. Lihat juga bahagian "Membuat saluran paip satu pelapik."

Perintah asas

  • tukar ke direktori lain: cd ;
  • melihat kandungan fail: kucing, kurang, kepala, ekor;
  • manipulasi fail: cp, mv, rm;
  • melihat kandungan direktori: ls , ls -l , ls -lS ;
  • struktur direktori: tree , tree -d (anda boleh lulus direktori sebagai parameter);
  • cari fail: cari . -nama ... ;

Analitis

  • wc, wc -l;
  • sort -k - susun mengikut medan yang ditentukan;
  • sort -n - pengisihan berangka;
  • perbezaan - perbandingan fail;
  • grep , grep -v , grep -w , grep "\ " , grep -E - cari teks;
  • uniq , uniq -c - keunikan rentetan;
  • awk - dalam pilihan awk "(cetak $1)", untuk meninggalkan hanya medan pertama dari setiap baris, $1 boleh ditukar kepada $2, $3, dsb.;

Diagnostik sistem

  • ps axuww - maklumat tentang proses (menjalankan program) yang berjalan pada mesin;
  • atas - tontonan interaktif proses yang paling intensif sumber;
  • df - ruang cakera terpakai dan kosong;
  • du - jumlah saiz fail dalam direktori (secara rekursif dengan subdirektori);
  • strace , ktrace - sistem apa yang dipanggil proses membuat;
  • lsof - fail apa yang digunakan oleh proses;
  • netstat -na, netstat -nap - port dan soket yang dibuka dalam sistem.

Anda mungkin tidak mempunyai beberapa program; ia perlu dipasang tambahan. Di samping itu, beberapa pilihan program ini hanya tersedia untuk pengguna istimewa (root).

Pelaksanaan pukal dan separa automatik

Pada mulanya, langkau bahagian ini; anda memerlukan arahan dan binaan ini apabila anda sampai ke skrip shell mudah.
  • ujian - memeriksa keadaan;
  • manakala baca - gelung baris demi baris STDIN ;
  • xargs - penggantian rentetan daripada STDIN ke dalam parameter program yang ditentukan;
  • seq - penjanaan jujukan nombor asli;
  • () - menggabungkan output beberapa arahan;
  • ; - lakukan satu demi satu perkara;
  • && - laksanakan jika arahan pertama berjaya diselesaikan;
  • || - jalankan jika arahan pertama gagal;
  • tee - salin output program ke STDOUT dan ke fail pada cakera.

Macam-macam

  • tarikh - tarikh semasa;
  • curl - memuat turun dokumen dari url yang ditentukan dan menulis hasilnya ke STDOUT;
  • sentuh - kemas kini tarikh pengubahsuaian fail;
  • bunuh - hantar isyarat kepada proses;
  • benar - tidak melakukan apa-apa, mengembalikan benar, berguna untuk mengatur gelung kekal;
  • sudo - laksanakan arahan sebagai root "a.

Mewujudkan saluran paip satu pelapik

Mari kita lihat contoh tugas sebenar: kita perlu mematikan semua proses tugas-6-pelayan yang berjalan sebagai pengguna semasa.

Langkah 1.
Fahami program yang menghasilkan kira-kira data yang diperlukan, walaupun tidak dalam bentuk tulennya. Untuk tugas kami, adalah bernilai mendapatkan senarai semua proses dalam sistem: ps axuww. Pelancaran.

Langkah 2.
Lihat data yang diterima dengan mata anda, buat penapis yang akan membuang beberapa data yang tidak diperlukan. Ini selalunya grep atau grep -v . Gunakan kekunci "Naik" untuk mengeluarkan perintah sebelumnya daripada sejarah, tetapkan penapis yang dicipta kepadanya dan jalankannya.

Ps axuww |grep `whoami`
- hanya proses pengguna semasa.

Langkah 3.
Ulangi langkah 2 sehingga anda mendapat data bersih yang anda perlukan.

"
- semua proses dengan nama yang diperlukan (tambah, mungkin, proses tambahan seperti vim task-6-server.c, dll.),

Ps axuww |grep `whoami` | grep "\ " | grep -v vim ps axuww |grep `whoami` | grep "\ " | grep -v vim |grep -v less
- hanya proses dengan nama yang diperlukan

Ps axuww |grep `whoami` | grep "\ " | grep -v vim |grep -v less |awk "(cetak $2)"

Pids proses yang diperlukan, langkah 3 selesai

Langkah 4.
Gunakan pengendali akhir yang sesuai. Menggunakan kekunci "Naik", kami mengeluarkan arahan sebelumnya dari sejarah dan menambah pemprosesan yang akan menyelesaikan penyelesaian kepada masalah:

  • |wc -l untuk mengira bilangan proses;
  • >pids untuk menulis pids ke fail;
  • |xargs kill -9 kill proses.

Tugas latihan

Ingin berlatih kemahiran baru? Cuba tugasan berikut:
  • dapatkan senarai semua fail dan direktori dalam direktori rumah anda;
  • dapatkan senarai semua artikel lelaki dari kategori 2 (panggilan sistem);
  • kira berapa kali perkataan grep muncul dalam halaman manual program grep;
  • kira berapa banyak proses sedang berjalan sebagai akar;
  • cari arahan yang muncul dalam bilangan maksimum kategori bantuan (lelaki);
  • kira berapa kali perkataan var muncul pada halaman ya.ru.
Petunjuk: anda perlu find , grep -o , awk "(print $1)" , ungkapan biasa dalam grep , curl -s .

Apa yang perlu dipelajari seterusnya?

Jika anda mula menyukai baris arahan, jangan berhenti, teruskan meningkatkan kemahiran anda.

Berikut adalah beberapa program yang pasti akan berguna jika anda tinggal di baris arahan:

  • cari dengan pilihan yang kompleks
  • apropos
  • cari
  • telnet
  • netcat
  • tcpdump
  • rsync
  • skrin
  • zgrep, zless
  • visudo
  • crontab -e
  • hantar surat
Di samping itu, dari masa ke masa adalah berbaloi untuk menguasai beberapa jenis bahasa skrip, seperti perl atau python, atau bahkan kedua-duanya.

Siapa yang memerlukan ini?

Adakah berbaloi untuk mempelajari baris arahan dan skrip shell hari ini? Pasti berbaloi. Saya akan berikan hanya beberapa contoh keperluan Facebook untuk calon yang ingin mendapatkan pekerjaan di FB.

Mana-mana OS sejagat perlu banyak memikirkan pengguna dan tugasnya sendiri. Hanya sebahagian kecil daripada aktiviti ini boleh diprogramkan sekali dan untuk semua ke dalam kernel. Kebanyakan logik untuk menguruskan tugas dan sistem itu sendiri mesti tersedia kepada pentadbir dalam bentuk projek, jika tidak, dia tidak akan dapat memahami apa yang berlaku dalam sistem, apalagi mengubahnya. Perlu melihat lebih dekat pada alat yang digunakan dalam UNIX untuk menetapkan algoritma untuk banyak bahagian sistem - jurubahasa arahan, cangkerang. Ternyata shell berfungsi dengan baik bukan sahaja dalam dialog dengan pengguna, tetapi juga bagaimana pelaku skrip, Dan bagaimana cara mengatur interaksi antara tugas dalam sistem.

Mari kita mulakan dengan fakta bahawa cangkerang adalah sepenuhnya bahasa pengaturcaraan, dan, seperti banyak jurubahasa, pada tahap yang agak tinggi. Jika tugas itu sekali sahaja (tiada keperluan untuk kelajuan, keserasian dan mudah alih) dan agak abstrak (tiada sambungan kepada struktur data kompleks tertentu), kemungkinan besar ia boleh diselesaikan, menulis skrip arahan- program shell.

Sebaliknya, seseorang tidak boleh menghadkan dirinya kepada kesempurnaan algoritma apabila menyelesaikan masalah dalam sistem. Sebagai contoh, mesin Turing [9] adalah sangat mudah dan lengkap dari segi algoritma, tetapi hanya sedikit yang berfikir untuk mengatur dialog dengan pengguna atau mengawal OS itu sendiri berdasarkan modelnya. Di sini harus diingat bahawa shell juga merupakan pelaksana arahan: ia mudah berkomunikasi dengan UNIX dan utiliti. Ini bermakna dengan menambahnya dengan mekanisme untuk interaksi terkawal arahan dengan sistem dan antara satu sama lain, kita akan mendapat penyepadu yang baik (atau shell - yang, sebenarnya, adalah terjemahan perkataan cangkerang).

Bahagian yang terbaik ialah shell boleh atur cara sedemikian tidak akan melampaui skop Y: jika, sebagai warisan penjelmaan interaktif shell, kita boleh dengan mudah beralih kepada penyelesaian kepada subtugas mana-mana Utiliti UNIX, sama sekali tidak perlu menduplikasinya dalam bahasa, dan hanya abstraksi algoritma dan penyelarasan akan kekal di sana.

Senario

Sebelum mempertimbangkan keupayaan shell dari dua sudut, mari kita selesaikan kesukaran ini. Katakan kami menulis program dalam bahasa beberapa jurubahasa, contohnya /bin/sh, dan menulisnya ke fail tertentu, contohnya /home/george/myscript (jika /home/george ialah direktori semasa, anda boleh gunakan laluan yang lebih pendek: myscript) . Bagaimanakah saya boleh menjalankan skrip ini sekarang? Dari man sh kita tahu bahawa untuk melakukan ini kita boleh berlari jurubahasa arahan dengan parameter - nama fail:

$ cat myscript echo "Hello, George!" $ /bin/sh myscript Hello, George!

Adakah mungkin dilakukan tanpa nama program yang mentafsir skrip? Secara umumnya, tidak: UNIX mempunyai banyak penterjemah yang berbeza dengan sintaks yang berbeza, contohnya pemproses teks awk, penstriman penyunting teks sed, universal bahasa pengaturcaraan python dan perl dan banyak lagi. Semua bahasa ini mempunyai keupayaan untuk memasukkan ulasan baris ke dalam teks skrip, yang bermula dengan aksara "#" dan berakhir pada penghujung baris. Oleh itu, jika skrip bermula dengan aksara "#!", salah satu daripada penterjemah ini akan mengabaikan keseluruhan baris pertama sebagai ulasan. Sistem, melihat "#!" pada permulaan fail, faham bahawa ini ialah skrip. Daripada aksara ketiga ke penghujung baris, ia membaca nama program yang mana ia menghantar fail ini untuk pelaksanaan. Ini bermakna jika baris pertama dalam /home/george/myscript ialah #!/bin/sh , anda boleh menjadikannya boleh laku dengan selamat (tetapkan bit penggunaan) dan jalankannya:

$ chmod +x myscript $ cat myscript #!/bin/sh echo "Hello, $1!" $ ./myscript George Hello, George!

Tegasnya, selepas "#!" ia boleh menjadi apa sahaja, contohnya nama program yang kami tulis dengan beberapa parameter yang diperlukan; UNIX akan melancarkannya dan menyampaikannya sebagai pilihan baris arahan parameter yang diperlukan (jika ada), kemudian nama skrip dan semua yang datang selepas (dalam contoh kami George ). Jika selepas "#!" akan ada fail yang tidak wujud, sistem akan mengeluarkan mesej ralat:

$ cat myscript #!/bad/sh echo "Hello, $1!" $ ./myscript ./myscript: tidak dijumpai

Sila ambil perhatian bahawa mesej ini kononnya membayangkan bahawa fail skrip itu sendiri tidak ditemui. Sekiranya anda tidak mengetahui latar belakang fenomena tersebut, keadaan kelihatan mencurigakan. Hakikatnya ialah apabila menjalankan sebarang program, UNIX Sentiasa lulus satu parameter (yang mempunyai indeks 0) - nama program ini. Tetapi jika skrip dijalankan, pengendali akan menerima sebagai parameter null bukan namanya sendiri, tetapi nama skrip. Dan apabila sistem tidak menjumpai pengendali ini, ia akan disebut di bawah nama baharu dalam mesej ralat.

Sarang kerang

Dan satu lagi nota penting. Pada mulanya hanya ada satu dalam UNIX jurubahasa arahan, ditulis oleh Stephen Bourne, dan ia hanya dipanggil "shell" (iaitu shell, dan nama utiliti ialah sh untuk pendek). Ia adalah program kecil yang sangat mudah, ia berfungsi dengan sempurna sebagai penyepadu sistem, tetapi dalam semua aspek lain ia agak lemah. Oleh itu, pencipta 3BSD terfikir bahawa mereka memerlukan yang baru sepenuhnya jurubahasa arahan, lebih mudah apabila bekerja pada baris arahan, dengan keupayaan pengaturcaraan baharu dan sintaks baharu yang hampir dengan bahasa C, yang sudah biasa kepada mana-mana pengaturcara UNIX. Shell yang dihasilkan dipanggil C shell (untuk sintaks arahan; nama utiliti ialah csh), ia jauh lebih berkuasa daripada yang lama, ia termasuk bekerja dengan sejarah, melengkapkan nama fail, pengurusan kerja; tatasusunan dan banyak lagi muncul.

Bahasa pengaturcaraan shell mempunyai beberapa binaan yang akan memberikan fleksibiliti kepada program anda:

  • Ulasan akan membolehkan anda menerangkan fungsi program;
  • "dokumen di sini" membolehkan anda memasukkan baris dalam shell program yang akan diubah hala sebagai input kepada beberapa arahan shell program;
  • Perintah keluar membolehkan anda menamatkan program pada titik yang dikehendaki dan menggunakan kod pulangan;
  • Pembinaan gelung untuk dan sementara membolehkan anda mengulang sekumpulan arahan dalam gelung;
  • arahan bersyarat jika dan kes melaksanakan sekumpulan arahan jika beberapa syarat dipenuhi;
  • Perintah break membolehkan anda keluar tanpa syarat daripada gelung.

9.3.1. Komen

Untuk meletakkan ulasan dalam program, gunakan tanda #. Jika tanda # muncul selepas arahan, arahan itu sendiri dilaksanakan dan ulasan diabaikan. Format baris ulasan:

#komen

9.3.2. "Dokumen di sini"

"Dokumen di sini" membolehkan anda meletakkan baris dalam program shell yang diubah hala sebagai input arahan dalam program itu. Ini adalah salah satu cara untuk menyediakan input untuk arahan dalam program shell tanpa menggunakan fail berasingan. Entri terdiri daripada aksara ubah hala<< и разделителя, который указывает начало и конец строк ввода. В качестве разделителя может использоваться один символ или строка символов. Чаще всего это знак!.

Format arahan adalah seperti berikut:

Perintah<...baris input... pembatas

9.3.3. Menggunakan ed dalam program shell

"Dokumen di sini" mencadangkan cara untuk menggunakan ed dalam program shell. Katakan anda ingin mencipta program shell yang akan memanggil editor ed, membuat perubahan global pada fail, menulis perubahan pada fail, dan kemudian keluar dari ed. Skrin berikut menunjukkan kandungan program ch.text, yang melaksanakan tugas ini:

$ cat ch.text echo Taipkan nama fail baca file1 echo Taipkan teks yang tepat untuk ditukar. baca old_text echo Taipkan teks baharu yang tepat untuk menggantikan yang di atas. baca new_text ed - $file1<

Perhatikan tanda - (tolak) dalam arahan ed. Pilihan ini menghalang pembilang aksara daripada dicetak pada skrin. Juga perhatikan format arahan ed untuk penggantian global:

G/$old_text/s//$new_text/g

Program ini menggunakan 3 pembolehubah: file1, old_text, new_text. Apabila dijalankan, program ini menggunakan arahan baca untuk mendapatkan nilai pembolehubah ini. Pembolehubah ini mengandungi maklumat berikut:
fail - nama fail yang akan diedit;
old_text - teks yang akan ditukar;
new_text - teks baharu.

Pembolehubah diperkenalkan ke dalam program, di sini dokumen mengubah hala perintah ganti global, arahan tulis, dan perintah tamat kepada arahan ed. Jalankan program ch.text. Dapatkan skrin berikut:

$ch.text Taipkan memo nama fail Taipkan teks yang tepat untuk ditukar. Sayangku John: Taipkan teks baharu yang tepat untuk menggantikan yang di atas. Mengenai perkara yang berkaitan: $ memo kucing Mengenai perkara yang berkaitan: $

9.3.4. Kod penyiapan

Kebanyakan arahan shell mengembalikan kod yang menunjukkan sama ada arahan itu berjaya diselesaikan. Jika nilai pulangan ialah 0 (sifar), maka arahan itu berjaya diselesaikan. Kod pemulangan tidak dicetak secara automatik, tetapi boleh diperolehi sebagai nilai parameter shell $?

9.3.4.1. Menyemak kod penyiapan

Selepas menjalankan arahan secara interaktif, anda boleh melihat kod keluar apabila anda menaip:

Pertimbangkan contoh berikut:

$ cat hi Ini fail hi. $echo$? 0 $ kucing hello kucing: tidak boleh membuka hello $ echo $? $2

Dalam kes pertama, fail hi wujud dalam direktori anda dan anda telah membaca kebenaran. Menggunakan arahan kucing anda boleh mencetak kandungan fail. Hasil daripada arahan kucing ialah kod pulangan 0, yang anda akan dapat dengan menentukan parameter $? Dalam kes kedua, fail sama ada tidak wujud atau anda tidak mempunyai kebenaran membaca. Perintah kucing mencetak mesej diagnostik dan mengembalikan kod 2.

program shell keluar seperti biasa apabila arahan terakhir dalam fail dilaksanakan. Walau bagaimanapun, anda boleh menggunakan arahan keluar untuk menamatkan program. Lebih penting lagi, anda boleh menggunakan arahan keluar untuk mendapatkan kod pengembalian program shell.

9.3.5. Kitaran

Penyataan gelung untuk dan sementara membolehkan anda melaksanakan perintah atau urutan arahan beberapa kali.

9.3.5.1. untuk kenyataan

Pernyataan for melaksanakan urutan arahan untuk setiap elemen senarai. Ia mempunyai format:

Untuk pembolehubah dalam senarai_nilai buat perintah_1 perintah_2 . . . perintah terakhir selesai

Untuk setiap lelaran gelung, elemen senarai seterusnya diberikan kepada pembolehubah yang diberikan dalam pernyataan for. Pembolehubah ini boleh dirujuk di mana-mana dalam arahan dalam pernyataan do. Apabila membina setiap bahagian arahan, anda perlu memastikan bahawa untuk setiap tindakan terdapat yang sepadan dilakukan pada penghujung gelung.

Pembolehubah boleh mempunyai sebarang nama. Sebagai contoh, jika pembolehubah anda dinamakan var, maka rujukan kepada $var dalam senarai arahan akan menjadikan nilai tersedia. Jika operator in diabaikan, maka nilai untuk var akan menjadi set argumen yang diberikan dalam arahan dan tersedia dalam parameter khas $*. Senarai arahan antara kata kunci yang dilakukan dan yang telah dilakukan akan dilaksanakan untuk setiap nilai.

Apabila arahan dilaksanakan untuk elemen terakhir senarai, atur cara akan melaksanakan baris di bawah selesai.

9.3.5.2. manakala kenyataan

Operator gelung semasa menggunakan 2 kumpulan arahan. Ia akan melaksanakan urutan arahan dalam kumpulan kedua (senarai do ... done) sehingga arahan terakhir dalam kumpulan pertama (senarai while) kembali benar, bermakna ungkapan selepas do boleh dilaksanakan.

Format umum pernyataan gelung while ialah:

manakala perintah_1 . . . perintah terakhir buat perintah_1 . . . perintah terakhir selesai

Contohnya, program enter.name menggunakan gelung sementara untuk memasukkan senarai nama ke dalam fail. Program ini terdiri daripada baris arahan berikut:

$ cat enter.name semasa membaca x lakukan echo $x>>xfile done $

Selepas membuat beberapa penambahan, kami mendapat program berikut:

$ cat enter.name echo Sila taipkan nama setiap orang dan daripada a echo Sila tamatkan senarai nama dengan a<^d>manakala baca x do echo $x>>xfile done echo xfile mengandungi nama berikut: cat xfile $

Ambil perhatian bahawa selepas gelung selesai, program melaksanakan arahan di bawah selesai.

Dua arahan gema pertama menggunakan aksara khas, jadi anda mesti menggunakan petikan untuk melarikan diri daripada makna istimewa. Skrin berikut menunjukkan output enter.name:

$enter.name Sila taip nama setiap orang dan daripada a Sila tamatkan senarai nama dengan a<^d>Mary Lou Janice <^d>xfile mengandungi nama berikut: Mary Lou Janice $

Selepas gelung selesai, program akan mencetak semua nama yang terkandung dalam xfile.

9.3.6. Menggunakan /dev/null

Sistem fail mempunyai fail /dev/null di mana anda boleh menyimpan output yang tidak diingini. Sebagai contoh, jika anda hanya memasukkan arahan who, sistem akan menjawab siapa yang bekerja pada sistem. Jika anda mengalihkan output arahan ini ke /dev/null:

Siapa > /dev/null

maka anda tidak akan mendapat jawapan.

9.3.7. Kenyataan bersyarat

jika...maka kenyataan

Perintah if memberitahu program shell untuk melaksanakan urutan arahan selepas itu jika arahan terakhir dalam senarai perintah pernyataan if berjaya diselesaikan. Jika binaan berakhir dengan kata kunci fi.

Format umum binaan if ialah:

Jika perintah_1 . . . perintah terakhir kemudian perintah_1 . . . perintah terakhir fi

Sebagai contoh, program shell carian menunjukkan penggunaan if ... then construct. Program carian menggunakan arahan grep untuk mencari perkataan dalam fail. Jika grep berjaya, program memaparkan perkataan yang ditemui. Skrin akan kelihatan seperti ini:

$ carian kucing echo Taipkan perkataan dan nama fail. baca fail perkataan jika grep $word $file kemudian echo $word berada dalam $file fi $

Program ini memaparkan output arahan grep. Jika anda ingin menyimpan respons sistem kepada arahan grep dalam program anda, gunakan fail /dev/null, tukar baris arahan if kepada yang berikut:

Jika grep $word $file > /dev/null

Sekarang jalankan arahan carian. Ia hanya akan bertindak balas dengan mesej yang ditentukan selepas arahan gema.

Pembinaan if ... then ... else boleh melaksanakan set arahan alternatif selepas else jika urutan if adalah palsu. Format binaan ini adalah seperti berikut:

Jika perintah_1 . . . perintah terakhir .linthen perintah_1 . . . perintah terakhir lain perintah_1 . . . perintah terakhir fi

Dengan binaan ini, anda boleh menambah baik program carian supaya ia akan memberitahu anda kedua-dua perkataan yang ditemui dan perkataan yang tidak dijumpai. Dalam kes ini, program carian akan kelihatan seperti ini:

$ carian kucing echo Taipkan perkataan dan nama fail. baca fail perkataan jika grep $word $file > /dev/null kemudian echo $word berada dalam $file else echo $word BUKAN dalam $file fi $

perintah ujian

Perintah ujian digunakan untuk mengatur gelung. Ia menguji syarat tertentu untuk kebenaran dan berguna untuk mengatur struktur bersyarat. Jika keadaan adalah benar, gelung akan diteruskan. Jika syarat adalah palsu, gelung akan tamat dan arahan seterusnya akan dilaksanakan. Beberapa contoh menggunakan arahan ujian:

Ujian -r fail benar jika fail itu wujud dan boleh dibaca; fail ujian -w benar jika fail itu wujud dan boleh ditulis; fail ujian -x benar jika fail wujud dan boleh dilaksanakan; fail ujian -s benar jika fail itu wujud dan mempunyai sekurang-kurangnya satu aksara; uji var1 -eq var2 benar jika var1 sama dengan var2; uji var1 -ne var2 benar jika var1 tidak sama dengan var2.

Contoh. Mari buat program shell yang mengalihkan semua fail boleh laku dari direktori semasa ke direktori bin anda. Untuk melakukan ini, kami akan menggunakan perintah test -x untuk memilih fail boleh laku. Program mv.file akan kelihatan seperti ini:

$ kucing mv.file taip gema dalam laluan baca laluan direktori untuk fail lakukan jika ujian -x $fail kemudian mv $fail $laluan/$fail fi selesai $

Kes ... pembinaan esac membolehkan anda memilih salah satu daripada beberapa corak dan kemudian melaksanakan senarai arahan untuk corak itu. Ungkapan corak mesti bermula dengan kata kunci dalam, dan kurungan kanan mesti diletakkan selepas aksara terakhir setiap corak. Urutan arahan untuk setiap corak berakhir dengan dua aksara;;. Pembinaan kes mesti ditamatkan dengan kata kunci esac.

Format umum binaan kes ialah:

Perkataan kes dalam corak1) baris arahan 1 . . . baris arahan terakhir ;;corak2) baris arahan 1 . . baris arahan terakhir ;;corak3) baris arahan 1 . . baris arahan terakhir ;; *)baris arahan 1 . . baris arahan terakhir ;;esac

Konstruk kes cuba mencari perkataan dengan pola pola dalam bahagian pola pertama. Jika carian berjaya, program melaksanakan baris arahan selepas corak pertama sehingga aksara yang sepadan;;.

Jika templat pertama tidak dijumpai, maka peralihan ke templat kedua dijalankan. Jika mana-mana corak ditemui, atur cara tidak mempertimbangkan corak yang tinggal, tetapi beralih kepada arahan berikutan esac. * digunakan sebagai corak untuk mencari sebarang perkataan dan dengan itu memberikan anda satu set arahan yang akan dilaksanakan jika tiada corak lain ditemui. Oleh itu, corak asterisk (*) diletakkan sebagai corak terakhir dalam binaan kes supaya corak lain disemak terlebih dahulu. Ini akan membantu anda mengesan input yang salah dan tidak dijangka.

Templat boleh menggunakan aksara meta *, ?, . Ini memberikan fleksibiliti program.

Mari kita lihat satu contoh. Program set.term menetapkan pembolehubah TERM mengikut jenis terminal yang anda gunakan. Baris arahan berikut digunakan:

TERM=terminal_name

Templat * ialah yang terakhir dalam senarai templat. Ia mengeluarkan mesej amaran bahawa tiada corak padanan untuk jenis terminal yang ditentukan dan membolehkan anda melengkapkan binaan kes.

$ kucing set.term echo Jika anda mempunyai jenis TTY 4420 dalam 4420 echo Jika anda mempunyai jenis TTY 5410 dalam 5410 echo Jika anda mempunyai jenis TTY 5420 dalam 5420 baca istilah case term dalam 4420) TERM-T4 ;; 5410) JANGKA-T5 ;; 5420) JANGKA-T7 ;; *) echo bukan jenis terminal correcr ;; esac eksport TERM gema tamat program $

9.3.8. Pemindahan kawalan tanpa syarat

Perintah break tanpa syarat menghentikan pelaksanaan mana-mana gelung di mana ia ditemui dan memindahkan kawalan kepada perintah berikutan kata kunci selesai, fi atau esac.

Dalam contoh atur cara set.term sebelumnya, anda boleh menggunakan perintah break dan bukannya gema untuk keluar dari program, seperti dalam contoh berikut:

$ kucing set.term echo Jika anda mempunyai jenis TTY 4420 dalam 4420 echo Jika anda mempunyai jenis TTY 5410 dalam 5410 echo Jika anda mempunyai jenis TTY 5420 dalam 5420 baca istilah case term dalam 4420) TERM-T4 ;; 5410) JANGKA-T5 ;; 5420) JANGKA-T7 ;; *) rehat ;; esac eksport TERM gema tamat program $

Arahan continue akan menyebabkan atur cara segera beralih ke lelaran sementara atau untuk gelung seterusnya tanpa melaksanakan perintah yang tinggal dalam gelung.