Bash-команды для экономии времени
BASH — Bourne-Again SHell (что может переводится как «перерожденный шел», или «Снова шел Борна(создатель sh)»), самый популярный командный интерпретатор в юниксоподобных системах, в особенности в GNU/Linux.
Данная статья является кратким введением в bash-команды. Умение обращаться с командной строкой — ключевой навык для экономии времени. Мы поговорим о 21 самой популярной команде, ключевых флагах и горячих клавишах в Bash.
Определения
Термины Unix, Linux, Bash, shell (оболочка), командная строка, терминал и сценарий командной строки — это мало похожие между собой вещи. Однако во всех них есть общие команды, о которых мы и поговорим. Вот быстрый обзор сходств и различий.
Unix — это популярная операционная система компьютеров, созданная Bell Labs в 1970-х, которая не являлась системой с открытым кодом.
Linux — самая популярная модификация Unix, установленная на огромном количестве устройств по всему миру.
Терминал — это программа-эмулятор, которая дает доступ к операционной системе. Одновременно можно открывать несколько окон терминалов.
Язык оболочки shell используется для отправки команд в базовую операционную систему.
Bash — это аббревиатура для Bourne Again Shell («Возрожденный» shell). Это стандартный язык оболочки для коммуникации с операционной системой. Кроме того, он является стандартной оболочкой для macOS.
Интерфейс командной строки (CLI) — это интерфейс, основанный на вводе данных с клавиатуры. С его помощью вы указываете команды. В основном он используется для всевозможных действий с файлами и для получения информации в режиме реального времени. Является противоположностью графического интерфейса (GUI), в котором используется мышь. CLI обычно называют командной строкой.
Скрипт — это небольшая программа, содержащая последовательность shell-команд. Скрипты записываются в файлы и могут быть повторно использованы. В скриптах вы можете создавать переменные, условные выражения, циклы, функции и т.д.
Небольшое уточнение: термины «директория» и «папка» означают одно и то же.
Стандартные потоки ввода/вывода— это стандартный ввод (stdin), стандартный вывод (stdout) и стандартная ошибка (stderror). В статье они будут фигурировать довольно часто.
Само собой, префикс my_whatever во всех командах надо менять на нужное вам имя.
Перейдем к списку полезных команд.
Получение информации
man
: вывод руководства (справки) для командыpwd
: вывод рабочей директорииls
: список содержимого директорииps
: просмотр выполняемых процессов
Действия
cd
: изменение рабочей директорииtouch
: создание файлаmkdir
: создание директорииcp
: копированиеmv
: переименование/перемещениеln
: ссылка
Перенаправление и конвейеризация
<
: перенаправление stdin>
: перенаправление stdout|
: конвейерная передача содержимого из одной команды в другу
Чтение
head
:чтение начала файлаtail
:чтение конца файлаcat
: чтение файла или конкатенация файла
Завершение
rm
: удалениеkill
: завершение процесса
Поиск
grep
: поискag
: поиск
Архивация
tar
: объединение нескольких файлов в один.
А теперь поговорим о них подробнее!
Bash-команды: разъяснение
Для начала рассмотрим команды, которые возвращают информацию в форме stdout(стандартный вывод). Обычно stdout прописывается в терминале.
Получение информации
man command_name
: вывод руководства по команде (как раздел «Справка»).
pwd
: вывод пути текущей директории. Вам все-таки нужно знать, в какой именно части файловой системы вы находитесь.
ls
: список содержимого директории. Еще одна суперпопулярная команда.
ls -a
: список скрытых файлов.
ls -l
: получение подробной информации о файлах с.
Обратите внимание, что флаги можно сочетать и так: ls -al
.
ps
: просмотр выполняемых процессов.
ps -e
: вывод всех запущенных процессов (а не только связанных с текущей оболочкой).
Действия
cd my_directory
: изменение рабочей директории на my_directory.
touch my_file
: создание my_file в определенном месте.
mkdir my_directory
: создание my_directory в определенном месте.
mv my_file target_directory
: перемещение my_file в target_directory.
mv
можно использовать для переименования папки или файла. Делается это так:
mv my_old_file_name.jpg my_new_file_name.jpg
cp my_source_file target_directory
: создание копии source_file и размещение ее в target_directory.
ln -s my_source_file my_target_file
: прилинковка my_target_file к my_source_file через символическую ссылку.
При обновлении содержимого my_source_file также автоматически обновляется содержимое my_target_file. При обновлении содержимого my_target_file обновляется и my_source_file.
При удалении my_source_file удаляется и содержимое my_target_file. При этом сами файлы никуда не пропадают. Они просто становятся пустыми.
При удалении my_target_file с файлом my_source_file ничего не происходит, его содержимое не меняется.
Флаг -s
позволяет связывать еще и директории.
Теперь посмотрим, как работает конвейеризация и перенаправление выходных значений.
Конвейеризация и перенаправление
my_command < my_file
: перенаправление stdin в my_file. Полезная команда, если для выполнения действий my_command нужны входные пользовательские значения.
my_text > my_file
: перенаправление stdout в my_file. Создает my_file, если его нет. Перезаписывает my_file, если он уже существует в системе.
Например, ls > my_folder_contents.txt
создает текстовый файл со списком содержимого вашей рабочей директории.
С помощью двойного символа >>
можно задать присоединение stdout к my_file вместо перезаписи файла.
Теперь рассмотрим конвейерные команды.
first_command | second_command
: символ конвейера «|
» используется для отправки результата выполнения одной команды в другую. stdout из команды слева от конвейера передается в stdin команды справа.
«Все есть конвейер», — это слоган в Unix, в котором имеется в виду, что почти любая правильная команда может передаваться через конвейер.
Цепочка команд с символом «|» создает цепочку конвейеров. Несколько конвейеров можно добавить в цепочку следующим образом:
first_command | second_command | third_command
Обратите внимание, что конвейеры выполняют все команды параллельно. Такое поведение периодически приводит к неожиданным результатам.
Теперь давайте посмотрим, как выполнить операцию чтения из командной строки.
Чтение
head my_file
: чтение первых строк my_file. Также можно прочитать и другие stdin.
tail my_file
:чтение последних строк my_file. Можно прочитать и другие stdin.
Если вы специалист по анализу данных и пользуетесь pandas, то последние две команды могут показаться вам знакомыми. Если нет, то голова (head) и хвост (tail) — это весьма уместные метафоры, благодаря которым эти команды легко запомнить.
Давайте узнаем, как еще можно прочитать файлы.
cat
выводит файл или делает конкатенацию нескольких файлов, в зависимости от количества передаваемых файлов.
cat my_one_file.txt
: для одного файла cat выводит содержимое в stdout.
При наличии двух и более файлов команда cat
ведет себя иначе.
cat my_file1.txt my_file2.txt
: для двух и более файловcat
объединяет содержимое файлов и выводит результат в stdout.
Если вы хотите сохранить конкатенированные файлы в виде нового файла, то воспользуйтесь оператором записи «>
»:
cat my_file1.txt my_file2.txt > my_new_file.txt
Теперь перейдем к удалению и завершению процессов.
Завершение
rm my_file
: удаление my_file из файловой системы.
rm -r my_folder
: рекурсивное удаление my_folder, а также всех файлов и подпапок в in my_folder. -r
означает рекурсию.
Добавьте -f
, если не хотите получать запросы на подтверждение для каждого удаления.
kill 012345
: завершение запущенного процесса с предоставлением дополнительного времени на окончание процесса.
kill -9 012345
: принудительное завершение запущенного процесса. -s SIGKILL
— это то же самое, что и -9
.
Поиск
Следующие несколько команд (grep
, ag
и ack
) также нужны для поиска. Grep
— это старая, проверенная классика: надежная, но менее быстрая и удобная.
grep my_regex my_file
: поиск my_term в my_file. Возвращает всю строку из файла для каждого совпадения. my_term — это регулярное выражение по умолчанию.
grep -i my_regex my_file
: -i
убирает чувствительность поиска к регистру.
grep -v my_regex my_file
: возвращает все строки, не содержащие my_term. В отличие от многих языков, -v
возвращает инверсию.
grep -c my_regex my_file
:возвращает количество совпадений, найденных через -c
.
grep -R my_regex my_folder
: рекурсивный поиск всех файлов в папке и подпапках через -R
.
А сейчас обратимся к Ag
— младшему, более шустрому и привлекательному брату grep
.
ag my_regex my_file
: возвращает номер строки и саму строку с совпадением.
ag -i my_regex my_file
:-i
убирает чувствительность к регистру.
Ag автоматически читает ваш файл .gitignore и исключает результаты из всех совпадающих файлов и папок.
ag my_regex my_file–skip-vcs-ignores
: перезаписывает системный файл автоматического контроля версии через –skip-vcs-ignores
.
Можно создать файл .agignore для исключения из Ag путей к файлам.
Третий сородич — это Ack. Ag и Ack — почти что близнецы. Они на 99% взаимозаменяемы. Ag работает быстрее, поэтому я буду использовать его.
Архивация
Теперь рассмотрим создание tar-архивов.
tar my_source_directory
: объединяет несколько файлов из исходной директории в один тарбол-файл. Такая команда удобна для распределения файлов для скачивания.
Тарбол обладает файловым расширением .tar, которое означает Tape ARchive (архив на магнитной ленте). «Магнитная лента» говорит о возрасте этой команды!
tar -cf my_file.tar my_source_directory
: создает tar-файл my_file.tar с содержимым my_source_directory. -c
— от слова «create», а -f
— от слова «file».
Tar-file можно извлечь с помощью -xf
.-x
означает extract («извлечение»), а -f
— «file».
tar -xf my_file.tar
распаковывает файлы из my_file.tar в текущую рабочую директорию.
Сейчас познакомимся с архивацией и распаковкой .tar-файлов.
tar -cfz my_file.tar.gz my_source_directory
использует gzip для сжатия файлов. -c
означает «create», -f
— это «file», а -z
— это «zip» («архивировать»). Gzip экономит место и время скачивания для использующих ваш файл.
Распаковка .tar.gz файла делается через добавление флага -z
к команде извлечения, которую мы видели выше:
tar -xfz my_file.tar.gz
tar содержит множество других полезных флагов.
Bash-псевдонимы
Создавайте Bash-псевдонимы (ярлыки), чтобы меньше нажимать на клавиши в терминале. Тогда вы сможете вводить, например, bu
вместо python setup.py sdist bdist_wheel
.
Просто добавьте следующую строку к ~/.bash_profile
:
alias bu=”python setup.py sdist bdist_wheel”
Если у вас нет файла ~/.bash_profile
, то создайте его в командной строке через команду touch
.
Затем перезапустите терминал и нажмите на две клавиши для создания Python-пакета. Круто вводить 2 буквы вместо 44.
Добавьте нужные вам псевдонимы и смотрите, как растет ваша продуктивность.
Подведем итог всему сказанному.
Bash-команды: итоги
Получение информации
man
: вывод руководства (справки) по командеpwd
: вывод рабочей директорииls
: список содержимого директорииps
: просмотр выполняемых процессов
Действия
cd
: изменение рабочей директорииtouch
: создание файлаmkdir
: создание директорииcp
: копированиеmv
: удаление или переименованиеln
: ссылка
Перенаправление и конвейеризация
<
: перенаправление stdin>
: перенаправление stdout|
: конвейерная передача содержимого из одной команды в другую
Чтение
head
:чтение начала файлаtail
:чтение конца файлаcat
: чтение файла или конкатенация файлов
Завершение
rm
: удалениеkill
: завершение процесса
Поиск
grep
: поискag
: поиск
Архивация
tar
: объединение нескольких файлов в один.