Основы Bash

Содержание
Введение
SSH
Автоматическое дополнение
Аргументы
$(): Использовать результат другой команды
Просмотр файлов
Редактирование текстовых файлов
mkdir: создание директорий
Перенаправление вывода
Добавить запись в конец файла
Программы по умолчанию
*
exec bash: перезапустить терминал
CTRL R: поиск в прошлых командах
Другие статьи о Bash

Введение

$ в Promt означает, что у вас запущен Bash % означает, что у вас Zsh

~ перед $ означает, что вы находитесь в home

Чтобы выполнить команду нужно нажать Enter

Команда ls показывает содержимое текущей директории

ls

docker Documents Music notes.txt Pictures python snap Templates yandex-tank Desktop docker-lab Downloads node_modules Public shell_scripts ssh-com Videos yarn.lock

Командой cd можно сменить директорию

cd Documents

Чтобы вернуться в домашнюю директорию достаточно выполнить cd без параметров

Чтобы повторить предыдущую команду достаточно нажать стрелку вверх

SSH

Чтобы подсоединиться к удалённому компьютеру по SSH выполните

ssh имя_пользователя@имя_компьютера

ssh andrei@andrei-ubuntu

Чтобы закрыть ssh сессию выполните

exit

Подробнее про работу с SSH в Linux читайте в статье « Основы SSH »

Автоматическое дополнение

При выполнении cd писать полное название директории необязательно.

Если из домашней директории вы хотите перейти в Documents, достаточно набрать Doc и нажать Tab.

Если вы наберете просто D и нажмёте Tab, то Bash не поймёт куда вы хотите перейти - в Desktop, Documents или в Downloads, поэтому ничего не произойдёт (в Zsh сразу появится подсказка).

Если вы нажмёте Tab ещё раз - появится подсказка, а именно список всех директорий, название которых начинается на D

cd D

Desktop/ Documents/ Downloads/

Чтобы перейти в родительскую директорию выполните

cd ..

Чтобы узнать полный путь до текущей директории выполните

pwd

Аргументы

Рассмотрим команду

cd Documents

cd это команда, Documents это агрумент (argument).

Чтобы увидеть скрытые файлы в директории выполните ls -a

Где a означает All

У скрытых файлов первый символ в назывании - это точка

ls -a

. .bashrc Desktop docker-lab .gnupg Music Public snap .sudo_as_admin_successful .Xauthority .. .bash_history .cache .docker Documents .local node_modules Pictures python .ssh Templates yandex-tank .bash_logout .config docker Downloads .mozilla notes.txt .profile shell_scripts ssh-com Videos yarn.lock

-a это специальный вид аргумента, который называется опция (option).

Опции добавляют командам дополнительный функционал.

Опции начинаются с символа -

После - можно перечислить несколько опций подряд

Чтобы увидеть дополнительную информацию о файлах выполните ls -l, l означает long format

ls -l

total 96 drwxr-xr-x 2 andrei andrei 4096 heinä 16 12:11 Desktop drwxrwxr-x 3 andrei andrei 4096 syys 17 19:09 docker drwxrwxr-x 4 andrei andrei 4096 heinä 19 21:46 docker-lab drwxr-xr-x 2 andrei andrei 4096 heinä 16 12:11 Documents drwxr-xr-x 2 andrei andrei 4096 heinä 16 12:11 Downloads drwxr-xr-x 2 andrei andrei 4096 heinä 16 12:11 Music drwxr-xr-x 2 root root 4096 heinä 18 22:11 node_modules -rw-rw-r-- 1 andrei andrei 1 syys 19 21:40 notes.txt drwxr-xr-x 2 andrei andrei 4096 heinä 16 12:11 Pictures drwxr-xr-x 2 andrei andrei 4096 heinä 16 12:11 Public drwxrwxr-x 2 andrei andrei 4096 syys 19 12:54 python drwxrwxr-x 2 andrei andrei 4096 syys 19 22:01 shell_scripts drwxr-xr-x 3 andrei andrei 4096 syys 15 19:58 snap drwxr-xr-x 2 andrei andrei 4096 heinä 16 12:11 Templates drwxr-xr-x 2 andrei andrei 4096 heinä 16 12:11 Videos drwxrwxr-x 3 andrei andrei 4096 heinä 16 16:55 yandex-tank -rw-r--r-- 1 root root 86 heinä 18 22:11 yarn.lock

Чтобы узнать какие ещё опции есть у команды ls выполните

man ls

Результатом этой команды будет подробное описание всех опций. Список довольно длинный, чтобы перемещаться вниз по списку нажимайте пробел, чтобы вернуться наверх нажимайте b

Чтобы выполнить поиск по слову введите /слово. Чтобы перейти к следующему результату поиска нажмите n

Чтобы закрыть man нажмите q

Подробнее про все опции ls читайте в статье «man ls»

Чтобы увидеть дополнительную информацию о файлах, вкючая скрытые и отсортировать выдачу по вермени изменения выполните ls -lat

ls -lat

total 176 drwxr-xr-x 31 andrei andrei 4096 syys 20 10:20 . -rw------- 1 andrei andrei 34 syys 20 10:20 .lesshst -rw------- 1 andrei andrei 236 syys 20 10:16 .Xauthority -rw------- 1 andrei andrei 17546 syys 19 23:40 .bash_history drwxrwxr-x 2 andrei andrei 4096 syys 19 22:01 shell_scripts -rw-rw-r-- 1 andrei andrei 1 syys 19 21:40 notes.txt drwxrwxr-x 2 andrei andrei 4096 syys 19 12:54 python drwx------ 2 andrei andrei 4096 syys 17 19:19 .ssh drwxrwxr-x 3 andrei andrei 4096 syys 17 19:09 docker drwx------ 3 andrei andrei 4096 syys 15 20:04 .gnupg drwxr-xr-x 3 andrei andrei 4096 syys 15 19:58 snap drwxr-xr-x 15 andrei andrei 4096 syys 15 19:58 .cache drwxr-xr-x 12 andrei andrei 4096 syys 15 19:58 .config drwxrwxr-x 4 andrei andrei 4096 heinä 19 21:46 docker-lab drwx------ 2 andrei andrei 4096 heinä 18 23:06 .docker drwxr-xr-x 2 root root 4096 heinä 18 22:11 node_modules -rw-r--r-- 1 root root 86 heinä 18 22:11 yarn.lock drwxrwxr-x 3 andrei andrei 4096 heinä 16 16:55 yandex-tank drwxr-xr-x 4 andrei andrei 4096 heinä 16 15:08 .local -rw-r--r-- 1 andrei andrei 0 heinä 16 12:27 .sudo_as_admin_successful drwx------ 5 andrei andrei 4096 heinä 16 12:12 .mozilla drwxr-xr-x 2 andrei andrei 4096 heinä 16 12:11 Desktop drwxr-xr-x 2 andrei andrei 4096 heinä 16 12:11 Documents drwxr-xr-x 2 andrei andrei 4096 heinä 16 12:11 Downloads drwxr-xr-x 2 andrei andrei 4096 heinä 16 12:11 Music drwxr-xr-x 2 andrei andrei 4096 heinä 16 12:11 Pictures drwxr-xr-x 2 andrei andrei 4096 heinä 16 12:11 Public drwxr-xr-x 2 andrei andrei 4096 heinä 16 12:11 Templates drwxr-xr-x 2 andrei andrei 4096 heinä 16 12:11 Videos -rw-r--r-- 1 andrei andrei 220 heinä 16 11:53 .bash_logout -rw-r--r-- 1 andrei andrei 3771 heinä 16 11:53 .bashrc -rw-r--r-- 1 andrei andrei 807 heinä 16 11:53 .profile drwxr-xr-x 3 root root 4096 heinä 16 11:53 ..

Про то как работать с аргументами командной строки в ваших скриптах читайте здесь

$(): Использовать результат другой команды

Чтобы посмотеть к какому терминалу вы подключены выполните

tty

/dev/pts/31

Чтобы сделать листинг этого файла можно скопировать вывод и вставить после ls

ls -l /dev/pts/31

crw--w---- 1 andrei tty 136, 31 мая 23 13:48 /dev/pts/31

Чтобы получить тот же результат быстрее

ls -l $(tty)

crw--w---- 1 andrei tty 136, 31 мая 23 13:48 /dev/pts/31

Просмотр файлов

Чтобы открыть содержимое текстового файла выполните cat имя_файла или less имя_файла

cat textfile
less book1

cat выведет содержимое в консольный вывод. less откроет файл во всё окно.

Навигация по файлу, открытому с помощью less, осуществляется также как и по man.

Пробел вниз
b вверх
/ поиск
n следующий результат поиска
q закрыть

Если вы пытаетесь открыть бинарный файл с помощью less, то можете получить предупреждение

"file1" may be a binary file. See it anyway?

cat откроет такой файл без предупреждения

Чтобы продолжить нажмите y. Результат вас скорее всего не обрадует - получится трудночитаемый набор символов.

<C3>&NU_p<C6>x<E6><AC>^N<B4>E<EA>^B<D1>E^U<AB>^A3Fy<A3>^T^N<B5>7`^D<8E><F4><9F><8D>^M<E8>y<CD>^T6^A<DF>^T<83><8A>^F{џZ<8B><8C>p4S^G^TUs <C5>H@<DB><C3>}*d<C0>$<D4>Q^@Fq<83>S.:<81>\ƌp<E6><83>ӭ"<9F>j <C8><E9>I<92>/<BD>.i)hB \P(<A6>^B<D2>^Q<91><8A>)h^A*;<A9><96><DA><DA>K<86>Ve<8D>K<B0>Q<93><81><C9><C5>KU<F5>7X<B4>ۙ]<B6><A2>D<CC><C7>n<EC>^@9<E3><BD>RZ<8C><A5><E1>mv<D7><C4>~^^<B4><D7>4<F8><E7>^V<B7><91><89>a<F3>Sk<95>#<AE>3X<9A>7 <C4>^]'W<D4>m<EC>ml<B5>1<E7><DE><DC>X<89><9E><DB>^Q$Ђ]Y<B3><C7>B3<EA>^M`<FC>^P<D5><E3><87><U+009E>^Z<F0>Ǖ"<DD>[<E8><82>{<A0><E8><E0>Dw*<AA>30<FB><C4><EF><E3><FD><92>k^G<E1>t<B1>i<9E>%<BC><96>g<B9><B9>}O<C4>:<85><B4>6<C6>^V<D9>^P3K7<DA>^FG^K<B7>^K<92>y&<B4><E4>^]<8E><EB><C4>?^QtM <EF>T<B6><BE><B7><D4>7<E9>f<D7><ED>% ^E@<B8>m<B1><90>I^@<8C><F0>Ol^ZՓĶ<D1><E8>ڶ<AB>5<9D><EC>0<E9><86>a6<F8><86><E6><F2><F3><B9><94>^C<F3>^L^Lם<FC>a<F0>-<F7><88>|Ur<D6><C8>M<9E><A7>Ỉ.<C8>=g<B7>u<92><D8><FA>g{g覺<88><D6>h<FE>^M\I<AA>,<A9>wu<A4>I=<DA>^PIY%<8C><B3>.9<EE><C5>q<8A>9^U<84>t:^?<88>,<EF><FC>;a<AE>[Er<D6><FA><84>i-<AC>f<J<E1><97>p<F9>s<D7>^Y?AW4<8D>J<D7>T<B4>[<BB>97<C4>Y<93>$c^L<AC>T<8F><A8> טæǪ|^S<F0>F<99>zڭ<B4><8D>md<AB>{f<A5>'<B0><9D> c<E7>c^G^AJ^P ㎵<DA><FC>7:<BA><F8>^^X5˸o<EF>!<96>D7<B0><C1><E5>-҇m<B2><ED><E9><96>\^RA<C1>9<E9>҉AZ<E8>^N<8E>Y^V8<9A>I^]Q^P^Vfc<80>^@<EA>I<AC>m'<C4>vZ<95><EC>v<90>y<9B>偮b<84>,<D1>^B^@u><87> <FD>(<F1><EE><9B>u<AC>xESC]<D2>ld<F2><EE><AF>4<E9><ED><E1>oGx<D9>G<EA>kESC<E1>̩&<95><A1><C2><D6>ѭƛ<A3><C7>kx͸<^Rb0рx#tm<9F><F7>G<E3>1<8D><C0><EA> <D4>mf<D4><EE><B4>اF<BB><B6><8E>9e<8C>uE}<C1>I<FA><EC>oʲ<F5><AF>^WiZF<B0>t<BB>ߴ$<A9>f<D7><D2>8<8F>(<90>+^Eg'<^@O'<B0><AE>^_O<D4>#<B7><F8><DB>i<AC>Gs^L<B6>:<FD><8C><F6>-$n<D8>^R[ȭ^V<EC><80>^A<C3>H<A3><9E>r^EQ<F8><B5>8^?^^ߤ&yJxB<F0>=<BC>Q^F^W'<CD>Wh <C6>rʤm^G<A1>5q<82>^]<8F>I<F1>'<8A><B4><CD>^KN<B0><D4>.<8C><93>[_<DC><C3>m^Cۯ<99><BD><E6> G<8F>f$^L<FB>Ս;<C4>^Ze<F5><84><F7><D0><DD>G<E4>ۼ<A9>9c<83>^KDvȭ<EE><AC>1<F9>^^<84>^S<E7>?^T<AF>l<EF><FE>^Zx^<E7>N <82><E2><CE>ݵ<AD>1<E1><8D>"b<D1>E^\<EB><9E>1<90><AA><A0><92>N09<ED>QIa^?<E2>^O<85>^^8<F0><FE><97>g5<86><B7>%<C5><F4>fGR<9F>k<97>y)(8<C1>2F#9^X^_0<C0><C0>^@S<8A>^K^^<A1><A5>j<D0><EA>^RO^Tj<F1><CB>^PV1<BA>ᶶv <B7><D0><E0><E3><E8>j<BF><85><BC>Ec<E2>(oe<B0>Y<D4>Y^Ke8<95>6<95><96>3<87>^<BC><E0><F7><AE>wB<B3><B9><BB><F8><96><FE>"<B6>i^SH_^O<C3>f<C1><F2>^D<B3><99>Y<86>A<EE><8A>1<9F><FA>hk<9F><F8>U<E2>ESCESCmCR<D3>C <C9>5֩<E2><AD>NH^@<88><FF>^@<A9>^D<BE><E2>F@^_(^Y$f<93><8A>Acд<BF>^QZj>#<D4><F4>(!<B9>^W^Zg<97><F6><96>h<F0><83>z<EE>\6y<E3>=<AB>d<F4><AF>1<B2><D5>WE<F8><8D><E3>k<B9>a<95><CD><CC><FA>]<AD><A8>򘇑<90><C7><D8>t ^E<81>'<D0>^Z<EE><FC>;<AD><DA>k<BA>y<BF><B1>Y<C4>"Y"<FD><F4>E^X<94>m<A4><80>{d^\^^<F4><9C>l<AE>I<A6>("<8A>*U<80>Lr^O<S<87>ZJ*<A2><80>u^T<99><A0>V<9C>ɈSH:<D0>h^T<80>O<D4>PzQ<C6>x<E3>ڑ<BD><E9>1<86>=M!<CE>^? <AD>)<C7>zi<F4>&<A4>^C<9A>(<FC>h<A0>

Чтобы закрыть окно с этими символами попробуйте нажать q или ввести команду reset

Для того, чтобы не попадать в такую ситуацию, можно проверять тип файла перед тем как его открывать. Это можно сделать командой file

file file1

file1: JPEG image data, JFIF standard 1.01, resolution (DPI), density 72x72, segment length 16, baseline, precision 8, 325x500, components 3

Оказывается file1 это не текст а изображение в формате JPEG

Попробовать открыть изображение из терминала можно командой xdg-open, не факт, что она будет работать в вашей системе, у меня в Ubuntu 20.4 получилось.

xdg-open file1

Редактирование текстовых файлов

Чтобы отредактировать текстовый файл нужно открыть его в одном из редакторов.

Скорее всего у вас уже установлен либо nano либо vi

в nano всё довольно очевидно, про vi советую прочитать отдельную статью здесь

Создать новый файл можно командой touch

touch new_file

Удалить файл можно командой rm

rm new_file

Создать сразу несколько файлов:

touch file1 file2 file3 file4

Чтобы создать файл с пробелами в имени нужно взять имя в кавычки:

touch 'file with spaces in name'

Создать новую директорию можно командой mkdir

mkdir расшифровывается как Make Directory

mkdir new_folder

Если нужно создать вложенные директории - воспользуйтесь флагом -p (parent)

mkdir -p city/district/street

Чтобы создать директорию и сразу туда перейти используйте

mkdir example && cd $_

Чтобы выйти из текущего процесса нажмите CTRL + C

Лучше не использовать следующие символы для названий файлов и папок:

' " ` { } ( ) < > [ ] ! ? & ] : ; \ ^ $ @ ~ * #

Попробуйте открыть файл с помощью cat -vet

cat -vet somefile

Можно увидеть, что в конце строки стоит $ а также кодировку кириллических символов.

Перенаправление вывода

Вывод можно перенаправить в файл воспользовавшись > или >>

> удалит из файла предыдущие записи

Если вы выполните перенаправление два раза в один и тот же файл. Останется только последнее

echo "Отличные ноутбуки здесь" > log.txt
echo "Книги с доставкой по России здесь" > log.txt
vi log.txt

Книги с доставкой по России здесь

Как видите, запись про ноутбуки не сохранилась

Как добавить запись в конец файла Bash

Чтобы не перезаписывать а добавлять новую строку нужно воспользоваться >>

echo "Отличные ноутбуки здесь" >> log.txt
echo "Книги с доставкой по России здесь" >> log.txt
vi log.txt

Отличные ноутбуки здесь
Книги с доставкой по России здесь

Результат работы команды можно направить в другую команду.

Если вы делаете листинг директории с большим количеством файлов командой ls, например ls /usr/bin результат не поместится на один экран.

Может быть удобно сразу направить этот вывод в less

ls /usr/bin | less

Чтобы найти в файле строки с упоминанием нужного слова нужно воспользоваться командой grep

Допустим, у вас есть список партнёров сайта andreyolegovich.ru , который называется partners.txt .

Если выполнить

less partners.txt

Список получится очень длинным

Авиасейлз Travel
Booking.com Hotels
Hotellook Hotels
TopBicycle.ru Bicycles
Велодрайв Bicycles
HeiHei.ru Travel
Xiaomi Android
Samsung Android
Books
GeekBrains Education
Нетология Education
SkillBox Education
Pluralsight Education
СовКомСтрахование Insurance
Полис 812 Insurance
Полис 812 Insurance
Vivo Android
Reg.ru Hosting

После названия идёт категория, к которой относится партнёр.

Допустим, вы хотите найти всех партнёров категории Android

grep Android partners.txt

Xiaomi Android
Samsung Android
Vivo Android

Этот список можно отсортировать в алфавитном порядке и сохранить в файл android_partners.txt

grep Android partners.txt | sort > android_partnets.txt
cat android_partners.txt

Samsung Android
Vivo Android
Xiaomi Android

Подсчитаем сколько в этом списке партнёров в категории Education.

cut -f 2 partners.txt | grep Education | wc -l

4

cut -f 2 оставляет только второй столбец

grep Education оставляет только Education

wc -l считает строки (word count -lines)

Действительно, в категории образование находится четыре платформы GeekBrains, Нетология, SkillBox и Pluralsight

PATH

Посмотреть PATH

echo $PATH

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

Добавить директорию new_bin в PATH

export PATH=$PATH~/new_bin

Программы по умолчанию

Установить nano редактором по умолчанию можно командой

export EDITOR=nano

Чтобы сделать этот выбор постоянным, нужно внести соответствующую запись в .profile (bash) или .zshenv (zsh)

Там же можно прописать export PATH=$PATH~/new_bin

export EDITOR=nano export PATH=$PATH~/new_bin

*

Для работы с большим количеством файлов часто удобно использовать шаблоны.

Допустим вы хотите сделать листинг только .pdf файлов

ls *pdf

Найти все строки в файле filename в которых содержастья буквы a r g подряд.

grep *arg* filename

Перезагрузить терминал

Чтобы перезагрузить терминал не выходя из него, выполните

exec bash

CTRL R: поиск в прошлых командах

Чтобы искать по ключевому слову среди выполненных ранее команд можно воспользоваться

CTRL + r