Аргументы командной строки
Аргументы командной строки — основной способ настройки поведения программ.
Аргументы передаются в команду перед её запуском в виде строк, разделённых пробелом.
Так, в примере ниже в 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, можно экранировать с помощью кавычек двумя способами:
- Можно заключить аргумент (или его проблемный кусок) в одинарные кавычки:
тогда гарантируется, что аргумент будет подан как есть.
echo x'1 2\x$y#!'3
- Заключить аргумент (или кусок) в двойные кавычки:
То, что в кавычках, будет считаться одним аргументом, но внутри кавычек какие-то символы ($, \ и `) будут иметь особый смысл.
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 *
.