Unix komandinės eilutė

Šis puslapis yra įvadas į Unix apvalkalo programas (shell scripts). Pradžioje dėmesys sutelkiamas vien į bendruosius „Unix“ komandinės eilutės klausimus. Visi čia pateikiami pavyzdžiai buvo patikrinti Aix 6.1.8.0 aplinkoje.

Šio straipsnelio tęsinys: Programavimas Unix apvalkalo aplinkoje,   o pabaiga - Veikimo valdymas Unix skriptuose 

Įvadas

Unix apvalkalas (shell) yra komandinės eilutės interpretatorius, įvykdantis vieną ar kelias komandinėje eilutėje įvestas „Unix“ komandas.

Galima kelias komandas užrašyti vienoje eilutėje, jas atskiriant kabliataškiais (;). To patikrinimui, susikurkime pirmąją programėlę (be abejo, tai „Labas, pasauli!“) - į failą „first.sh“ rašykime eilutę:
echo "Labas, pasauli!"

Tada įvykdykime tokią „sudėtinę“ komandą:
ls f* ; cat first.sh

Jos rezultatas:
first.sh
echo "Labas, pasauli!"

Dabar kartu galime peršokti ir prie mūsų pirmosios programėlės vykdymo. Pirmiausia, nustatykime, kad tai“vykdomasis“ failas, ką galime padaryti komanda:
chmod a+x first.sh

O tada ją vykdome:
./first.sh

Atsakymas:
Labas, pasauli!

Vykdymas buvo atliktas tuo metu veiksniame Unix branduolio apvalkale (shell). Tačiau galima programą vykdyti ir norimu (kitu) interpretatoriumi, pvz.,

ksh first.sh
arba
bash first.sh

O jeigu norime, kad programa visada būtų vykdomu kokiu nors vienu pasirinktu interpretatoriu, tai galime nurodyti pačiame programos tekste, pvz.,

#!/bin/bash

echo "Labas, pasauli!"

Specialūs simboliai

Yra keli specialūs komandinėje eilutėje naudojami simboliai: \ - po jo einančio simbolio (pvz., specialaus panaudojimas juo pačiu) reikšmės naudojimas > - komandos rezultatą užrašyti nurodytame faile (o ne pavaizduoti ekrane); < - įvedimo duomenis komandai reikia paimti iš nurodyto failo (pavyzdžiai bus vėlesniuose aptarimuose); | - “konvejeris“ - pirmos komandos išvedimo tekstas perduodamas kaip įvedimo tekstas kitai komandai; & - simbolis eilutės gale nurodo, kad komandą (pvz., ilgai trunkančią) reikia vykdyti foniniu režimu. Kol ji vykdoma, galima lygiagrečiai vykdyti kitas (tolimesnes) komandas.

Pvz.,

1. su \:

echo Tekstas \
per dvi eilutes
echo "Labas, \"pasauli\”!"

Tekstas per dvi eilutes
Labas, "pasauli"!

2. Su >

ls f* ; cat first.sh >rez.log

Ekrane bus pateikta:
first.sh
o faile rez.log įrašyta:
echo "Labas, pasauli!"

Pastaba: Taip yra todėl, kad simbolis “>” taikytas ne visai komandinei eilutei, o tik antrajai komanda (prie kurios jis ir buvo įrašytas). Jei norime, kad į failą būtų surašytas tik pirmos komandos rezultatas, turime užrašyti taip:
ls f* >rez.log ; cat first.sh

Tada ekrane bus pateikta:
echo "Labas, pasauli!"
o į failą rez.log įrašyta:
first.sh

3. Su |

ls f* | cat

Ekrane bus pateikta:
first.sh

Paaiškinimas: į ekraną tekstą išvedė komanda cat, kuri duomenis gavo iš ankstesnės komandos ls f*

Kartais norima užsitikrinti, kad nukreipimas neužrašytų ant jau egzistuojančių failų. To išvengimui galime įvykdyti komandą:
set -o noclobber

Tačiau ir šiuo atveju lieka galimybė juos „uždengti, - kai nukreipimas atliekamas panaudojant „>|” konstrukciją, pvz.,
ls f*.sh >| rez.log

Taip pat yra trys skaitiniai „kanalai“, kurie gali būti naudojami nukreipimuose:
0 – standartinis įvedimo srauto kanalas;
1 – standartinis išvedimo srauto kanalas;
2 – standartinis klaidų išvedimo kanalas.

Pvz., - išvedimas nukreipiamas į standartinį klaidų kanalą:
ls f*.sh > &2

Papildomai:

&& nurodo, kad kitą komandą reikia vykdyti tik tada, jei pirmoji buvo įvykdyta sėkmingai, pvz.,
cat xxx.txt && ls
tuo atveju, jei failo xxx.txt nėra, failų sąrašo nepateiks ir į ekraną išduos klados pranešimą:
cat: 0652-050 Cannot open xxx.txt.

|| - užtikrina sąlyginį vykdymą komandos priklausomai nuo pirmos komandos vykdymo sekmės. Pvz., tokia konstrukcija sukurs katalogą „aplankas“, jei jo nebuvo:
ls aplankas || mkdir aplankas

Pastaba: klaida į ekraną vis tiek bus pateikta:
ls: 0653-341 The file aplankas does not exist.

Komandas galima grupuoti riestiniais skliaustais, pvz.,
{sort | grep 'Vilnius' } < miestai.txt >vilnius.txt

Daugybinis nurodymas:

* - bet kokių simbolių seka;
? - vienas simbolis;
! - priešingai;
[abc] – simbolių sąrašas; intervalas per „-“

Pvz.,
ls [fh]*
Išvardinti visus failus, kurių vardas prasideda „f“arba „h“ raide. raide.

ls [!f].sh
Išvardinti visus failus, kurių vardas neprasideda „f“ raide.

echo -e "Tekstas per \ndvi eilutes"
Čia -e raktas nurodo, kad leidžiama apdoroti „\“ įtraukas.

Prieš vykdant komandinę eilutę, išplėtimas ir pakeitimas joje vyksta tokia tvarka:
riestiniai skliaustai […];
tildė ~;
parametrų įstatymas;
komandos įstatymas;
suskaidymas į žodžius;
kelio įstatymas

Komandinės eilutės interpretatoriai

Vartotojui priskiriamas konkretus komandinės eilutės interpretatorius, kuris įkeliamas jam prisijungus. Naujo interpretatoriaus įkėlimui surinkite jo vardą, pvz.,
bash

Priskirtas interpretatoriaus vardas saugomas aplinkos kintamajame $SHELL. Pvz., jo pasižiūrėjimui:
echo $SHELL

Pastaba: tačiau $SHELL saugo tik pradinio interpretatoriaus vardą. Norint sužinoti interpretatorių, kuris veiksnus, reikia kitaip suktis. Daugelyje aplinkų (bet ne visose) tai galima sužinoti šios komandos dėka:
ps -p $$

Ji pateikia tokio tipo informaciją:

      PID    TTY  TIME CMD
  3145790  pts/7  0:00 bash

Išeiti iš interpretatoriaus galima su komanda
exit

Koks kelias iki interpretatoriaus:
which bash

Visų interpretatorių sąrašas surašytas faile /etc/shells Interpretatorių galima pasikeisti arba chsh arba passwd -s komandomis.

Interpretatorių yra gana daug. Čia paminėsime keletą pagrindinių:

sh - originalusis Unix interpretatorius, vadinamas Bourne interpretatoriumi;
ksh – Korno interpretatorius, sukurtas D. Korno 9-o dešimtm. pradžioje. Jis suderinamas su Bourne interpretatoriumi ir įtraukia nemažai csh savybių;
bash – 1989 m. Brian Fox'o sukurtas interpretatorius GNU projekto ribose kaip nemokama Bourne interpretatoriaus versija. Papildomai turi vykdytų komandų istoriją. Pavadinimas yra „Bourne-again shell“ santrumpa.
csh, dažnai vadinamas C-apvalkalu, remiasi į C kalbą panašia sintake ir įtraukia daugiau galimybių.Tačiau jis neleidžia vykdyti Bourne interpretatoriui parengtų programų;
tcsh (TENEX C-shell) išsivystė iš csh, ištaisydamas kai kuriuos šio trūkumus. Jis leidžia redaguoti komandines eilutes ir turi vykdytų komandinių eilučių istoriją. Tačiau jis nepalaiko Bourne interpretatoriaus programų.

Be šių (ir įvairių jų atmainų) dar yra nemažai kitų, rečiau naudojamų komandinės eilutės interpretatorių. Kelis jų paminėsime:
rc interpretatoriui komandų sintaksė panaši į Bourne interpretatorių, tik ji supaprastinta. Valdančios struktūros panašios į esančias C kalboje;
pdksh – viešoji (public domain) ksh versija;
zsh – tolimesnis bash išplėtimas, įtraukiantis rašybos tikrintuvą; psh - Perl interpretatorius, apjungiantis bash galimybes su Perl kalbos jėga;
tsh (tiny shell) - parašytas „Python“ kalba, suteikia labai ribotas galimybes naudotis operacine sistema. Tinka priskirti vartotojams, kuriems apribojamos galimybės.

Tekstinių redaktorių panaudojimas

Kitaip nei įprasti tekstų redaktoriai, sed yra komandinės eilutės (neinteraktyvus) tekstų redaktorius. Jis apdoroja vieną įvedimo eilutę ir rezultatą pateikia į standartinį išvedimo srautą. Paprasčiausiu atveju sed veikia kaip filtras, tekste ieškantis tam tikro šablono ir, radęs šabloną tenkinantį teksto fragmentą, atliekantis nurodytus veiksmus. sed dažnai naudojamas teksto pakeitimui, tačiau galima naudoti ir teksto papildymui, pašalinimui ar pateikimui.

sed veikia taip: taikoma nurodytas komandas pirmajai eilutei, o tada skaito po vieną kitas... Tad į atmintį niekada nebūna įkeltas visas failas.

sed operacijas galima vykdyti:

  • panaudojant -f raktą (pvz., sed -f komandos.sed tekstas.txt);
  • sukuriant vykdomąjį sed failą (prasidedantį #!/usr/bin/sed -f)

sed perduodama komanda turi šias komponentes:

  • redagavimo komandą;
  • reguliariąją išraišką ir šabloną;
  • pakaitalo tekstą (pvz., sed 's/^Diena/Naktis/' eilutės pradžioje esantį žodį „Diena“ pakeičia į „Naktis“.

Reguliariosiose išraiškose dažniausiai naudojami simboliai:
^ - eilutės pradžia;
$ - eilutės pabaiga;
* - bet kokie simboliai;
? - bet koks vienas simbolis;
[ ] - bet kuris iš nurodytų simboliai, pvz., [Aa]

Pavyzdžiai:

sed 's/ *$//' tekstas.txt – pašalina eilutės gale esančius tarpus;
sed 's/^ *//' tekstas.txt – pašalina eilutės pradžioje esančius tarpus; sed 's/[ ] [^ ]*$/toliau/' tekstas.txt – kiekvienos eilutės paskutinį žodį pakeičia į „toliau“

Be pakeitimo (s) komandos dar galima naudoti įterpimo (į), papildymo (a) ir šalinimo (d) komandas. Pvz., paskutinę teksto eilutę pašalins tokia komanda:
sed '$d' a.txt

Šio skyrelio tikslas tebuvo supažindinti su sed, tad labai neišsiplėsime ties šia tema. Ji leidžia netgi sąlyginį komandų vykdymą (ir ciklų organizavimą). Užbaigdami pateksime pavyzdėlį, pateikiantį visas eilutes, kuriose yra žodis Unix:

sed -n "/Unix/p" a.txt

Pastaba: Unix skriptuose tekstų tvarkymui galima panaudoti ir awk utilitą – skaitykite „Įvadą į AWK“.

Skaitykite tęsinį: Programavimas Unix apvalkalo aplinkoje
ir pabaigą -- Veikimo valdymas Unix skriptuose

Ankstesnės "Advanced HTML" skyrelio temos:
Tcl kalba
Programavimas Unix aplinkoje
Ateities kalbos?
JavaScript pradmenys
Pitonas, kandantis sau uodegą
Lambda išraiškos – Java į naują lygį
AWK kalba - sena ir nuolat aktuali
CGI.pm biblioteka: sausainiai
Ką delne mums neša HTML 4.0?
Kaip valdyti piešinių pakrovimo tvarką
Kaip lankytoją nukreipti į kitą WWW puslapį
Įlįskite į lankytojų kailį
Dygios JavaScript eilutės
Vaizdi rašysena - VB Script
Tiesa apie REST
Ruby on Rails

Debesies architektūra
Sveikųjų skaičių žaidimai
Pelė uodega švystelėjo...
Viešojo rakto kriptografija
Programavimo kalbų klegesys
Pirmoji programuotoja: Ada Lovelace
Atskleistoji istorija: SKIE-MUO
Kompiuterių istorija: VT100
Perfokortos ir jų istorija
JavaScript atspindžiai
Kompiuterių ištakos
Tiesiog - Java
Haketonai
Vartiklis