Linux

21 Bash-команда для экономии времени

Данная статья является кратким введением в 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 во всех командах надо менять на нужное вам имя.

Перейдем к списку полезных команд.

Toп-21 Bash-команд

Получение информации

man: вывод руководства (справки) для команды 
pwd: вывод рабочей директории 
ls: список содержимого директории 
ps: просмотр выполняемых процессов

Действия

cd: изменение рабочей директории 
touch: создание файла 
mkdir: создание директории 
cp: копирование
mv: переименование/перемещение
ln: ссылка

Перенаправление и конвейеризация

<: перенаправление stdin
 >: перенаправление stdout
 |: конвейерная передача содержимого из одной команды в другу

Чтение

head:чтение начала файла 
tail:чтение конца файла 
cat: чтение файла или конкатенация файла

Завершение

rm: удаление
kill: завершение процесса

Поиск

grep: поиск
ag: поиск

Архивация

tar: объединение нескольких файлов в один.

А теперь поговорим о них подробнее!

Топ-21 команд: разъяснение

Для начала рассмотрим команды, которые возвращают информацию в форме stdout(стандартный вывод). Обычно stdout прописывается в терминале.

Получение информации

man command_name: вывод руководства по команде (как раздел «Справка»).

pwd: вывод пути текущей директории. Вам все-таки нужно знать, в какой именно части файловой системы вы находитесь.

ls: список содержимого директории. Еще одна суперпопулярная команда.

ls -a: список скрытых файлов.

ls -l: получение подробной информации о файлах с.

Обратите внимание, что флаги можно сочетать и так: ls -al.

ps: просмотр выполняемых процессов.

ps -e: вывод всех запущенных процессов (а не только связанных с текущей оболочкой). 

Действия

cd my_directory: изменение рабочей директории на my_directory

CD

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

Pipeline

Обратите внимание, что конвейеры выполняют все команды параллельно. Такое поведение периодически приводит к неожиданным результатам. 

Теперь давайте посмотрим, как выполнить операцию чтения из командной строки.

Чтение

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!

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

Тарбол обладает файловым расширением .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.

Добавьте нужные вам псевдонимы и смотрите, как растет ваша продуктивность.

Подведем итог всему сказанному.

Топ-21 Bash-команд: итоги

Получение информации

man: вывод руководства (справки) по команде 
pwd: вывод рабочей директории 
ls: список содержимого директории 
ps: просмотр выполняемых процессов

Действия

cd: изменение рабочей директории 
touch: создание файла 
mkdir: создание директории 
cp: копирование
mv: удаление или переименование 
ln: ссылка

Перенаправление и конвейеризация

<: перенаправление stdin
 >: перенаправление stdout
 |: конвейерная передача содержимого из одной команды в другую

Чтение

head:чтение начала файла 
tail:чтение конца файла 
cat: чтение файла или конкатенация файлов

Завершение

rm: удаление
kill: завершение процесса

Поиск

grep: поиск
ag: поиск

Архивация

tar: объединение нескольких файлов в один.

Заключение

Как и в любом другом языке программирования, для изучения Bash нужна практика. Воспользуйтесь предложенными командами для увеличения своей продуктивности или интересно проведите время, обучая Bash других.

Перевод статьи Jeff Hale: Rock the Command Line