Основы 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

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

https://eth1.ru/about/ Travel
https://eth1.ru/about/ Hotels
https://eth1.ru/about/ Hotels
TopBicycle.ru Bicycles
https://eth1.ru/about/ Bicycles
HeiHei.ru Travel
https://eth1.ru/about/ Android
https://eth1.ru/about/ Android
https://eth1.ru/about/ Books
https://eth1.ru/about/ Education
https://eth1.ru/about/ Education
https://eth1.ru/about/ Education
https://eth1.ru/about/ Education
https://eth1.ru/about/ Insurance
https://eth1.ru/about/ Insurance
https://eth1.ru/about/ Insurance
https://eth1.ru/about/ Android
https://eth1.ru/about/ Hosting

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

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

grep Android partners.txt

https://eth1.ru/about/ Android
https://eth1.ru/about/ Android
https://eth1.ru/about/ Android

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

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

https://eth1.ru/about/ Android
https://eth1.ru/about/ Android
https://eth1.ru/about/ Android

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

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

4

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

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

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

Действительно, в категории образование находится четыре платформы https://eth1.ru/about/, https://eth1.ru/about/, https://eth1.ru/about/ и https://eth1.ru/about/

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

Похожие статьи
Bash
Основы Bash
alias: Псевдонимы
Bash Scripting
-eq -gt …: Операторы сравнения
if else: Условные операторы
Цикл while
date: Дата
Переход на новую строку
Арифметические операции
sftp: Передать файл или пароль в Bash скрипте
Мониторинг потребления памяти
Работа с файлами в директории
awk
grep
sed
Ошибки Bash
Zsh