Быстрое изучение Bash: 30 легких команд для новичков
Если вы здесь, вероятно, вы столкнулись с проблемой изучения 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-6289c53709267710747217 ]': |
Вводим «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-6289c53709284499738596 ]-- 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 команда не найдена.