什么是命令行开关?

时间:2016-06-24 00:34:23

标签: command-line

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

3 个答案:

答案 0 :(得分:1)

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

ls

将列出当前目录的内容。使用命令行开关修改它,如下所示:

ls -l

将导致ls以长格式列出目录内容。因此,ls是命令,-l是切换。

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

答案 1 :(得分:0)

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

<{1>} ls -l -l是转换。

答案 2 :(得分:0)

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

此问题最初标有,但显然OP并不是真正的意思。无论如何,如果它对其他任何人都有用,我会在这里留下其余的答案。

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

在POSIX系统中,例如:

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

ABI确切地确定了新的exec ed进程如何找到该数组。典型的ABI,如the x86-64 System V ABI,以一种可以使用的格式(通过libc启动代码)将args传递给C&#39; main(int argc, char *argv[])

这些args的源代码是execve(2) system call,它使用运行指定可执行文件的新进程替换现有进程。 execve的功能签名是

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

并且那些arg和环境数组由sentinel NULL指针终止。内核将这些args作为系统调用的输入,并将它们传递给新的exec() -ed进程。我强烈建议您阅读Linux手册页(我链接)以获取更多详细信息,并作为更多内容进行谷歌搜索的起点。

execl(3)和类似的库函数只是帮助函数来设置execve(2)系统调用的args。你可以用

之类的东西看到这个
$ 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(入口点)获取命令行参数的更多详细信息,请参阅Q&amp; As like this one。我试图找到一个不错的规范Q&amp; A,但快速搜索没有运气。