我试过谷歌,没有完全回答我的问题。什么是命令行开关,它们与环境变量相似或相关?什么是命令行开关?
回答
命令行开关是修改它后面的命令的参数。例如,在Linux机器上,命令
ls
将列出当前目录的内容。使用命令行开关,像这样修改此:
ls -l
会导致ls
到以长格式列出目录内容。所以,ls
是命令,-l
是交换机。
环境变量是由您的环境提供的供程序和脚本使用的变量。 Windows上的示例是PATH
变量,该变量用于存储常用程序的路径。
交换机只是一种类型的命令行参数。例如在echo -n foo
,echo
是命令名称,-n
是一个选项或开关,而foo
是一个非选项参数。
此问题最初标记为low-level和assembly,但显然OP并不是真正的意思。无论如何,我会在这里留下其余的答案,以防其他人有用。
您可能会觉得这篇文章有趣:Linux x86 Program Start Up or - How the heck do we get to main()。另请参阅x86标记wiki中的其他链接。
在POSIX系统例如:
的命令行参数是由一本新exec
ED的过程中接收为一个数组。
ABI确定一个新的exec
ed进程可以如何找到该数组。典型的ABIs,如the x86-64 System V ABI,以一种可以使用的格式(通过libc启动代码)作为参数传递给C的main(int argc, char *argv[])
。
这些参数的来源是execve(2)
system call,它用运行指定可执行文件的新进程替换现有进程。 execve
的函数签名是
int execve(const char *filename, char *const argv[], char *const envp[]);
和那些Arg和环境阵列由一个定点NULL指针终止。内核将这些参数作为系统调用的输入,并将它们传递给新的exec()
-ed进程。我强烈建议阅读Linux手册页(我链接)了解更多细节,并将其作为更多内容的起点。
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[]
阵列,其由OS供给的元件指向。
有关如何获取x86 Linux上新执行进程中的_start
(入口点)的命令行参数的详细信息,请参阅Q & As like this one。我试图找到一个很好的规范Q & A,但没有运气快速搜索。
- 1. 什么是ruby -a命令行开关?
- 2. 什么是Wix heat.exe命令行开关“-directoryid”在做什么?
- 3. 什么是Windows命令行模拟的Mac命令“打开”?
- 4. Azure PowerShell命令行开关与命令行工具有什么区别?
- 5. 发现命令行开关
- 6. 3dsmax.exe命令行开关
- 7. 什么是MFC中的关机命令?
- 8. devenv命令开关的配置选项是什么意思?
- 9. 什么命令行开关让NuGet.exe完全绕过http代理?
- 10. Groovy为什么不尊重我的命令行开关?
- 11. MSBuild失败“无效的命令行开关为”LC.exe“为什么?
- 12. Linux中与命令结构有关的命令是什么
- 13. 什么是相当于命令行开关/ t的MSBuild 2010脚本文件:包
- 14. 什么是命令行编译器?
- 15. 什么是命令行参数?
- 16. 这是什么ruby/bash命令执行?
- 17. 是什么 - 做运行NPM命令时?
- 18. 命令行中的“@”是什么意思?
- 19. 运行命令时,$是什么意思?
- 20. rar和unrar的命令行是什么?
- 21. 什么是sbt的命令行参数?
- 22. 什么是命令行参数在C#
- 23. 什么是Chrome的命令行API
- 24. 命令行中的@ @ @ @ @是什么?
- 25. 调用了什么是{$ {phpinfo()}}? (远程命令执行相关)
- 26. '$'在命令行命令中的含义是什么?
- 27. 什么是jstack命令帧
- 28. 什么是在ansible命令
- 29. 是什么find命令
- 30. 什么是Matrix.getMatrix命令?
谢谢。这帮助了很多! – user609743
'PATH'在Windows和Unix中是相同的,除了分隔符:';'在Windows中,':'在Unix中。它是在两个操作系统中搜索命令的目录列表,也可能是Windows和甚至Unix之前的许多祖先操作系统。 –