Быстрое изучение Bash: 30 легких команд для новичков
Если вы здесь, вероятно, вы столкнулись с проблемой изучения Bash команд. Давайте это исправим 🙂
Содержимое
-
1 Первые команды – учимся ходить
- 1.1 Три bash команды для управления
- 1.2 Скорая помощь для тех, кто забыл
- 1.3 Быстрый просмотр и редактирование файлов
- 1.4 Создаем и удаляем файлы/директории
- 1.5 Перемещаемся, копируем, ссылаемся
- 1.6 Bash: история команд
- 1.7 Деревья каталогов, использование диска и процессы
- 1.8 Другие полезные команды bash
Первые команды – учимся ходить
Современные файловые системы – это древовидные каталоги с корневой и родительскими директориями. Движение вверх по родительским каталогам приводит к корневому. В некоторых системах встречается несколько корневых каталогов, например, всем известные диски Windows: C:\ , A:\, etc.
Но в Unix-подобных системах все по-другому: здесь принят один корневой каталог с именем \. А вот и основные команды Bash для перемещения по файловой системе:
1
|
pwd / ls / cd
|
При работе в файловой системе пользователь находится в каталоге, который называется текущим или рабочим. Команда pwd выводит рабочий каталог пользователя:
1
2
|
geekpress@proglib:~$ pwd
/home/geekpress
|
С ls вы сможете вывести содержимое каталога (файлы и дочерние директории):
1
2
|
geekpress@proglib:~$ ls
imports temp playground README.md example dir
|
Перейти в другой каталог поможет cd:
1
2
3
4
5
6
7
8
9
|
geekpress@proglib:~$ cd imports/
geekpress@proglib:~imports$ pwd
/home/geekpress/imports
geekpress@proglib:~imports$ cd testdata
geekpress@proglib:~testdata$ pwd
/home/geekpress/imports/testdata
|
Используйте команду cd .. для быстрого перемещения в родительскую директорию:
1
2
3
4
|
geekpress@proglib:~testdata$ cd ..
geekpress@proglib:~imports$ pwd
/home/geekpress/imports
|
Сокращение cd ~ используется для перемещения домой, в /home/$USER:
1
2
3
4
|
geekpress@proglib:~imports$ cd ~
geekpress@proglib:~$ pwd
/home/geekpress
|
Три bash команды для управления
Иногда вам потребуется запускать эти команды одну за другой. Тогда на помощь приходит оператор ;:
1
2
3
|
geekpress@proglib:~$ ls; pwd
imports temp playground README.md
/home/geekpress
|
Точка с запятой означает, что сначала перечисляется содержимое рабочего каталога с помощью ls, а затем pwd выводит местоположение каталога. Еще один полезный инструмент для создания цепочек команд – &&. При использовании && команда справа не будет выполняться, если команда слева не выполнена:
1
2
3
4
5
6
7
8
|
# Ой! Тут опечатка!
geekpress@proglib~:$ cd /pplayground/socket/ && pwd && ls && cd
-bash: cd: /pplayground/socket: No such file or directory
# теперь первая команда проходит, так что выполняются следующие
geekpress@proglib:~$ cd /playground/socket/ && pwd && ls && cd
/home/geekpress/playground/socket
socket.go socket_test.go
|
Но если использовать ;, вторая команда выполняется даже после ошибки в первой:
1
2
3
4
5
|
# pwd и ls запустятся даже после ошибок в cd
geekpress@proglib:~$ cd /pplayground/socket ; pwd ; ls
-bash: cd: /pplayground/socket: No such file or directory
/home/geekpress
imports LICENSE playground README.md
|
А вот вам небольшой трюк в bash. Команда & похожа на &&, но на самом деле выполняет другую функцию. Часто процессы блокируют ввод в терминал во время работы. Чтобы свернуть подобный процесс в фон, используйте & в конце команды. Тогда процесс выполняется в фоне, не блокируя ввод в окно терминала:
1
2
|
geekpress@proglib:~$ cd /playground/socket && mv socket.go ~/ & cd
geekpress@proglib:~$
|
Скорая помощь для тех, кто забыл
Даже если вы давно пользуетесь продвинутыми командами bash, вы все еще можете забыть что-то из базиса, и это нормально. Всегда можно получить подсказку для большинства утилит. Как? Просто введите -h или --help в конце команды:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
geekpress@proglib:~$ ls --help
Usage: ls [OPTION]... [FILE]...
List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuvSUX nor --sort is specified.
Mandatory arguments to long options are mandatory for short options too.
-a, --all do not ignore entries starting with .
-A, --almost-all do not list implied . and ..
--author with -l, print the author of each file
-b, --escape print C-style escapes for nongraphic characters
--block-size=SIZE scale sizes by SIZE before printing them; e.g.,
'--block-size=M' prints sizes in units of
1,048,576 bytes; see SIZE format below
-B, --ignore-backups do not list implied entries ending with ~
...
|
Программы и команды Linux сопровождаются справочным руководством. Введите man перед командой, чтобы вызвать руководство. Выход из man – клавиша q:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
CAT(1) User Commands CAT(1)
NAME
cat - concatenate files and print on the standard output
SYNOPSIS
cat [OPTION]... [FILE]...
DESCRIPTION
Concatenate FILE(s) to standard output.
With no FILE, or when FILE is -, read standard input.
-A, --show-all
equivalent to -vET
...
|
Быстрый просмотр и редактирование файлов
head выводит первые строки файла. Флаг -n указывает количество отображаемых строк:
1
2
3
4
5
|
# вывод трех начальных строк
geekpress@proglib:~$ head -n 3 tempfile
first
three
lines
|
tail выводит последние строки файла. Можно получить последние n строк или конец файла, начиная с N-й строки, с помощью tail -n + N:
1
2
3
4
5
|
# выводит конец файла, начиная с 4-ой строки
geekpress@proglib:~$ tail -n +4 testfile
last
from
fourth
|
Используйте cat с одним или несколькими файлами: так можно быстро посмотреть содержание.
1
2
3
4
5
|
geekpress@proglib:~$ cat x
file x
geekpress@proglib:~$ cat x y
file x
file y
|
nano – минималистичный текстовый редактор командной строки. Редактор подходит начинающим и тем, кто не любит разнообразия. На начальных этапах он покроет все ваши требования.
nedit – легкий графический редактор, который открывается в окне. Редактирование по принципу «укажи и щелкни» с перетаскиванием, есть подсветка синтаксиса. Можно использовать nedit, когда следует постоянно вносить небольшие изменения и перезапускать скрипт.
Современные редакторы предлагают функции поиска и замены, подсветки синтаксиса и так далее. vi (m) и emacs функциональней nano и nedit, но сложней в освоении.
Создаем и удаляем файлы/директории
touch нужен для изменения временных меток файлов и для создания пустого файла. Можно создать новый файл в nano:
1
2
3
|
geekpress@proglib:~temp$ ls
geekpress@proglib:~temp$ nano newfile
|
Затем править файл и сохранить:
1
2
|
geekpress@proglib:~temp$ ls
newfile
|
Или использовать touch:
1
2
|
geekpress@proglib:~temp$ touch another && ls
newfile another
|
mkdir создает новые каталоги:
1
2
3
|
geekpress@proglib:~temp$ ls && mkdir fold && ls
newfile another
newfile another fold
|
Теперь удалим файл с помощью команды rm.
WARNING: файл невозможно восстановить!
1
2
|
geekpress@proglib:~temp$ rm newfile && ls
another fold
|
Необходимость подтверждения вызывается флагом -i:
1
2
|
geekpress@proglib:~temp$ rm -i another
rm: remove regular empty file 'another'? y
|
Удаляйте пустые каталоги с помощью rmdir. Если ls -a используется в пустом каталоге, команда выводит только ссылку на сам каталог . и ссылку на родительский каталог ..:
1
2
|
geekpress@proglib:~temp$ rmdir fold && ls -a
. ..
|
Команда rmdir удаляет только директории:
1
2
3
4
5
|
geekpress@proglib:~temp$ cd .. && ls temp/
zzz.txt big.txt 4.txt x bb.txt y z
geekpress@proglib:~$ rmdir temp/
rmdir: failed to remove 'test/': Directory not empty
|
Чтобы удалить директорию с содержимым, используйте rm -rf:
1
|
geekpress@proglib:~$ rm –rf temp
|
Перемещаемся, копируем, ссылаемся
mv перемещает и переименовывает файл. Для переименования введите новое имя файла:
1
2
3
|
geekpress@proglib:~example$ ls && mv x 2 && ls
x y z 1
y z 1 2
|
cp копирует файл:
1
2
|
geekpress@proglib:~example$ cp 2 22 && ls
y z 1 2 22
|
ln -s создает симлинк:
1
2
|
geekpress@proglib:~example$ ln -s y b && ls
y z 1 2 22 f b
|
Bash: история команд
В Bash доступна функция автоматического завершения команды по кнопке tab. Введите начальную часть команды и нажмите tab, чтобы терминал предложил полную строку.
1
2
3
4
|
geekpress@proglib:~dir$ ls <ENTER>
mobilizeemberduty mobilizeember mobilize
geekpress@proglib:~dir$ ls t <TAB>
|
Нажмите клавишу tab после ls t, и команда будет завершена автоматически.
1
2
|
geekpress@proglib:~dir$ ls mobilizeemberduty <ENTER>
mobilizeemberduty
|
Иногда нужно нажимать tab несколько раз:
1
2
3
4
|
geekpress@proglib:~dir$ ls m <TAB>
geekpress@proglib:~dir$ ls mo <TAB>
mobilize mobilizeember
|
Bash хранит историю ранее введенных команд. Чтобы выполнить поиск нажмите Ctrl + r:
1
|
geekpress@proglib:~dir$
|
Нажимаем Ctrl + r:
1
|
(reverse-i-search)[crayon-63625dc1ed4ed715548886 ]':
|
Вводим «mobi» и находим последнюю команду с этой строкой:
1
|
(reverse-i-search)
|
Деревья каталогов, использование диска и процессы
По умолчанию mkdir создает только один каталог. Это означает, что, например, если каталога a/b не существует, то a/b/c не может быть создан с помощью mkdir:
1
2
3
|
geekpress@proglib:~example$ ls && mkdir a/b/c
x y z
mkdir: cannot create directory 'd/e/f': No such file or directory
|
Но если указать флаг -p, mkdir создаст все директории, которые отсутствуют в указанном пути:
1
2
|
geekpress@proglib:~example$ mkdir -p a/b/c && ls
x y z a
|
tree отображает структуру каталога в виде отформатированного дерева. По умолчанию tree печатает древовидную структуру, начиная с указанного каталога, но количество уровней ограничивается флагом -L:
1
2
3
4
5
6
|
geekpress@proglib:~example$ tree -L 2
.
|-- x
|-- y
|-- z
[crayon-63625dc1ed506791066372 ]-- a
|
Скрывайте пустые каталоги в дереве с помощью --prune. Обратите внимание, что при этом не выводятся каталоги, которые содержат другие пустые каталоги:
1
2
3
4
|
geekpress@proglib:~example$ tree --prune
.
|-- x
`-- y
|
df показывает, сколько места занимают файлы на дисках.
1
2
3
4
5
|
geekpress@proglib:~example$ df -h
Filesystem Size Used Avail Use% Mounted on
udev 1.9G 0 1.9G 0% /dev
tmpfs 389M 6.3M 383M 2% /run
...
|
В приведенной выше команде -h означает не «help», а «human-readable». Некоторые команды используют этот флаг для отображения размеров в K для килобайт и G для гигабайт, вместо записи гигантского числа байтов.
du показывает использование файлового пространства каталогами. Если хочется узнать, сколько свободного места на жестком диске, используйте df, а для каталогов используйте du:
1
2
3
4
5
6
|
geekpress@proglib:~example$ du
12760 ./.git/objects
13016 ./.git
72 ./container/intsets
76 ./container
27380 .
|
df принимает флаг --max-deep = N, который показывает директории только на N уровней в указанном каталоге:
ps показывает запущенные процессы пользователей:
1
2
3
4
|
geekpress@proglib:~example$ ps
PID TTY TIME CMD
15333 pts/0 00:00:00 bash
15344 pts/0 00:00:00 ps
|
Вот вам и основы Bash. Но давайте копнем чуть глубже.
Другие полезные команды bash
Меняйте пароль учетной записи с помощью passwd. Команда проверяет текущий пароль и просит ввести новый пароль дважды:
1
2
3
4
5
6
|
geekpress@proglib:~example$ passwd
Changing password for user.
(current) UNIX password: <type current password>
Enter new UNIX password: <type new password>
Retype new UNIX password: <type new password again>
passwd: password updated successfully
|
logout выполняет выход пользователя из сеанса оболочки:
1
2
3
4
5
6
7
|
geekpress@proglib:~example$ logout
──────────────────────────────────────────────────────────────────────────────
Session stopped
- Press <return> to exit tab
- Press R to restart session
- Press S to save terminal output to file
|
exit выходит из консоли:
1
2
3
4
5
6
7
8
|
geekpress@proglib:~example$ exit
logout
──────────────────────────────────────────────────────────────────────────────
Session stopped
- Press <return> to exit tab
- Press R to restart session
- Press S to save terminal output to file
|
Запустите команду clear, чтобы переместить текущую строку терминала в верхнюю часть экрана. Используйте для очистки рабочего пространства.
Используйте * при поиске файлов. Обратите внимание на разницу между следующими командами:
1
2
3
4
5
6
|
geekpress@proglib:~$ ls imports/
fix.go imports.go mkstdlib.go mod_test.go testdata/
fix_test.go mkindex.go mod.go sortimports.go zstdlib.go
geekpress@proglib:~$ ls imports/fi*
fix.go fix_test.go
|
Используйте * много раз в одной команде с символами и без:
1
2
|
geekpress@proglib:~$ ls Git/Parser/source/f*i*x*
fix.go fix_test.go
|
Ну все! Теперь вы точно застрахованы от случаев, когда bash команда не найдена.