Аргументы командной строки

Аргументы командной строки — основной способ настройки поведения программ.

Аргументы передаются в команду перед её запуском в виде строк, разделённых пробелом.

Так, в примере ниже в cat передаётся два аргумента — это пути файлов, так можно указать cat выводить содержимое именно этих файлов:

cat file1 file2

Аргументы — это просто набор строчек!

Будьте бдительны и не дайте ввести себя в заблуждение: каждый аргумент — это обычная строка. Более того, это C-String.

Убедиться в этом несложно, написав программу на любимом языке программирования. Как правило, в нём есть возможность обратиться к массиву переданных аргументов:

include <stdio.h>
int main (int argc, char *argv[])
{
  for (int i = 0; i < argc ; i++) {
    puts(argv[i]);
  }
  return 0;
}

аналогичная программа на Python:

import sys
print(sys.argv)

первый элемент этих массивов обычно не является аргументом: в нём записано само имя программы.

Экранировние и спецсимволы

Как уже было сказано, аргументы отделяются пробелами.

Из этого же следует, что пробел в аргумент передать просто так не получится (он уже используется как разделитель).

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

  1. Можно заключить аргумент (или его проблемный кусок) в одинарные кавычки:
    echo x'1 2\x$y#!'3
    тогда гарантируется, что аргумент будет подан как есть.
  2. Заключить аргумент (или кусок) в двойные кавычки:
    echo "1\"2" 3
    То, что в кавычках, будет считаться одним аргументом, но внутри кавычек какие-то символы ($, \ и `) будут иметь особый смысл.

Флаги

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

Так, например, в команду cat можно передавать пути к файлам, а можно передать аргумент -n, тогда cat будет выводить не только содержимое файла, но и нумеровать его строки:

cat file1 file2

выводит содержимое файлов, а

cat -n file1 file2

выводит содержимое файлов с нумерацией строк.

Флаги с аргументами

Флаг может задавать особый смысл идущим за ним аргументам:

Например,

head 5 file1

выводит первые 10 строк файлов 5 и file1,

а команда

head -n 5 file1

выводит первые 5 строк файла file1.

Тогда говорят, что у флага есть аргументы.

Короткие и длинные флаги

Всё, что написано ниже, только лишь соглашения, и есть очень много исключений.

Команду

cat -n file1

также можно записать как

cat --number file1

А команду

head -n 10 file1

также можно записать как

head --lines=10 file1

Флаги в первом варианте записи (-n) называют короткими флагами, флаги вида --number называют длинными или даже обычными флагами.

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

Разница, в основном в следующем:

  • в читаемости,
  • часто (!) в переносимости,
  • в том, что, короткие флаги можно писать слитно, подряд, а длинные — нет. Например: rm -r -f * можно записать как rm -rf *.