【问题标题】:What are command line switches?什么是命令行开关?
【发布时间】:2016-07-02 08:27:37
【问题描述】:

我尝试了谷歌,但没有完全回答我的问题。什么是命令行开关,它们与环境变量有何相似或相关性?

【问题讨论】:

    标签: command-line


    【解决方案1】:

    命令行开关是一个修改它后面的命令的参数。例如,在 linux 机器上,命令

    ls
    

    将列出当前目录的内容。用这样的命令行开关修改它:

    ls -l
    

    将导致ls 以长格式列出目录内容。所以,ls 是命令,-l 是开关。

    环境变量是您的环境提供的供程序和脚本使用的变量。 Windows 上的一个示例是 PATH 变量,用于存储常用程序的路径。

    【讨论】:

    • 谢谢。这帮助很大!
    • PATH 在 Windows 和 Unix 中是相同的,除了分隔符:Windows 中的;,Unix 中的:。它是在两个操作系统中搜索命令的目录列表,可能还有许多在 Windows 甚至 Unix 之前出现的祖先操作系统。
    【解决方案2】:

    真的很简单。命令行 switch(也称为 optionflag)就是这样 - 可用于修改命令的选项。

    ls -l 中,-l 是开关。

    【讨论】:

    • 感谢您的遮阳篷!
    【解决方案3】:

    开关只是命令行参数的一种。例如在echo -n foo 中,echo 是命令名称,-n 是选项或开关,foo 是非选项参数。

    这个问题最初被标记为,但显然 OP 并不是这个意思。无论如何,我将把这个答案的其余部分留在这里,以防它对其他人有用。


    您可能会觉得这篇文章很有趣:Linux x86 Program Start Up or - How the heck do we get to main()。另请参阅 标签 wiki 中的其他链接。


    以 POSIX 系统为例:

    命令行参数由新的execed 进程作为数组接收。

    ABI 确定新的execed 进程如何找到该数组。典型的 ABI,如 the x86-64 System V ABI,将 args 以一种可以(由 libc 启动代码)用作 args 的格式传递给 C 的 main(int argc, char *argv[])

    这些参数的来源是execve(2) system call,它将现有进程替换为运行指定可执行文件的新进程。 execve的函数签名是

    int execve(const char *filename, char *const argv[], char *const envp[]);
    

    并且那些 arg 和 environment 数组被一个哨兵 NULL 指针终止。内核将这些参数作为系统调用的输入,并将它们传递给新的exec()-ed 进程。我强烈建议您阅读 Linux 手册页(我已链接)以了解更多详细信息,并以此作为起点,以获取更多内容以进行 google。

    execl(3) 和类似的库函数只是为execve(2) 系统调用设置参数的辅助函数。您可以通过类似的方式看到这一点

    $ strace -f /bin/sh -c 'exec /bin/echo 1234'
    execve("/bin/sh", ["/bin/sh", "-c", "exec /bin/echo 1234"], [/* 69 vars */]) = 0
    brk(0)                                  = 0x55932fc90000
    access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
    mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7efed2438000
    ... more system calls made by the dynamic linker
    ... then eventually some system calls made by /bin/sh itself (that you wouldn't see from /bin/true
    rt_sigaction(SIGTERM, NULL, {SIG_DFL, [], 0}, 8) = 0
    rt_sigaction(SIGTERM, {SIG_DFL, ~[RTMIN RT_1], SA_RESTORER, 0x7efed1e82250}, NULL, 8) = 0
         ########## This is where /bin/sh  execs  /bin/echo, with an arg of 1234
    execve("/bin/echo", ["/bin/echo", "1234"], [/* 69 vars */]) = 0
         # then the dynamic linker runs in the newly-exec-ed process and you see the same boilerplate
    brk(0)                                  = 0x1408000
    access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
    ...
    write(1, "1234\n", 5)                   = 5  # this line tidied up to not include the 1234 on stdout, just the strace log from stderr
    close(1)                                = 0
    munmap(0x7fc63c0e0000, 4096)            = 0   # apparently /bin/echo really cares about tidying up before exiting
    close(2)                                = 0
    exit_group(0)                           = ?
    +++ exited with 0 +++
    

    所以:命令行参数是以 0 结尾的 C 字符串,由操作系统提供的 char *argv[] 数组的元素指向

    有关如何在 x86 Linux 上新执行的进程中从_start(入口点)获取命令行参数的更多详细信息,请参阅问答like this one。我试图找到一个不错的规范问答,但快速搜索没有运气。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-08
      • 1970-01-01
      • 2011-04-30
      • 2020-01-24
      • 2021-10-20
      相关资源
      最近更新 更多