Команден интерпретатор (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 -a  command. Например за външата команда  date (извежда деня от седмицата, датата, часа, часовата зона) и за самата  type:

$type -a date
date is /usr/bin/date
date is /bin/date

$ type -a 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\$ "


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

Подробни примери илюстриращи възможностите за конфигуриране на 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.     Повтаряне на команди с for

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

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

Варианти за list:

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

 for VARIABLE in 1 2 3 4 5 .. N
do
    command1
    command2
    commandN
done
$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
------------------------------------------
Bash v4.0+ {START..END..INCREMENT} syntax

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


или

 

 for VARIABLE in file1 file2 file3
do
    command1 on $VARIABLE
    command2
    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 OUTPUT in $(Linux-Command-Here)
do
    command1 on $OUTPUT
    command2 on $OUTPUT
    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

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

 

     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.     Упражнения