Command line 什么是命令行开关?

Command line 什么是命令行开关?,command-line,low-level,assembly,x86,Command Line,Low Level,Assembly,X86,我试过谷歌,但没有什么能完全回答我的问题。什么是命令行开关,它们与环境变量有何相似或相关?命令行开关是一个参数,用于修改它后面的命令。例如,在linux机器上,命令 ls 将列出当前目录的内容。使用命令行开关对此进行如下修改: ls -l 将导致ls以长格式列出目录内容。因此,ls是命令,-l是开关 环境变量是环境提供的供程序和脚本使用的变量。Windows上的一个示例是PATH变量,该变量用于存储常用程序的路径。命令行开关是一个参数,用于修改它后面的命令。例如,在linux机器上,命令 l

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

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

ls
将列出当前目录的内容。使用命令行开关对此进行如下修改:

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


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

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

ls
将列出当前目录的内容。使用命令行开关对此进行如下修改:

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


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

它非常简单。命令行
开关
(也称为
选项
标志
)就是可以用来修改命令的选项


ls-l
中,
-l
是开关。

它非常简单。命令行
开关
(也称为
选项
标志
)就是可以用来修改命令的选项


ls-l
中,
-l
是开关。

开关只是命令行参数的一种类型。e、 g.在
echo-n foo
中,
echo
是命令名,
-n
是选项或开关,
foo
是非选项参数

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


您可能会发现这篇文章很有趣:。另请参见标记wiki中的其他链接


例如,在POSIX系统中:

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

ABI准确地确定新执行的进程如何找到该数组。典型的ABI,比如,以一种可以(由libc启动代码)作为arg使用的格式将arg传递给C的
main(int-argc,char*argv[])

这些参数的源是,它用运行指定可执行文件的新进程替换现有进程
execve
的函数签名为

int execve(const char *filename, char *const argv[], char *const envp[]);
这些arg和环境数组由sentinel空指针终止。内核获取这些参数作为系统调用的输入,并将它们传递给新的
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[]
数组的元素指向


有关如何在x86 Linux上新执行的进程中从
\u start
(入口点)获取命令行参数的更多详细信息,请参阅Q&As。我试图找到一个很好的规范问答,但是快速搜索没有成功。

开关只是命令行参数的一种类型。e、 g.在
echo-n foo
中,
echo
是命令名,
-n
是选项或开关,
foo
是非选项参数

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


您可能会发现这篇文章很有趣:。另请参见标记wiki中的其他链接


例如,在POSIX系统中:

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

ABI准确地确定新执行的进程如何找到该数组。典型的ABI,比如,以一种可以(由libc启动代码)作为arg使用的格式将arg传递给C的
main(int-argc,char*argv[])

这些参数的源是,它用运行指定可执行文件的新进程替换现有进程
execve
的函数签名为

int execve(const char *filename, char *const argv[], char *const envp[]);
这些arg和环境数组由sentinel空指针终止。内核获取这些参数作为系统调用的输入,并将它们传递给新的
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[]
数组的元素指向


有关如何在x86 Linux上新执行的进程中从
\u start
(入口点)获取命令行参数的更多详细信息,请参阅Q&As。我试图找到一个很好的规范问答,但很快就找不到了。

谢谢。那帮了大忙<代码>路径在Windows和Unix中是相同的,除了分隔符:
输入