如何理解git命令的结构?

Ehs*_*har 1 linux git command command-line-interface

如何理解git命令的结构?

   git remote add origin repo-url
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,哪一个是命令,哪一个是参数?

tor*_*rek 5

在不同的系统上有不同的命令行解释器,因此对于某些细节,操作系统和/或您选择的shell很重要.你提到Linux(通过标签),所以我们可能会假设你正在使用bash,dash,fish,zsh,甚至tcsh或者其他类似的东西.这些外壳略有不同,但它们有许多共同之处:

  • 他们将第一个以空格分隔的单词视为命令.剩下的所有单词都是参数.

  • 它们执行shell调用glob扩展的内容,因此*.py程序只需将所有.py文件作为单独的参数获取,而不是程序必须解释.

  • 它们执行变量扩展,例如替换$HOME主目录.

(这不是讨论所有这些细节的正确位置 - 查找特定shell的文档,阅读,和/或阅读一些Unix或Linux编程环境书籍.StackOverflow和其他StackExchange站点确实有大量特定的答案但是shell编程结构.)

在任何情况下,给定命令:

git remote add origin repo-url
Run Code Online (Sandbox Code Playgroud)

外壳的责任是五个字分解成一个参数向量:git,remote,add,origin,和repo-url.第0个参数1是要运行的命令,因此shell然后定位此命令(使用$PATH)并运行它,将所有参数(包括命令名称本身)传递给命令.

因此,此时,命令是,git而其他所有内容都是该命令的参数.但是,git命令本身就像一个微型的非交互式shell:它解释它的参数,例如remote,找出哪些是命令.所以到Git的,remote是命令,带参数add,originrepo-url.GIT中的前缀与所述命令git-,则定位该git-remote命令驻留在目录git --exec-path将打印-并运行与参数add,origin以及url(和第0个参数git-remote).

因此,已经通过传递git命令到git-remote命令,参数是现在只是add,originurl(用命令的名称git-remote可用来git-remote作为第零参数).

请注意,该git命令本身需要(并处理并因此带走)一些命令选项.例如,运行:

git --work-tree=/tmp hello world
Run Code Online (Sandbox Code Playgroud)

导致Git保存工作树设置/tmp,然后尝试git-hello使用参数运行命令world.您可以编写自己的Git命令,例如编写git-hello程序:git hello然后运行git-hello程序.在任何情况下,此--work-tree论点都已从参数列表中消失.(Git已将其存储在环境变量中$GIT_WORK_TREE.环境变量通过exec系统调用传递; execshell是如何运行的git以及Git如何运行其子命令.)


1argv[0]在C语言编程中使用的命名约定之后,这个第0个参数通常被称为.