Если вы здесь, вероятно, вы столкнулись с проблемой изучения 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 ~» или просто «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 |
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, --alldo 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 |
CAT(1) User Commands CAT(1) NAMEcat - concatenate files and print on the standard output SYNOPSIScat [OPTION]... [FILE]... DESCRIPTIONConcatenate 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 |
Если файл большой, можно вместо cat использовать команду more, она выведет содержимое файла постранично. Листаем пробелом, выходим по клавише q.
«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 |
«cp» копирует файл:
1 2 |
geekpress@proglib:~example$ cp 2 22 && ls y z 1 2 |
«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 mobilizeemberduty mobilizeember mobilize geekpress@proglib:~dir$ ls t |
Нажмите клавишу tab после «ls t«, и команда будет завершена автоматически.
1 2 |
geekpress@proglib:~dir$ ls mobilizeemberduty mobilizeemberduty |
Иногда нужно нажимать tab несколько раз:
1 2 3 4 |
geekpress@proglib:~dir$ ls m geekpress@proglib:~dir$ ls mo mobilize mobilizeember |
Bash хранит историю ранее введенных команд. Чтобы выполнить поиск нажмите Ctrl + r:
1 |
geekpress@proglib:~dir$ |
Нажимаем Ctrl + r:
1 |
(reverse-i-search)': |
Вводим «mobi» и находим последнюю команду с этой строкой:
1 2 |
(reverse-i-search) mobi’: touch mobilize |
Деревья каталогов, использование диска и процессы
По умолчанию 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 7 8 9 |
geekpress@proglib:~example$ tree -L 2 . └── 7.3 ├── apache2 ├── cli ├── fpm └── mods-available 5 directories, 0 files |
Скрывайте пустые каталоги в дереве с помощью «—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: Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully |
«logout» выполняет выход пользователя из сеанса оболочки:
1 2 3 4 5 6 7 |
geekpress@proglib:~example$ logout ────────────────────────────────────────────────────────────────────────────── Session stopped - Press 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 to exit tab - Press R to restart session - Press S to save terminal output to file |
Запустите команду «clear«, чтобы переместить текущую строку терминала в верхнюю часть экрана. Используйте для очистки рабочего пространства.
Используйте «*» при поиске файлов. Обратите внимание на разницу между следующими командами:
1 2 3 4 5 |
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 команда не найдена.
Ваш комментарий будет первым