В разных системах доступны разные интерпретаторы командной строки, поэтому для некоторых деталей важна ОС и / или выбранная вами оболочка.Вы упоминаете Linux (через тег linux ), поэтому мы можем предположить, что вы используете bash, dash, fish, zsh или, возможно, даже tcsh или что-то подобное.Эти оболочки немного различаются, но у них много общего:
Они рассматривают первое слово, разделенное пробелом, как команду.Все остальные слова являются аргументами.
Они делают то, что оболочки называют глобальное расширение , так что вместо программ нужно интерпретировать *.py
например, программа просто получает все файлы .py
в качестве отдельных аргументов.
Они выполняют расширение переменной , например замену $HOME
на ваш домашний каталог.
(Это не подходящее место для обсуждения всех этих деталей - найдите документацию для вашей конкретной оболочки, прочитайте ее и / или прочитайте некоторые книги по среде программирования Unix или Linux.StackOverflow и другие сайты StackExchange, тем не менее, имеют множество конкретных ответов о конкретных конструкциях программирования оболочки.)
В любом случае, с помощью команды:
git remote add origin repo-url
оболочка ответственность заключается в разбиении пяти слов на вектор аргументов: git
, remote
, add
, origin
и repo-url
.Нулевой аргумент 1 - это команда для запуска, поэтому оболочка затем находит эту команду (используя $PATH
) и запускает ее, передавая все аргументы - включая само имя команды - команде.
Таким образом, на этом этапе команда равна git
, а все остальное является аргументом этой команды.Однако сама команда git
действует как миниатюрная неинтерактивная оболочка: она интерпретирует свои аргументы, такие как remote
, чтобы выяснить, какая из них является командой.Таким образом, для Git remote
- это команда с аргументами add
, origin
и repo-url
.Git добавляет к команде префикс git-
, затем находит команду git-remote
, которая находится в каталоге, который будет напечатан git --exec-path
, и запускает , с аргументами add
, origin
иurl
(и нулевой аргумент git-remote
).
Таким образом, передав команду git
в команду git-remote
, аргументы теперь просто add
, origin
и url
(с именем команды git-remote
доступным для git-remote
в качестве нулевого аргумента).
Обратите внимание, что сама команда git
принимает (и обрабатывает и, следовательно, удаляет) некоторые параметры команды.Например, выполнение:
git --work-tree=/tmp hello world
заставляет Git сохранить настройку рабочего дерева /tmp
, а затем попытаться запустить команду git-hello
с аргументом world
.Вы можете написать свои собственные команды Git, написав, например, программу git-hello
: git hello
запустит вашу программу git-hello
.В любом случае, аргумент --work-tree
исчез из списка аргументов на этом этапе.(Git сохранил его в переменной окружения, $GIT_WORK_TREE
. Переменные окружения передаются по системным вызовам exec
; exec
- это как оболочка запускает git
и как Git выполняет свои подкоманды.)
1 Этот нулевой аргумент часто называют argv[0]
после соглашения об именах, используемого в программировании на языке Си.