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 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!"

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 „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

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
ls -l rezultatas

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

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