Найти в Дзене

Гайд по необходимому минимуму в Linux и Bash

Оглавление

В конце статьи приведены списки основных и продвинутых команд в терминале (aka консоль, bash). Поэтому вы смело можете добавить данную статью в закладки и всегда иметь при себе жизненно необходимые команды. 

Это перевод статьи Алекса Петралиа Learn just enough Linux to get things done.

Разные операционные системы длительное время обслуживают различные аудитории: Windows — бизнес-профессионалов, Mac — творческих, а Linux — разработчиков. Разработчикам ОС такой тип рыночного спектра сильно упростил концепцию продукта, технические требования, пользовательский опыт и направление рынка. Однако, он также ужесточил нормы рабочего пространства, что деформировало отдельных пользователей под узкие, непересекающиеся области: у бизнесменов нет возможности заглянуть в творческий процесс, а у разработчиков нет представления о проблемах бизнеса.

В реальности знания и опыт — динамичны, они охватывают несколько дисциплин и сфер деятельности. Представление о том, что “можно иметь способности только к чему-то одному” — это не руководство к овладению мастерством, а попытка справиться с преждевременной оптимизацией. Узнать о том, в чём вы хорошо разбираетесь можно только когда вы попробовали себя в нескольких разных вопросах. И может оказаться, что у вас есть способности ко многим видам деятельности.

Для современных бизнес-аналитиков особенно актуален вопрос ликвидации пробела между бизнесом и разработкой. Бизнес-аналитики должны быть двухплатформенными, способными использовать командную строку, доступную только на Linux (или в macOS), но при этом уметь извлекать широкие возможности из Microsoft Office в Windows. Очевидно, что мир Linux пугает тех, у кого образование в сфере бизнеса. К счастью, как и в большем количестве вопросов, вам необходимо изучить 20% информации, чтобы выполнить 80% работы. Вот мои 20%.

Почему современные бизнес-аналитики должны знать Linux

Благодаря своим open source корням, Linux выиграл от вкладов тысяч разработчиков за всё время его существования. Они построили программы и утилиты, чтобы упростить работу не только себе, но и тем программистам, которые последовали за ними. В результате open source разработка создала эффект сетевой выгоды: чем больше разработчики строили утилиты на оригинальной платформе, тем больше других разработчиков могло влиять на эти утилиты, чтобы писать собственные программы.

В результате получился огромный пакет программ и утилит (то есть софт), который был написан на Linux и под Linux. Большая часть его никогда не портировалась в Windows. Один из примеров — популярная система контроля версий (VCS), которая называется git. Разработчики могли написать софт под Windows, но они этого не сделали. Они написали его для работы в командной строке, для Linux, потому что Linux — экосистема, в которой уже были все необходимые инструменты.

Если вдаваться в подробности, разработка на Windows ведёт к двум основным проблемам:

  • Базовые задачи, вроде парсинга файлов, рабочего планирования и поиска текста используются чаще, чем запуск утилиты командной строки.
  • Языки программирования (Python, C++) и связанные с ними библиотеки выкидывают ошибки, потому что они ожидают конкретных параметров Linux или специфических локаций файловой системы.

Если собрать всё вместе, это выльется в трату времени на переписывание базовых инструментов, которые уже доступны в Linux, они позволят избежать ошибок совместимости с ОС. Тут нет никаких сюрпризов — экосистема Windows просто не была задумана и спроектирована под нужды разработки софта.

Теперь давайте рассмотрим базовые идеи Linux.

Фундаментальная единица Linux: “оболочка”

Shell (оболочка, также известная как терминал, консоль или командная строка) — это текстовый интерфейс пользователя, через который команды отправляются машине. На Linux, по-умолчанию, язык оболочки называется bash. В отличие от Windows-пользователей, которые в своём большинстве используют навигацию “навести-кликнуть” по окну, Linux-разработчики привязаны к клавиатуре и пишут команды в оболочке. Хоть этот переход далёк от естественного для тех, у кого нет бэкграунда в программировании, плюсы разработки в Linux сильно перевешивают изначальное вложение в обучение.

-2

Изучаем несколько важных концептов

В сравнении с достаточно зрелым языком программирования, bash имеет всего несколько основных концептов, которые необходимо выучить. Как только вы охватите это, остаток bash — простое запоминание. Я переформулирую понятней: хорошо разбираться в bash значит запомнить 20–30 команд и их часто используемые аргументы.

Linux кажется непроницаемым для тех, кто не касается разработки, из-за способа, которым разработчики (не напрягаясь) извергают эзотерические команды терминала, когда им захочется. Правда в том, что они хорошо знают только несколько десятков команд — за всем более сложным они так же (как и все смертные) обращаются в Google.

Опуская мелкие загвоздки, стоящие на пути, вот главные концепты в bash.

Командный синтаксис

Команды соответствуют синтаксису: {command} {arguments..}

Например, в ‘grep -inr’, grep — это команда (для поиска текстовой строки) и -inr это флаги/аргументы, которые меняют то, что grep выполняет по умолчанию. Единственный способ понять, что это значит, поискать что-то о них через Google или просто ввести ‘man grep’. Я рекомендую выучить команды и их самые используемые аргументы: слишком обременительно помнить, что делает каждый флаг.

Псевдонимы директорий

  • Текущая директория (где я?): .
  • Родительская директория текущей директории: ..
  • Домашняя директория пользователя: ~
  • Корень файловой системы (или родитель всех родителей): /

Например, чтобы поменять текущую директорию на родительскую директорию нужно ввести: cd ..

Таким же способом, чтобы скопировать файл, расположенный в “/path/to/file.txt” в текущую директорию, нужно ввести cp /path/to/file.txt . (заметьте, что в конце команды точка). Поскольку это всего лишь псевдонимы, вместо них может использоваться реальное имя пути.

STDIN / STDOUT

Всё, что вы пишите в окне и подтверждаете (с помощью ENTER), называется стандартным вводом (STDIN).

Всё, что программа выводит в ответе в терминал (например текст из файла), называется стандартным выводом (STDOUT)

Конвейер (piping)

  • |

Pipe принимает STDOUT от команды слева от pipe и превращает его в STDIN для команды справа от pipe.

пример: echo 'test text' | wc -l

  • >

Символ “больше” принимает STDOUT от команды слева и записывает/перезаписывает в новый файлу справа

пример: ls > tmp.txt

  • >>

Два символа “больше” принимают STDOUT от команды слева и добавляют к новому или существующему файлу справа.

пример: date >> tmp.txt

Шаблоны поиска (wildcards)

Можете представить это как символ % в SQL. Например, можно написать WHERE first_name LIKE 'John%', чтобы найти любые позиции, где данные начинаются с имени John.

В bash можно написать John*. Если вы хотите вывести список всех файлов в какой-то папке, заканчивающихся на ".json", пишете : ls *.json

Завершение с помощью tab

Bash часто завершает команды сам, по определённой логике, если вы начинаете вводить команду и нажимаете TAB.

Однако, стоит попробовать что-то вроде zsh или fish для автозаполнения, потому что запоминать команды и все их параметры очень сложно. Более того, эти инструменты применят автозаполнение, основываясь на вашей истории используемых команд.

Выход

Иногда вы застреваете в какой-нибудь программе и не можете оттуда выйти. Это очень часто повторяющееся событие для новичков в Linux, которое невероятно демотивирует. Часто выход происходит с помощью чего-то, содержащего q. Хорошо бы запомнить то, что будет написано ниже и использовать, когда вы в ловушке.

  • Bash

   - CTRL+ c

   -  q

   -  exit

  • Python: quit()
  • Nano: CTRL+x
  • Vim: :q!

Что я помню из команд bash

Это те команды, которые я использую чаще всего в Linux (начиная от самых часто используемых к самым редко используемым). Как я уже писал раньше, знание всего горстки команд поможет выполнять большой набор необходимых программируемых задач.

  • cd {directory} изменить директорию
  • ls -lha вывести директорию в виде списка (подробного)
  • vim или nano редактор командной строки
  • touch {file} создать новый пустой файл
  • cp -R {original_name} {new_name} скопировать файл или директорию (и всё их содержимое)
  • mv {original_name} {new_name} переместить или переименовать файл
  • rm {file} удалить файл
  • rm -rf {file/folder} удалить файл или папку без возможности восстановления [использовать аккуратно!]
  • pwd вывести текущую рабочую директорию
  • cat или less или tail или head -n10 {file} вывести в STDOUT содержимое файла
  • mkdir {directory} создать пустую директорию
  • grep -inr {string} найти строку в любом файле этой директории или дочерних директориях
  • column -s, -t <delimited_file> отобразить разделенный запятыми файл в виде столбцов
  • ssh {username}@{hostname} соединиться с удалённой машиной
  • tree -LhaC 3 показать структуру директории на 3 уровнями вглубь (с размерами файлов и включая скрытые директории)
  • htop (или top) диспетчер задач
  • pip install --user {pip_package} пакетный менеджер Python для установки пакетов в ~/.local/bin
  • pushd . ; popd ; dirs; cd - push/pop/view директорию в стек + изменить обратно на последнюю директорию
  • sed -i "s/{find}/{replace}/g" {file} заменить строку в файле
  • find . -type f -name '*.txt' -exec sed -i "s/{find}/{replace}/g" {} \; заменить строку для каждого файла в этой и дочерней папках с именем типа *.txt
  • tmux new -s session, tmux attach -t session создать новую сессию терминала без создания нового окна [продвинутый уровень]
  • wget {link} загрузить веб-страницу или веб-ресурс
  • curl -X POST -d "{key: value}" http://www.google.com отправить HTTP-запрос на веб-сервер
  • find <directory> вывести список всего содержимого директории и её дочерних директорий рекурсивно

Продвинутые и не часто используемые команды

Я считаю хорошей практикой хранить список команд, которые полезны в определённых ситуациях, даже если подобные ситуации случаются редко (например, какой процесс блокирует конкретный сетевой порт). Вот несколько нестандартных команд, которые у меня всегда под рукой:

  • lsof -i :8080 вывести список дескрипторов открытых файлов (-i — флаг для сетевых интерфейсов)
  • netstat | head -n20 вывести список открытых интернет/UNIX сокетов и связанной с ними информации
  • dstat -a транслировать текущий диск, сеть, активность CPU и другое
  • nslookup <IP address> найти hostname для удалённого IP-адреса
  • strace -f -e <syscall> <cmd> отследить системные вызовы программы (-e — флаг для фильтрования конкретных системных вызовов)
  • ps aux | head -n20 вывести текущие активные процессы
  • file <file> проверить тип файла (например исполняемый, бинарный, текстовый файл с кодировкой ASCII)
  • uname -a информация о ядре ОС
  • lsb_release -a информация об ОС
  • hostname проверить hostname текущего компьютера (например, название, чтобы другие компьютеры могли иметь доступ к вашему)
  • pstree визуализировать форки процессов
  • time <cmd> исполнить команду и составить статистику о том, сколько времени потребовалось на исполнение
  • CTRL + z ; bg; jobs; fg отправить процесс в текущий tty в background и обратно на передний план
  • cat file.txt | xargs -n1 | sort | uniq -c посчитать количество уникальных слов в файле
  • wc -l <file> количество строк в файле
  • du -ha показать размер на диске для директорий и их содержимого
  • zcat <file.gz> вывести содержимое заархивированного текстового файла
  • scp <user@remote_host> <local_path> скопировать файл с удалённого на локальный сервер или наоборот
  • man {command} показать инструкцию, (т.е. документацию) для команды (но скорее всего легче использовать Google)

Перевод: Наталия Басс

Originally published at ru.hexlet.io.

Что-то пошло не так, и нам не удалось загрузить комментарии. Попробуйте ещё раз
Рекомендуем почитать
Рассматриваю реакции поклонников Linux на неудобные статьи в сети. Часть 1
Дистрибутивы Linux практически мертвы в настольном сегменте, и такая ситуация сохраняется на протяжении десятилетий. Почему? На этот вопрос невозможно ответить парой предложений — тому есть масса причин. И одна из них — сами линуксоиды. Вот я могу сказать что «Windows — хлам». Даже прикреплю обоснования данным словам. А что дальше? Да ничего, большинству людей будет всё равно. Ведь какой бы плохой Windows ни была — она есть, и удовлетворяет потребности большинства. Но что если я скажу «Linux — хлам»?...
Что не так с отечественными Линуксами?
Привет! Все мы наслышаны про: Астра, РЕДОС и другие: отечественные линуксы, которые мы, вроде как, должны полюбить и начать пользоваться. Или не должны? Импортозамещение — штука важная и полезная. Операционные системы? Тоже свои есть — РЕДОС, Астра, Альт. Но есть нюанс. Ну, точнее — их несколько. Спасибо, что поддержали канал😉 Астра Линукс — флагман. Её ставят в школах, больницах, госструктурах. Всё бы ничего, но… Пробовали ли вы когда-нибудь реально посидеть за ней? Интерфейс Windows XP или Windows 95, только без своей культовой аутентичности...
Лучший дистрибутив Linux для дома и сервера
Привет друзья, сегодня я хочу вам рассказать о Linux. Вначале эта система может показаться чем-то сложным и недоступным для понимания. Однако, большинство из нас сталкивается с ней ежедневно, не зная об этом. Linux — операционная система, ядро которой распространяется на бесплатной основе. Она состоит из ядра системы и набора небольших программ, взаимодействующих с этим ядром. На базе этого ядра  построена операционная система Android. Если у вас есть устройство на базе Android, то вы уже относитесь к пользователям Linux...
Следующая статья
Документы, вакансии и контакты