Командная строка UNIX

Материал из Xgu.ru

Перейти к: навигация, поиск
stub.png
Данная страница находится в разработке.
Эта страница ещё не закончена. Информация, представленная здесь, может оказаться неполной или неверной.

Если вы считаете, что её стоило бы доработать как можно быстрее, пожалуйста, скажите об этом.


Командная строка состоит из нескольких элементов:

команда [опции...] [аргументы...]

В целом, командная строка — это предложение, которое говорит системе, что нужно выполнить какую-либо операцию. Команда говорит что нужно сделать; опции говорят как сделать; и аргументы — с чем.

Например, команда:

  ls -l /etc

состоит из таких элементов:

  • ls — команда, которая говорит, что нужно показать список файлов (что);
  • -l — опция, которая говорит, что нужно показать список файлов в виде таблицы (как);
  • /etc — аргумент, который говорит о том, что операцию нужно выполнить с каталогом /etc (с чем).

Командой может быть

  • собственно команда командного интерпретатора (например, echo),
  • алиас,
  • функция,
  • программа на диске (например, ls).
Зачем нужна командная строка

[править] Специальные символы и правила экранирования в командной строке

Эти темы не раскрыты:

  • специальные символы
  • экранирование и кавычки
  • символ - и опции

[править] Вопросы и ответы

[править] Как в скрипте сохранить аргументы командной строки в таком виде, с теми же кавычками и группировками, как они были переданы?

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

В самом шелле для этого нет подходящих инструментов, но это можно довольно легко сделать с помощью Python (например) или некоторых других языков программирования:

$ _quote() { python -c 'import sys; import pipes; print " ".join(pipes.quote(s) for s in sys.argv[1:])' "$@"; }
$ _quote 1 2 3
1 2 3
$ _quote 1 "2 \"3"
1 '2 "3'
$ _quote 1 "2 3"
1 '2 3'

(в новых версиях Python (начиная с 3.3) нужно использовать не pipes.quote, а shlex.quote).