автордың кітабын онлайн тегін оқу Linux. Командная строка. Лучшие практики
Переводчик А. Гаврилов
Дэниел Джей Барретт
Linux. Командная строка. Лучшие практики. — СПб.: Питер, 2023.
ISBN 978-5-4461-2300-1
© ООО Издательство "Питер", 2023
Все права защищены. Никакая часть данной книги не может быть воспроизведена в какой бы то ни было форме без письменного разрешения владельцев авторских прав.
Предисловие
Эта книга позволит перейти на новый уровень использования командной строки Linux, чтобы вы могли работать быстрее, умнее и эффективнее.
Если вы похожи на большинство пользователей Linux, то приобрели первоначальные навыки использования командной строки на работе, или прочитав вводную книгу, или установив Linux дома и просто попробовав. Моя книга должна помочь вам сделать следующий шаг — развить навыки работы с командной строкой Linux от среднего до продвинутого уровня. Она наполнена методами и концепциями, которые, я надеюсь, изменят ваше взаимодействие с Linux и повысят производительность. Воспринимайте ее как вторую книгу по использованию Linux, которая выведет вас за рамки азов.
Командная строка — самый простой и вместе с тем самый сложный из интерфейсов. Он прост, потому что содержит только приглашение командной строки, которое ждет ваших действий1:
$
Он сложный, потому что за все, что выходит за рамки приглашения, отвечаете только вы. Нет понятных значков, кнопок или меню, которые могли бы помочь. Вместо этого каждая введенная команда является результатом ваших усилий. Это верно как для основных команд, таких, например, как вывод списка файлов:
$ ls
так и для более сложных, например:
$ paste <(echo {1..10}.jpg | sed 's/ /\n/g') \
<(echo {0..9}.jpg | sed 's/ /\n/g') \
| sed 's/^/mv /' \
| bash
Если вы смотрите на предыдущую команду и думаете: «Что это, черт возьми?» или «Мне бы никогда не понадобилась такая сложная команда», то эта книга для вас2.
Чему вы научитесь
Эта книга поможет вам быстро и эффективно освоить три основных навыка:
• Выбор и создание команд для решения текущей задачи.
• Эффективный запуск команд.
• Удобная навигация по файловой системе Linux.
Прочитав книгу, вы будете понимать, что остается за кадром при запуске команды, и научитесь лучше предсказывать ее результаты (а не руководствоваться суевериями). Вы познакомитесь с дюжиной разных способов запуска команд и узнаете, когда лучше использовать каждый из них. Вы также узнаете приемы и хитрости, которые сделают вашу работу продуктивнее. Например:
• Построение сложных команд из простых, шаг за шагом, для решения практических задач, например управления паролями или создания тысяч тестовых файлов.
• Экономия времени за счет продуманной организации домашнего каталога, чтобы вам не приходилось искать нужные файлы.
• Преобразование текстовых файлов и получение из них данных для решения поставленных задач.
• Управление из командной строки теми операциями в Linux, которые обычно выполняются мышкой. Например, копирование и вставка с помощью буфера обмена или получение и обработка веб-данных. И все это, не отрывая рук от клавиатуры.
И самое главное, вы изучите лучшие практические методы работы в командной строке, поэтому независимо от того, какие команды вы запускаете, вы сможете добиться большего в повседневном использовании Linux и стать более конкурентоспособными на рынке труда. Я бы хотел иметь эту книгу, когда сам только начинал изучение Linux.
Чем эта книга не является
Эта книга не поможет оптимизировать и не сделает эффективнее ваш компьютер с установленной операционной системой Linux. Она лишь сделает вас более эффективными при использовании Linux.
Эта книга также не является исчерпывающим справочником по командной строке. Существуют сотни команд и функций, которые здесь не упомянуты. Эта книга об опыте. Она содержит тщательно отобранный набор практических знаний о командной строке для развития ваших навыков. В качестве справочного руководства используйте мою предыдущую книгу Linux Pocket Guide (издательство O'Reilly).
Для кого эта книга
Предполагается, что у вас есть опыт работы с Linux, поскольку эта книга не знакомит с Linux. Она предназначена, прежде всего, для пользователей, которые хотят улучшить свои навыки работы с командной строкой, таких как студенты, системные администраторы, разработчики программного обеспечения, IT-инженеры, тестировщики и энтузиасты операционной системы Linux. Опытные пользователи Linux также смогут найти для себя полезный материал, особенно если они учились методом проб и ошибок и хотят улучшить свое понимание командной строки.
Чтобы извлечь максимальную пользу из этой книги, вы уже должны быть знакомы со следующими темами (если нет, см. приложение A, где дается их краткий обзор):
• Создание и редактирование текстовых файлов с помощью редакторов vim (vi), emacs, nano, pico.
• Основные команды для работы с файлами, такие как cp (копирование), mv (перемещение или переименование), rm (удаление), chmod (изменение прав доступа).
• Основные команды для просмотра фалов, такие как cat (вывод содержимого файла) и less (постраничный вывод текста).
• Основные команды для работы с каталогами, такие как cd (переход в другой каталог), ls (вывод списка файлов и каталогов), mkdir (создание каталога), rmdir (удаление каталога), pwd (вывод пути к текущему каталогу).
• Основы сценариев командной оболочки: хранение команд Linux в файле, создание исполняемого файла (с помощью chmod 755 или chmod +x) и его запуск.
• Просмотр встроенной документации Linux, известной как man-страницы, с помощью команды man (например, man cat отображает документацию по команде cat).
• Умение стать суперпользователем с помощью команды sudo для полного доступа к операционной системе (например, команда sudo nano /etc/hosts позволяет редактировать файл /etc/hosts, изменение которого запрещено обычному пользователю).
Если вы также знакомы с общими функциями командной строки, такими как сопоставление имен файлов с шаблоном (символы * и ?), перенаправление ввода/вывода (< и >) и каналы (|), то вы уже хорошо подготовлены к изучению этой книги.
Ваша командная оболочка
Предполагается, что вашей командной оболочкой является bash, которая используется по умолчанию в большинстве дистрибутивов Linux. Под термином «оболочка» в тексте имеется в виду именно bash. Большинство идей, представленных в книге, применимы и к другим оболочкам, таким как zsh или dash (см. Приложение Б для перевода примеров в другие оболочки). Большая часть материала будет работать без изменений и в Apple Mac-терминале, который по умолчанию запускает zsh, но также может запускать и bash3.
Условные обозначения
В этой книге используются следующие условные обозначения.
Курсив
Курсивом выделены новые термины и важные понятия, а также имена файлов и каталогов.
Моноширинный шрифт
Используется для листингов программ, а также внутри абзацев для обозначения таких элементов, как переменные и функции, базы данных, типы данных, переменные среды, операторы и ключевые слова, имена файлов и их расширения.
Моноширинный полужирный шрифт
Показывает команды или другой текст, который пользователь должен ввести самостоятельно.
Моноширинный курсив
Показывает текст, который должен быть заменен значениями, введенными пользователем или определяемыми контекстом. Кроме того, этот шрифт используется для кратких пояснений в правой части листингов.
Моноширинный шрифт в рамке
Используется для привлечения внимания к отдельным частям листингов.
Шрифт без засечек
Используется для обозначения URL, адресов электронной почты, названий кнопок и других элементов интерфейса.
Использование исходного кода примеров
Вспомогательные материалы (примеры кода, упражнения и т.д.) доступны для загрузки по адресу: https://efficientlinux.com/examples. Если у вас возникнут вопросы технического характера по использованию примеров кода, направляйте их по электронной почте на адрес bookquestions@oreilly.com.
В общем случае все примеры кода из книги вы можете использовать в своих программах и в документации. Вам не нужно обращаться в издательство за разрешением, если вы не собираетесь воспроизводить существенные части программного кода. Если вы разрабатываете программу и используете в ней несколько фрагментов кода из книги, вам не нужно обращаться за разрешением. Но для продажи или распространения примеров из книги вам потребуется разрешение от издательства O'Reilly. Вы можете отвечать на вопросы, цитируя данную книгу или примеры из нее, но для включения существенных объемов программного кода из книги в документацию вашего продукта потребуется разрешение.
Мы рекомендуем, но не требуем добавлять ссылку на первоисточник при цитировании. Под ссылкой на первоисточник мы подразумеваем указание авторов, издательства и ISBN.
За разрешением на использование значительных объемов программного кода из книги обращайтесь по адресу permissions@oreilly.com.
1 Для отображения приглашения командной строки в этой книге используется символ $. В вашей операционной системе этот символ может быть другим.
2 Вы узнаете назначение этой таинственной команды в главе 8.
3 Версия bash для macOS устарела, в ней отсутствуют важные функции. Чтобы обновить bash, см. статью Дэниела Вейбеля (Daniel Weibel) Upgrading Bash on macOS (https://oreil.ly/35jux).
Вы узнаете назначение этой таинственной команды в главе 8.
Версия bash для macOS устарела, в ней отсутствуют важные функции. Чтобы обновить bash, см. статью Дэниела Вейбеля (Daniel Weibel) Upgrading Bash on macOS (https://oreil.ly/35jux).
Для отображения приглашения командной строки в этой книге используется символ $. В вашей операционной системе этот символ может быть другим.
Командная строка — самый простой и вместе с тем самый сложный из интерфейсов. Он прост, потому что содержит только приглашение командной строки, которое ждет ваших действий1:
Если вы смотрите на предыдущую команду и думаете: «Что это, черт возьми?» или «Мне бы никогда не понадобилась такая сложная команда», то эта книга для вас2.
Предполагается, что вашей командной оболочкой является bash, которая используется по умолчанию в большинстве дистрибутивов Linux. Под термином «оболочка» в тексте имеется в виду именно bash. Большинство идей, представленных в книге, применимы и к другим оболочкам, таким как zsh или dash (см. Приложение Б для перевода примеров в другие оболочки). Большая часть материала будет работать без изменений и в Apple Mac-терминале, который по умолчанию запускает zsh, но также может запускать и bash3.
Благодарности
Эту книгу было приятно писать. Спасибо замечательным людям из издательства O'Reilly, особенно редакторам Вирджинии Уилсон (Virginia Wilson) и Джону Девинсу (John Devins), редакторам производства Кейтлин Геган (Caitlin Ghegan) и Грегори Хайману (Gregory Hyman), контент-менеджеру Кристен Браун (Kristen Brown), редактору Киму Уимпсетту (Kim Wimpsett), редактору предметного указателя Сью Клефстад (Sue Klefstad) и всегда готовой помочь команде производственного отдела. Я также очень благодарен рецензентам книги Полу Байеру (Paul Bayer), Джону Бонезио (John Bonesio), Дэну Риттеру (Dan Ritter) и Карле Шредер (Carla Schroder) за ценные комментарии и критические замечания. Также спасибо Boston Linux Users Group за предложения по названию. Особая благодарность Мэгги Джонсон (Maggie Johnson) из Google за ее любезное разрешение написать книгу.
Я бы хотел выразить глубочайшую благодарность Чипу Эндрюсу (Chip Andrews), Мэтью Диазу (Matthew Diaz) и Роберту Странду (Robert Strandh), которые 35 лет назад учились со мной в Университете Джонса Хопкинса (The Johns Hopkins University). Они заметили мой растущий интерес к операционной системе Unix и, к моему крайнему удивлению, порекомендовали Департаменту компьютерных наук (Computer Science Department) нанять меня в качестве системного администратора. Их вера в меня изменила траекторию моей жизни (кстати, благодаря Роберту добавлен совет касательно навыков слепой печати в главе 3). Спасибо также тем, кто создает и поддерживает проекты Linux, GNU Emacs, Git, AsciiDoc и многие другие инструменты с открытым исходным кодом — без этих умных и щедрых людей моя карьера действительно была бы совсем другой.
Как всегда, спасибо моей замечательной семье, Лизе и Софии, за их любовь и терпение.
От издательства
Ваши замечания, предложения, вопросы отправляйте по адресу comp@piter.com (издательство «Питер», компьютерная редакция).
Мы будем рады узнать ваше мнение!
На веб-сайте издательства www.piter.com вы найдете подробную информацию о наших книгах.
Часть 1. Основные понятия
Первые четыре главы должны быстро повысить эффективность вашей работы в командной строке, познакомив вас с принципами и методами, которые можно сразу применить на практике. Вы научитесь комбинировать команды с помощью каналов, поймете функции командной оболочки Linux, сможете повторно вызывать и редактировать команды, которые ранее уже запускали, и быстро перемещаться по файловой системе Linux.
Глава 1. Объединение команд
В Windows, macOS и большинстве других операционных систем вы тратите время на запуск таких приложений, как веб-браузеры, текстовые редакторы, программы для работы с таблицами и игры. Типичное приложение содержит множество функций: все, что, по мнению разработчиков, может понадобиться пользователям. Поэтому большинство приложений самодостаточны и не связаны с другими приложениями. Вы можете время от времени копировать и вставлять данные из одного приложения в другое, но по большей части они независимы друг от друга.
Командная строка в Linux работает по-другому. Вместо больших приложений с множеством функций Linux предоставляет тысячи небольших команд с ограниченным набором возможностей. Команда cat, например, выводит на экран содержимое файлов и больше ничего. ls отображает список файлов в каталоге, mv переименовывает файлы и т.д. Каждая команда имеет простую, четко определенную цель.
Что делать, если вам нужно произвести более сложные действия? Не волнуйтесь, Linux позволяет легко объединять команды, чтобы их функции работали вместе для достижения поставленной цели. Такой способ порождает совсем другое отношение к работе за компьютером. Вместо того чтобы спрашивать себя «Какое приложение мне запустить?» для достижения необходимого результата, возникает вопрос: «Какие команды мне объединить?»
В этой главе вы узнаете, как упорядочивать и запускать команды в различных комбинациях, чтобы решать поставленные задачи. Для простоты начнем с шести команд Linux и их основных способов применения. Это позволит сосредоточиться на более сложной и интересной части — их объединении — без долгого обучения. Это все равно, что учиться готовить, используя только шесть ингредиентов, или осваивать столярное дело с применением только молотка и пилы (дополнительные команды добавятся в ваш набор в главе 5).
Вы будете объединять команды, используя канал (pipe) — функцию Linux, которая соединяет вывод одной команды с вводом другой. При представлении каждой команды (wc, head, cut, grep, sort и uniq) мы сразу же будем рассматривать пример использования канала. Некоторые примеры будут полезны для повседневной работы в Linux, в то время как другие являются искусственно выдуманными для демонстрации важной функции.
Ввод, вывод и каналы
Большинство команд Linux считывают ввод с клавиатуры, отображают вывод на экране или делают и то, и другое. В Linux эти операции чтения и записи имеют собственные названия:
stdin (стандартный ввод, или стандартный входной поток)
Поток данных, который Linux считывает при вводе с клавиатуры. Когда вы вводите любую команду в терминале после приглашения командной строки, вы передаете данные в стандартный входной поток stdin.
stdout (стандартный вывод, или стандартный выходной поток)
Поток данных, который Linux выводит на ваш дисплей. Когда вы запускаете команду ls для печати имен файлов, результаты появляются в стандартном выходном потоке stdout.
Теперь самое интересное. Вы можете подключить стандартный вывод одной команды к стандартному вводу другой, чтобы первая команда передавала свои выходные данные во вторую. Давайте начнем со знакомой команды ls -l для просмотра большого каталога, такого как /bin, в длинном формате:
$ ls -l /bin
total 12104
-rwxr-xr-x 1 root root 1113504 Jun 6 2019 bash
-rwxr-xr-x 1 root root 170456 Sep 21 2019 bsd-csh
-rwxr-xr-x 1 root root 34888 Jul 4 2019 bunzip2
-rwxr-xr-x 1 root root 2062296 Sep 18 2020 busybox
-rwxr-xr-x 1 root root 34888 Jul 4 2019 bzcat
⋮
-rwxr-xr-x 1 root root 5047 Apr 27 2017 znew
Этот каталог содержит значительно больше файлов, чем, строк на вашем дисплее, поэтому вывод быстро прокручивается за пределы экрана. Жаль, что ls не может печатать информацию по одному экрану за раз, делая паузу, пока вы не нажмете клавишу для продолжения. Но постойте: у другой команды Linux есть такая возможность. Команда less отображает файл по одному экрану за раз:
$ less myfile
Вы можете соединить эти две команды, потому что ls передает данные в стандартный вывод, а less может считывать данные из стандартного ввода. Используем канал для отправки выходных данных ls на вход команды less:
$ ls -l /bin | less
Что такое команда?
Слово команда имеет три различных значения в Linux, представленные на рис. 1.1:
Программа
Исполняемая программа, названная и выполняемая одним словом, например ls, или аналогичная функция, встроенная в оболочку, например cd (встроенная команда оболочки)4.
Простая команда
Имя программы или встроенной команды оболочки, за которым могут следовать аргументы, например ls -l /bin.
Комбинированная команда
Несколько простых команд, рассматриваемых как единое целое, например конвейер ls -l /bin | less
Рис. 1.1. Программы, простые команды и комбинированные команды называются «командами»
В этой книге слово «команда» используется во всех этих смыслах. Обычно из контекста понятно, что имеется в виду, но если нет, будем использовать один из более конкретных терминов.
Эта объединенная команда отображает содержимое каталога по одному экрану за раз. Вертикальная черта (|) между командами — это символ5 канала в Linux. Он соединяет стандартный вывод первой команды со стандартным вводом следующей. Командная строка, содержащая каналы, называется конвейером (pipeline).
Команды обычно не знают, что они являются частью конвейера. ls считает, что выводит данные на дисплей, хотя на самом деле ее вывод был перенаправлен на less. А less верит, что читает данные с клавиатуры, когда на самом деле получает вывод ls.
Шесть команд для начала
Использование каналов — неотъемлемая часть работы с Linux. Давайте развивать ваши навыки работы с каналами с помощью небольшого набора команд Linux. Когда вы столкнетесь с какими-то из этих команд в будущем, то будете готовы их объединять.
Команды wc, head, cut, grep, sort и uniq имеют множество опций и режимов работы, про которые пока умолчим, чтобы сосредоточиться на каналах. Если хотите узнать больше о конкретной команде, запустите команду man, которая отобразит полную документацию. Например:
$ man wc
Для демонстрации этих шести команд в действии будем использовать файл с именем animals.txt, в котором перечислены некоторые сведения из книг издательства O'Reilly. Содержимое файла представлено в примере 1.1.
Пример 1.1. Содержимое файла animals.txt
python Programming Python 2010 Lutz, Mark
snail SSH, The Secure Shell 2005 Barrett, Daniel
alpaca Intermediate Perl 2012 Schwartz, Randal
robin MySQL High Availability 2014 Bell, Charles
horse Linux in a Nutshell 2009 Siever, Ellen
donkey Cisco IOS in a Nutshell 2005 Boney, James
oryx Writing Word Macros 1999 Roman, Steven
Каждая строка содержит четыре факта о какой-либо книге издательства O'Reilly, разделенные одним символом табуляции: животное на обложке, название книги, год публикации и имя первого автора.
Команда #1: wc
Команда wc выводит количество строк, слов и символов в файле:
$ wc animals.txt
7 51 325 animals.txt
wc сообщает, что в файле animals.txt 7 строк, 51 слово и 325 символов. Если вы посчитаете символы, включая пробелы и табуляции, то найдете только 318 символов, но wc также учитывает скрытые символы новой строки.
Опции -l, -w и -c указывают wc печатать только количество строк, слов и символов соответственно:
$ wc -l animals.txt
7 animals.txt
$ wc -w animals.txt
51 animals.txt
$ wc -c animals.txt
325 animals.txt
Вывод параметров текста — настолько полезная и часто встречающаяся задача, что авторы wc разработали свою команду специально для работы с каналами. Если вы не указываете имя файла, она читает данные из стандартного ввода и отправляет данные в стандартный вывод. Давайте воспользуемся ls для вывода содержимого текущего каталога и используем wc для подсчета строк. Этот конвейер отвечает на вопрос «Сколько файлов в моем текущем каталоге?»:
$ ls -1
animals.txt
myfile
myfile2
test.py
$ ls -1 | wc -l
4
Опция -1, указывающая ls выводить результаты в один столбец, здесь не обязательна. Чтобы узнать, почему мы ее использовали, см. врезку «ls меняет свое поведение при перенаправлении вывода» на с. 23.
wc — это первая команда, с которой мы познакомились в этой главе, поэтому пока сложно использовать каналы. Ради интереса направим вывод wc самой себе, чтобы продемонстрировать, что одна и та же команда может появляться в конвейере более одного раза. Эта комбинированная команда сообщает, что количество слов в выводе wc равно четырем (три целых числа и имя файла):
$ wc animals.txt
7 51 325 animals.txt
$ wc animals.txt | wc -w
4
Не будем останавливаться. Добавим третий вызов wc в конвейер и посчитаем количество строк, слов и символов в выводе 4:
$ wc animals.txt | wc -w | wc
1 1 2
ls меняет свое поведение при перенаправлении вывода
В отличие от большинства других команд Linux, ls знает, выводит ли она данные на экран или перенаправляет в канал. Когда stdout — это экран, ls упорядочивает вывод в несколько колонок для удобства чтения:
$ ls /bin
bash dir kmod networkctl red tar
bsd-csh dmesg less nisdomainname rm tempfile
⋮
При перенаправлении stdout ls создает одну колонку. Убедимся в этом, передав вывод ls команде, которая воспроизводит свой ввод, такой как cat6:
$ ls /bin | cat
bash
bsd-csh
bunzip2
busybox
⋮
Это может привести к неожиданным результатам, как в следующем примере:
$ ls
animals.txt myfile myfile2 test.py
$ ls | wc -l
4
Первая команда ls выводит все имена файлов в одну строку, а вторая сообщает, что выводятся четыре строки. Если вы не знаете об особых свойствах ls, это несоответствие может удивить.
ls позволяет переопределить свое поведение по умолчанию. Вы можете заставить ls вывести на экран одну колонку с помощью параметра -1 или несколько колонок с параметром -C.
Вывод указывает на одну строку (содержащую число 4), одно слово (само число 4) и два символа. Почему два? Потому что строка 4 заканчивается скрытым символом новой строки.
Думаю, что достаточно простейших конвейеров с wc. По мере того как мы изучим больше команд, конвейеры станут более практичными.
Команда #2: head
Команда head выводит первые строки файла. Выведем первые три строки файла animals.txt, используя head с параметром -n:
$ head -n3 animals.txt
python Programming Python 2010 Lutz, Mark
snail SSH, The Secure Shell 2005 Barrett, Daniel
alpaca Intermediate Perl 2012 Schwartz, Randal
Если вы запрашиваете больше строк, чем содержится в файле, head выведет весь файл (как это делает cat). Если вы опустите параметр -n, заголовок по умолчанию будет состоять из 10 строк (-n10).
Сама по себе функция head удобна для просмотра начала файла, когда вас не интересует остальное содержимое. Эта команда работает быстро и эффективно даже с очень большими файлами, поскольку ей не нужно считывать весь файл. Кроме того, head умеет считывать данные из стандартного ввода и использует стандартный вывод, что делает ее полезной в конвейерах. Подсчитаем количество слов в первых трех строках файла animals.txt:
$ head -n3 animals.txt | wc -w
20
Обычное использование head заключается в сокращении вывода данных от другой команды, когда вам не нужно видеть полную информацию, например длинный список каталогов. Перечислим первые пять имен файлов в каталоге /bin:
$ ls /bin | head -n5
bash
bsd-csh
bunzip2
busybox
bzcat
Команда #3: cut
Команда cut выводит одну или несколько колонок из файла. Например, выведем все названия книг, которые расположены во второй колонке файла animals.txt:
$ cut -f2 animals.txt
Programming Python
SSH, The Secure Shell
Intermediate Perl
MySQL High Availability
Linux in a Nutshell
Cisco IOS in a Nutshell
Writing Word Macros
Команда cut поддерживает два способа определения, что считать колонкой. Первый — разделение по полям (-f), когда входные данные состоят из строк (полей), каждая из которых разделена одним символом табуляции. Именно такой формат используется в файле animals.txt. Команда cut из предыдущего примера печатает второе поле каждой строки благодаря опции -f2.
Чтобы сократить вывод, передадим его в head. Выведем на экран только первые три строки:
$ cut -f2 animals.txt | head -n3
Programming Python
SSH, The Secure Shell
Intermediate Perl
Вы также можете вырезать несколько полей, разделив их номера запятыми:
$ cut -f1,3 animals.txt | head -n3
python 2010
