Команден интерпретатор (shell)
2. Променливи на обвивката (shell)
Променливи на средата (environment variables)
Устойчивост (Persistance) на променливите на средата
Изпълнение на команда ( програма )
Конфигурационни променливи на обвивката
Използване на предишни команди с „!!“ и „!“
Използване на аргументи от предишни команди
4. Комбиниране на няколко команди на ред
6. Подмяна (substitution) на команди
Обвивката (нарича се още команден интерпретатор )осигурява връзката между потребителя и ядрото на операционната система.
Кой е подразбиращия се интерпретатор може да се провери с команда която извежда SHELL променливата на средата
$ echo $SHELL
А кой интерпретатор се използва в момента се проверява с команда
$ echo $0
Съставени са от думи разделени от интервали (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
Променливите на интерпретатора представляват текстови променливи, които съхраняват временна информация.
При записването на потребителя (log in) на някои системни променливи автоматично им се задава стойност. Например
$HOME Абсолютният път към личната директория на потребителя.
$PATH Списъкът на директориите, където се търсят командите.
$USER log in името на потребителя.
$SHELL Абсолютният път към командата за стартиране на обвивката.
$TERM Типът на използвания терминал.
Нови променливи могат да бъдат задавани в интерпретатора чрез просто присвояване без празни интервали. Ако в присвояваната стойност има празни интервали, тя трябва да се загради в апострофи или кавички.
$ME="Ivan Ivanov"
За да може да бъде използвана в командите името на променливата трябва да бъде предшествано от знака $ .
$echo $ME
Ivan Ivanov
$
Командата set без аргументи извежда променливите на обвивката.
Променливите на средата са специален вид променливи на обвивката, които променят поведението на системата. Те се подават на програмите, които се изпълняват от интерпретатора и които те могат ползват.
За да бъде една променлива на обвивката да бъде „изнесена“ сред променливите на средата на програмите се използва команда export:
$МЕ="Ivan Ivanov"
$export ME
$
Двете команди могат да бъдат комбинирани на една линия:
$export МЕ="Ivan Ivanov"
$
Командата env без параметри извежда променливите на средата.
Извеждането на променливите на средата може да стане и с:
$printenv
$
А извеждането на стойността на конкретна променлива на средата с:
$printenv МЕ
$
или с :
$echo $ME
$
Премахването на променлива на средата може да стане съз задаването на липсваща стойност
$export МЕ=
$
или с
$unset МЕ
$
При подаване на команда интерпретаторът трябва да знае къде се намира командата.
Първи начин - местоположението на командата може да бъде специфицирано експлицитно:
./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 може да видите тук .
Интерпретатора съхранява изпълнените команди.Те могат да бъдат извикани отново с 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 |
Търси въведена сложна команда чрез част от нея. |
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
…
Полезна опция, когато изпълнението на първата команда отнема много време. Командите се разделят с „;“
time-consuming-program; ls
Ако е необходимо да се изпълни втората команда само при успешно завършване на първата се използва „&&”
time-consuming-potentially-failing-program && ls
Командата дава възможност да се осъществи разклонение в зависимост от някакво условие.
if [ <some test> ]
|
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> ] |
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 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 (( initializer; condition; step )); |
$for
(( c=1; c<=5;
c++ )); do echo "Welcome $c times"; done |
for v in "first" "second" "third"; |
first second third |
for v in first second third;
|
first |
for v in first second third;
|
first third |
Позволява изхода от една команда да бъде използван като параметър на друга.
Например да се намерят всички файлове съдържаща стринг „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