
Unix komandinė 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. Papildomi pavyzdziai patikrinti Fedora 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.
Komandos pateikimo būdai:
1) vien komanda, pvz., date ;
2) komanda su kažkuo, pvz., echo Labas ;
3) komanda su opcija, leidžiančia komandą veikti kitaip, pvz., date -u .
Taigi, apibendrinant, komandos sintaksė yra:
komanda -opcija -opcija .... kažkas_papildomai_(parametrai)
Pvz., 2022 m. sausio mėn. kalendoriaus pateikimas:
cal -m 01 2022
čia opcija -m nurodo, kad pirma savaitės diena laikomas pirmadienis, 01 nurodo mėnesį (sausis), o 2022 metus.
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
Trumpiausia programa
Iš tikro trumpiausia programa, dar nuo 8-ojo 20 a. dešimtmečio, veikianti Unix/Linux aplinkoje, yra tuščias
failas. Komandinėje eilute apvalkalo įvykdytas kaip skriptas, jis gražina klaidos kodą 0, kas reiškia, kad nebuvo
klaidų. Taigi, negali būti trumpesnės programos už ją!
Beje, Linux ir Mac aplinkose ši programa virto dvejetainiu vykdomu kodu (komanda true ), ir šios programos užima per 20 KB.
Norėdami patikrinti, komandinėje eilutėje įvykdykite komandas:
touch empty.sh
chmod a+x empty.sh
./empty.sh
Vykdymo rezultatas užrašomas į kintamąjį $?, tad galite tada patikrinti ir jo reikšmę (turi išvesti 0):
echo $?
|
Jos rezultatas:
first.sh
echo "Labas, pasauli!"
Dabar kartu galime peršokti ir prie mūsų pirmosios programėlės vykdymo. Pirmiausia,
nustatykime, kad taivykdomasis 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!"
Kelios populiarios Unix/Linux komandos:
pwd - pateikti aktyvų katalogą;
whoami - pateikti prisijungusio vartotojo vardą;
cd - pakeisti aktyvų katalogą, - pvz., cd / - nustatyti šakninį katalogą;
touch - sukurti failą, - pvz., touch mytext.txt - aktyviame kataloge sukurti tuščią failą mytext.txt
Viena touch komanda galima sukurti iškart ir kelis failus, pvz. touch a.txt b.txt
mkdir - sukurti katalogą, pvz., mkdir kopijos - aktyviame kataloge sukuria subkatalogą kopijos
mv - pervardinti arba perkelti (į kitą katalogą), pvz., mv mytext.txt kopija.txt -
mytext.txt pervadina į kopija.txt; mv mytext.txt kopijos - perkelia failą
mytext.txt į katalogą kopijos, o
mv mytext.txt kopijos/mytext_cp.txt - perkelia
failą mytext.txt į katalogą kopijos pervardindama į mytext_cp.txt
cp - kopijuoti failą; analogiška mv, tačiau neliečia (nepašalina) ankstesnių failų. Tiek
mv, tiek cp gali atlikti veiksmus su keliais failais, pvz., cp *.txt kopijos visus
.txt failus perkels į katalogą kopijos. Abi šios komandos (cp ir mv) turi ir opciją -R, nurodančią atlikti
(rekursinius) veiksmus su visais subkatalogais, pvz.,
cp -R * /mano/saugykla - visus failus visuose subkataloguose iš aktyvaus katalogo nukopijuoti į katalogą /mano/saugykla
rm - pašalinti failą, pvz., rm b.txt - pašalinti failą b.txt. Kaip ir
mv ir cp, operaciją gali atlikti su keliais failais, o taip pat rekursyviai per visus subkatalogus, pvz.,
rm -R kopijos/*.txt pašalins visus .txt failus iš katalogo kopijos bei visų subkatalogų jame.
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.
Nukreipimas. Komandos atlikimo rezultatus galima nukreipti, pvz, vietoje išvedimo ekrane,
užrašyti faile. Nukreipimas nurodomas su >, pvz.,
ls -l >failai.lst failų sąrašą užrašys į failai.lst
Pastaba: įvedimo nukreipimui naudojamas simbolis <
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
Kai kurios naudingos skriptų programavimui komandos:
find - surasti, pvz., find a.* - surasti visus failus tenkinančius šabloną a.*;
find pdf -type f - surasti visus failus kataloge pdf (-type opcija nurodo kokio tipo
objektų ieškome); find pdf -type d - kataloge pdf surasti visus katalogus ir t.t.
grep - ieškoti šablonų, pvz., grep -i jonas mytext.txt - faile mytext.txt
ieško teksto jonas, nepriklausomai, ar jis parašytas didžiosiomis ar mažosiomis raidėmis (tai nurodo opcija -i).
grep labai efektyvi konvejeryje (|), kai ieškoma ankstesnės komandos rezultatuose, pvz.,
ls | grep my pateiks visus failus, kurių pavadinime yra dalelytė my;
Tuo tarpu -v opcija nurodo, kad reikia pateikti rezultatus, kurie netenkina šablono, pvz.,
išvesti visas eilutes, nesančias komentaru:
grep -v ^# config.file
awk - programa, orientuoja į tekstinės informacijos srautų apdorimą. Ji išsamiai aprašyta
atskirai, žr. >>>>>
Teisių nustatymo komandos:
chown - pakeisti savininką; pvz., sudo chown jonas tekstas.txt - failui tekstas.txt priskirti savininką jonas;
arba sudo chown -R jonas kopijos -
rekursyviai visiems objektams kataloge kopijos priskirti savininką jonas;
chgrp - pakeisti grupę, pvz., sudo chgrp -R mygroup kopijos - panašiai kaip
chown, tik priskiria grupę mygroup;
chmod - pakeisti prieigos teises, pvz., chmod u=rw tekstas.txt - nustatyti failui skaitymo ir rašymo teises;
arba chmod +x a.sh - nustatyti, kad failas yra vykdomas.
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 farba 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
Kai kurios ls opcijos:
ls -a - pateikti visus failus. Kataloge gali būti failų, kurie prasideda tašku (.; pvz.,
.bash_history). Be šios opcijos jie nėra pateikiami;
ls -l - išvesti sąrašą ilgu (pilnu) formatu. Apie failą arba katalogą pateikiama tokia informacija:
tipas (jei katalogas, tada d) ir prieigos; nuorodų (link) kiekis; savininkas; grupė; dydis; paskutinio keitimo data; pavadinimas

Pastaba: opcijas galima jungti pvz., ls -la yra ta pati, kaip ls -l -a . Be
to opcijų tvarka nėra svarbi.
ls -R - rekursyvinis pateikimas pateikiami visi failai ir visuose vidiniuose subkataloguose.
Jei norime sužinoti koks tai failas, galime pasinaudoti komanda file , pvz., file
alsactl.conf pateiks
alsactl.conf: ASCII text
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į
Įvadas į Perl kalbą: Kas naudoja Perl?
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
|