Чем больше вы будете использовать командную строку, тем больше различных программ вам встретятся, а многие из них станут повседневными инструментами. Несмотря на огромное разнообразие таких программ, принципы их взаимодействия с пользователем практически не отличаются. Если в GUI (Graphical User Interface — графический интерфейс) можно взять любую незнакомую программу, запустить её, почитать названия пунктов меню, потыкать на разные кнопки и получить какой-нибудь результат, то в CLI (Command Line Interface — интерфейс командной строки) у вас нет ничего кроме названия программы и как ей пользоваться — непонятно. Например, программа ls выводит на экран список файлов и директорий. Здесь всё просто, достаточно её набрать и нажать Enter.

$ ls
Desktop Documents Downloads Library Movies Music Pictures Public

Но что, если мы захотим посмотреть скрытые файлы и директории (в *nix-системах они начинаются с символа "точка", например .profile)? Тогда необходимо набрать ls -a:

$ ls -a
.  .CFUserTextEncoding Desktop   Downloads Movies Pictures
.. .localized          Documents Library   Music  Public

А если захотим посмотреть содержимое папки Public?

$ ls Public/
Drop Box

А теперь посмотрим более сложный пример. Использование некоторых программ может вводить в ступор тем, как они конфигурируются:

$ ffmpeg -i input.mp4 -vcodec libx264 -crf 30 output.mp4

Задача данного урока состоит в том, чтобы увидеть систему в использовании консольных утилит. Хорошая новость в том, что она есть. Плохая новость — не все её чётко придерживаются.

У команд бывают аргументы и опции (их также называют флагами). Например, в команде ls Music, Music — это аргумент, а вот в команде ls -a, -a — это опция. Опции всегда начинаются с одного или двух дефисов. Другая, часто используемая опция для просмотра списка файлов — -l, она выводит дополнительную информацию по каждому файлу.

$ ls -l
total 0
drwx------+  3 Guest  _guest   96 Nov 21  2017 Desktop
drwx------+  3 Guest  _guest   96 Nov 21  2017 Documents
drwx------+  3 Guest  _guest   96 Nov 21  2017 Downloads
drwx------+ 26 Guest  _guest  832 Nov 21  2017 Library
drwx------+  3 Guest  _guest   96 Nov 21  2017 Movies
drwx------+  3 Guest  _guest   96 Nov 21  2017 Music
drwx------+  3 Guest  _guest   96 Nov 21  2017 Pictures
drwxr-xr-x+  4 Guest  _guest  128 Nov 21  2017 Public

Опции можно комбинировать. Чтобы вывести все файлы, включая скрытые, с подробным описанием, нужно набрать ls -a -l. Bash позволяет объединять опции и писать так ls -al или даже так ls -la. Обратите внимание на то, что, если вы забудете поставить - перед опциями и получите команду ls la, то ls посчитает, что вы хотите посмотреть содержимое папки la, ведь теперь это аргумент. Использование опций никак не отменяет возможность использования аргументов (хотя тут зависит от программы). В случае с ls можно использовать одновременно и то, и другое. Для просмотра полного содержимого директории Music с информацией о каждом файле достаточно набрать ls -la Music:

$ ls -la Music
total 0
drwx------+  4 Guest  _guest   128 Nov 21  2017 .
drwxr-xr-x+ 89 Guest  _guest  2848 Aug 24 14:06 ..
-rw-r--r--   1 Guest  _guest     0 Nov 21  2017 .localized
drwxr-xr-x   9 Guest  _guest   288 Aug 26 17:25 iTunes

Как видно из примера выше, опции указываются слева от аргументов, но иногда бывают ситуации, что они используются справа, такое чаще встречается в сложных утилитах с вложенными командами. Их мы сейчас не рассматриваем. Иногда сложно понять такую запись: -tupa Это одна опция tupa или это 4 опции по одной букве t, u, p и a, объединённые в одну цепочку? В данной ситуации нужно смотреть документацию соответствующей программы. Делается это с помощью команды man (manual). Достаточно набрать man <имя команды> — и мы попадём в режим чтения документации. В мануале содержится много полезной информации, например, описание утилиты в целом, формат её вызова, все возможные опции и даже примеры вызовов.

Man
Page

Попробуйте прямо сейчас посмотреть мануал программы ls, набрав в терминале man ls. Для выхода из режима просмотра нажмите q, для просмотра вперёд f (forward), назад — b (backward).

Ещё полезен сайт https://explainshell.com/, в который достаточно вбить любую команду, и он покажет удобное интерактивное описание.

Explain
Shell

Вернёмся к опциям. Большинство утилит имеет две версии одной и той же опции: одна из них длинная, другая — короткая. Например -v и --version в PHP.

$ php -v
PHP 7.2.7 (cli) (built: Jun 22 2018 06:27:50) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies

$ php --version
PHP 7.2.7 (cli) (built: Jun 22 2018 06:27:50) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies

Две опции вместо одной делают исключительно для удобства. Во время работы в терминале важно набирать быстро, поэтому там удобны короткие опции. Но когда разработчик пишет скрипт, состоящий из разных команд, то предпочтительнее использовать длинные опции. Надо отметить, что обычно длинные опции предваряются двумя дефисами, но некоторые программы нарушают это правило и используют один, что вносит определённую путаницу. Длинный формат опций помогает легче понимать, что они означают. Это важно как другим людям, так и самому человеку, писавшему скрипт, когда он вернётся к нему спустя время. Пока мы не касаемся скриптов, но в будущем вы убедитесь в этом сами.

Опции, которые мы рассматривали выше, не имеют параметров, но нередко встречаются опции, которые недостаточно просто указать. В macOS есть встроенная утилита say. Если ей передать какой-то текст, то она его произнесёт (прямо проговорит в динамики). У этой программы есть опция --output-file (и её короткая версия -o), принимающая значением путь до файла. Если она указана, то say запишет звуковой файл по указанному пути.

# Вместо -o можно написать --output-file
$ say -o hi.aac 'Hello, World.'

Значение опции указывается через пробел от самой опции. Если значение опции содержит в себе специальные или пробельные символы, то его нужно оборачивать в кавычки, двойные или одинарные - не важно.

$ say -o 'hi.aac' 'Hello, World.'

Некоторые программы допускают использование знака = вместо пробела.

# Команда say такое не позволяет, но зато видно принцип
$ say -o=hi.aac 'Hello, World.'

Кроме того, say позволяет указать входной файл, который нужно прочитать. Если он указан, то say проигнорирует передаваемый текст (как аргумент).

# Кроме того здесь указано каким голосом его прочитать и в какой файл записать то что прочитано
$ say -v Alex -o hi -f hello_world.txt

Теперь посмотрим на документацию программы say, а именно в раздел SYNOPSIS. Там мы увидим описание того, как её можно вызывать:

say [-v voice] [-r rate] [-o outfile [audio format options] | -n name:port | -a device] [-f file | string ...]

Подобное описание есть практически у любой утилиты. Описания построены по одному и тому же принципу. Квадратные скобки [] обозначают необязательность. Например, опция -v необязательна, то же самое касается и любых других опций этой программы. Вертикальная черта | обозначает операцию "или", причём именно исключающее или. Посмотрите на последний блок [-f file | string ...]. Он означает, что say может либо произносить текст из файла, либо произносить строчку, переданную как аргумент, но не то и другое одновременно. Бывают и другие вариации описания способов вызова: значение по умолчанию, выбор из конкретных элементов, отрицание.

И хотя мы разобрали не всё, с чем вам предстоит столкнуться, всё же остановимся, чтобы мозг окончательно не расплавился. Главное, не стоит переживать, если вы не чувствуете, что всё это запомнили. Опции требуют практики и опытов, а не заучивания теории. Теперь вы понимаете общие принципы и можете смотреть документацию, далее дело за экспериментами.


Дополнительные материалы

  1. Построение приложений командной строки (CLI)
Мы учим программированию с нуля до стажировки и работы. Попробуйте наш бесплатный курс «Введение в программирование» или полные программы обучения по Node, PHP, Python и Java.

Хекслет

Подробнее о том, почему наше обучение работает →