Команден интерпретатор (shell)

 

1.       Команди. 1

Синтаксис. 1

Синтаксис на опциите. 1

Примери: 1

Вградени команди. 1

2.       Променливи на обвивката (shell). 1

Задаване и използване. 1

Променливи на средата (environment variables)

Устойчивост (Persistance) на променливите на средата. 1

Изпълнение на команда ( програма ). 1

Конфигурационни променливи на обвивката. 1

3.       История на командите. 1

Команда history

Редактиране на команди. 1

Използване на предишни команди с „!!“ и „!“. 1

Използване на аргументи от предишни команди. 1

4.       Комбиниране на няколко команди на ред. 1

5.       Повтаряне на команди с for. 1

6.       Подмяна (substitution) на команди. 1

7.       Упражнения. 1

 

 

Обвивката (нарича се още команден интерпретатор )осигурява връзката между потребителя и ядрото на операционната система.

 

          

Кой е подразбиращия се интерпретатор може да се провери с команда която извежда SHELL променливата на средата

$ echo $SHELL

А кой интерпретатор се използва в момента се проверява с команда

$ echo $0

     1.     Команди

Синтаксис

Съставени са от думи разделени от интервали (whitespace)

Първата дума е самата команда

Следващите думи са с аргументи на командата. Повечето команди ги разделят на две категории – опции и параметри:

·        опции - започват с едно или две тирета и променят поведението на командата. Обикновено се задават първи, но за повечето команди това не е задължително.

·        има специална опция "--", която указва край на опциите. Нищо след нея не се счита за опция, дори да започва с "-".

·        параметри – имена на файлове, директории …, върху които командата работи.

Синтаксис на опциите

Повечето команди имат стандартен синтаксис за опциите:

·        Еднобуквените опции (short version) започват с единично тире, например "–h"

·        Опциите, които са цели думи или фрази (long version) започват с две тирета, например  "--ignore-backups".

Някои от опциите имат аргументи. Обикновено това е следваща опцията дума, например " sort -o output_file "

Някои програми могат и да не следват стандартния синтаксис.

·        Например дългите версии на опциите понякога започват с едно вместо с две тирета.

Примери:

·        Извеждане на имената на файловете в текущата директория

$ ls

·        Извеждане на файловете в " дълъг формат" (повече информация)

$ ls -l

·        Пълната информация само за някои файлове :

$ ls -l notes.txt report.txt

·        Пълната информация за всички  .txt  файлове:

$ ls -l *.txt

·        Всички файлове, включително и скритите

$ ls -l -a

$ ls -la

Вградени команди

Една малка част от командите са вградени в ядрото (built-in). Те са в оперативната памет и са винаги на разположение. Повечето са отделни програми и могат да бъдат инсталирани и де-инсталирани от системата.

За да се провери дали една команда е вградена или е на външен изпълним файл може да се използва вградената команда  type  command. Например за външата команда  date (извежда деня от седмицата, датата, часа, часовата зона) и за самата  type:

$type date
date is /usr/bin/date

$ type  type
type is a shell builtin

     2.     Променливи на обвивката (shell)

Променливите на интерпретатора представляват текстови променливи, които съхраняват временна информация.

При записването на потребителя (log in) на някои системни променливи автоматично им се задава стойност. Например

$HOME    Абсолютният път към личната директория на потребителя.

$PATH     Списъкът на директориите, където се търсят командите.

$USER     log in името на потребителя.

$SHELL   Абсолютният път към командата за стартиране на обвивката.

$TERM    Типът на използвания терминал.

Задаване и използване

Нови променливи могат да бъдат задавани в интерпретатора чрез просто присвояване без празни интервали. Ако в присвояваната стойност има празни интервали, тя трябва да се загради в апострофи или кавички.

$ME="Ivan Ivanov"

За да може да бъде използвана в командите името на променливата трябва да бъде предшествано от знака $ .

$echo $ME

Ivan Ivanov

$

Командата set без аргументи извежда променливите на обвивката.

Променливи на средата (environment variables)

Променливите на средата са специален вид променливи на обвивката, които променят поведението на системата. Те се подават на програмите, които се изпълняват от интерпретатора и които те могат ползват.

За да бъде една променлива на обвивката да бъде „изнесена“ сред променливите на средата на програмите се използва команда export:

$МЕ="Ivan Ivanov"

$export  ME

$

Двете команди могат да бъдат комбинирани на една линия:

$export МЕ="Ivan Ivanov"

$

Командата env без параметри извежда променливите на средата.

Извеждането на променливите на средата може да стане  и с:

$printenv

$

А извеждането на стойността на конкретна променлива на средата с:

$printenv МЕ

$

или с :

$echo $ME

$

Премахването на променлива на средата може да стане съз задаването на липсваща стойност

$export МЕ=

$

или с

$unset  МЕ

$

Устойчивост (Persistance) на променливите на средата

Всички промени на променливите са временни. След затварянето на командния интерпретатор промените се губят. За да станат устойчиви, те трябва да се въведат във файлове, които се изпълняват автоматично при login.
За конкретен потребител - в ~/.profile
За цялата система - в /etc/environment
След което е необходимо да се напарави logout - login за да се изпълнят файловете.

Изпълнение  на програма (команда)

При подаване на команда интерпретаторът трябва да знае къде се намира командата.  

Първи начин - местоположението на командата  може да бъде специфицирано експлицитно:

 ./sample

Изпълнява програмата sample в текущата директория

 /bin/ls

Изпълнява командата ls от /bin директорията

Пример: Нека  в поддиректория Test на текущата директория да създадем програма която извежда hello world на екрана :

cat > Test/hello.c

#include <stdio.h>
int main(){
   printf("hello world\n");
   return 0;
}

^D

Да я компилираме в директорията, да проверим дали е създаден изпълним файл a.out и да го преименуваме на hello:

cd Test
cc hello.c
ls  a.out -l
mv a.out hello
ls hello -l

Сега разполагаме с команда hello в директорията. Можем да я стартираме като посочим пътят до нея:

от текущата директория

 ./hello

или от друга (горната) директория

cd
Test/hello 

или от която и да е директория на системата - чрез посочване на абсолютния път:

/home/imom/Test/hello

Втори начин: ако не бъде зададен пътят, командата се търси в местата зададени от променливата на средата $PATH. Директориите за търсене в променливата $PATH се разделят с двоеточие. Например:

echo $PATH

/bin:/usr/bin:/usr/local/bin

В този случай командата whoami ще изпълни програмата /bin/whoami или /usr/bin/whoami или /usr/local/bin/whoami (където се срещне първо).

Конфигурационни променливи на обвивката

Някои променливи съдържат информация, която се ползва от самия Bash.

Променливата PS1 (Prompt String 1) специфицира как да изглежда системното напомняне (shell prompt). Например нека тя изглежда по следния начин:

PS1="\u@\h: \W\$ "


Специалните символи  \u, \h и \W представят променливи на интерпретатора съдържащи съответно user/login name, machine’s hostname и текущата работна директория -  $USER, $HOSTNAME, $PWD

В PS1 може да бъде изпълнена всяка linux команда като се постави във формат $(linux_command). Например ако искате prompt да извежда системната дата:

PS1="\u@\h [\$(date +%k:%M:%S)]$ "


Подробни примери илюстриращи възможностите за конфигуриране на shell prompt може да видите тук .

     3.     История на командите

Команда history

Интерпретатора съхранява изпълнените команди.Те могат да бъдат извикани отново с UP (и съответно DOWN) бутона, което позволява изпълнението има без да бъдат въвеждани отново.

След като бъдат изведени, те могат да бъдат редактирани. Бутоните LEFT, RIGHT, BACKSPACE и DEL могат да се използват по стандартния начин.

Вградената команда history позволява извеждането на запаметените команди.

Между сесиите историята на командите се съхранява във файла „˜/.bash_history“, който е собственост на потребителя и може да бъде редактиран.

Редактиране на команди

Копиране на текст в терминал ( командния ред  на CLI ) може да стане след като текста е запомнен (например от Уеб страница с ctrl+c ) с

Запомняне на текст от терминала става чрез селектирането му с мишката и

tab - автоматично довършва командата или имена на файлове ако възможноста е една, ако са повече - дава списък от опции.

Изпълняване на стара команда

Up Arrow или Ctrl + P

Скролиране към преди въведена команда

Down Arrow or Ctrl + N

Връщане към по-скоро въведена команд

Enter

За изпълнение на намерената команда

Ctrl + R

Търси въведена сложна команда чрез част от нея. 

.

Промяна на текст на команда. Мишката не работи, използвайте лява и дясна стрелка за придвижване по командата и бутоните del и backspace. Въвеждането на текст го вмъква в командата.

Ctrl + A or Home

Придвижва курсора в началото на линията.

Ctrl+ E or End

Придвижва курсора в края на линията.

Esc + B

Премества курсора в началото на предната дума.

Ctrl + K

Изтрива от текущата позиция до края на линията

Ctrl + U

Изтрива от началото на линията до текущата позиция.

Ctrl + W

Изтрива думата преди курсора

Alt + B

Премества се една дума към началото

Alt + F

Премества се една дума към края

Alt + C

Прави главна буквата сочена от курсора и премества курсора в края на думата

Използване на предишни команди с „!!“ и „!“

Предишните команди могат да се включат в процеса на изграждане на нова команда. 

С  „!!“ последната въведена команда се вмъква при изграждането на текущата:

rm test.txt

echo !!

echo rm test.txt

rm test.txt

Комбинацията „!string“ (без интервал) вмъква последната използвана команда, която започва с „string“

ls *.txt

notes.txt report.txt

!ls

ls *.txt

notes.txt report.txt

Използване на аргументи от предишни команди

С „!$“ се взима последния аргумент на предишната команда:

 ls -l long_file_name.html

 rm !$

rm long_file_name.html

Аналогично с „!^“се взима първият аргумент от предишната команда

 ls -l long_file_name.html

 rm !^

rm ls

Команда във формата ˆstringˆreplacementˆ“ замества първия срещнат „string“ с

replacement в предната команда и я изпълнява:

 echo $HOTSNAME

 ˆTSˆSTˆ

echo $HOSTNAME

     4.     Комбиниране на няколко команди на ред

Полезна опция, когато изпълнението на първата команда отнема много време. Командите се разделят с „;

time-consuming-program; ls

Ако е необходимо да се изпълни втората команда само при успешно завършване на първата се използва „&&”

time-consuming-potentially-failing-program && ls

     5.     Команди if и for

 Команда if

Командата дава възможност да се осъществи разклонение в зависимост от някакво условие.

 
if [ <some test> ]
then
<commands>
fi
 V1=200
V2=100
if [ $V1 -gt $V2 ]; then
      echo "$V1 is bigger then $V2 "; 
fi

The square brackets ( [ ] ) in the if statement above are actually a reference to the command test. This means that all of the operators that test allows may be used here as well. Look up the man page for test to see all of the possible operators (there are quite a few) but some of the more common ones are listed below.

Operator Description
! EXPRESSION The EXPRESSION is false.
-n STRING The length of STRING is greater than zero.
-z STRING The lengh of STRING is zero (ie it is empty).
STRING1 = STRING2 STRING1 is equal to STRING2
STRING1 != STRING2 STRING1 is not equal to STRING2
INTEGER1 -eq INTEGER2 INTEGER1 is numerically equal to INTEGER2
INTEGER1 -gt INTEGER2 INTEGER1 is numerically greater than INTEGER2
INTEGER1 -lt INTEGER2 INTEGER1 is numerically less than INTEGER2
-d FILE FILE exists and is a directory.
-e FILE FILE exists.
-r FILE FILE exists and the read permission is granted.
-s FILE FILE exists and it's size is greater than zero (ie. it is not empty).
-w FILE FILE exists and the write permission is granted.
-x FILE FILE exists and the execute permission is granted.

Командата може да се използва и във вида .

 
if [ <some test> ]
then
<commands>
else
<commands>
fi
V1=20
V2=100
if [ $V1 -gt $V2 ];
then
      echo "$V1 is bigger then $V2 "; 
else
    echo "$V1 is less then $V2"; 
fi

Допълнителна информация за командите за разклонение може да се намери тук

Команда for

Командите могат да бъдат повтаряни многократно с „for”.

for varname in list; do commands...; done

Варианти за list: поредица от низове разделени с интервали, диапазон от числа, изход на команда, масив ...

синтаксис                                               Пример

 for VARIABLE in v1 v2 v3 .. vN;
do
    command1
on $VARIABLE
    ...
    commandN
done
-------------
for 
VARIABLE in {v1..v2};
do
   
command1 on $VARIABLE
    ...
    commandN

done
-----------------------
Bash v4.0+ {START..END..INCREMENT}
















$for i in 1 2 3 4 5;
 do

    echo "Welcome $i times";
 done



-----------------------------------------
$for i in {1..5};
do
   echo "Welcome $i times";
done

------------------------------------------
$echo "Bash version: $BASH_VERSION"

$for i in {0..10..2};
  do
     echo "Welcome $i times";
 done













произволен ред на стойностите


-----------
нарастване или намаляване
стъпка 1 (-1)


----------------
нарастване или намаляване













или

 

 for VARIABLE in file1 file2 file3;
do
    command1 on $VARIABLE
    ...
    commandN
done
 Например за преименуване на всички файлове в текущата директория с разширение „.txt”:

$for file in *.txt;
 do
     mv -v $file $file.old;
 done

или на един ред:

$ for file in *.txt;  do  mv -v $file $file.old;  done

Всички файлове с  разширение ".old"  го зменят с
".ol":
$for file in *.old; do
    mv -v "$file" "${file%.old}.ol"
done

Премахване на разширението
".ol":
$for file in *.ol; do
    mv -v "$file" "${file%.ol}"
done


или

 for VARIABLE in $(Linux-Command-Here);
do
    command1 on $
VARIABLE
    command2 
    commandN
done
  $for f in $(ls); do printf "File: $f\n"; done
променливата получава стойностите от изхода на командата


 С стил цикъл for


 
for (( initializer; condition; step ));
do
shell_COMMANDS
done
  $for (( c=1; c<=5; c++ ));
do 
   echo "Welcome $c times";
done

break and continue Statements


Цикъл for
for v  in "first" "second" "third";
do
   echo $v;
done
first
second
third

Същият цикъл с  break:
for v  in first second third; 
do if [ $v = second ]; then break;
fi;
echo $v;
done
first

Същият цикъл с continue:
for v  in first second third; 
do if [ $v = second ]; then continue;
fi;
echo $v;
done
first
third


    


Повече за командите  може да се на мери тук

 

     6.     Подмяна (substitution) на команди

Позволява изхода от една команда да бъде използван като параметър на друга.

Например да се намерят всички файлове съдържаща стринг  „manual.h” с команда „locate” и да се изведе информация за тях с команда „ls -l”:

$locate manual.h

/usr/src/linux-headers-5.8.0-44-generic/include/config/sparsemem/manual.h
/usr/src/linux-headers-5.8.0-45-generic/include/config/sparsemem/manual.h

и да се изведе информация за тях с команда „ls -l”:

$ls -l $(locate manual.h)
-rw-r--r-- 1 root root 0 фев 10 20:51 /usr/src/linux-headers-5.8.0-44-generic/include/config/sparsemem/manual.h
-rw-r--r-- 1 root root 0 фев 23 13:16 /usr/src/linux-headers-5.8.0-45-generic/include/config/sparsemem/manual.h


     7.     Упражнения