与Linux等效的GetCommandLine和CommandLineToArgv
的类似问题是否可以在linux中获取 raw 命令行?文件/ proc / self / cmdline是destroyd。
./a.out files="file 1","file 2" param="2"
打印
./a.outfiles=file 1,file 2param=2
这是垃圾
转义命令行确实适用于所有参数,但第一个参数。
./a.out files=\"fil 1\",\"fil 2\"\ param=\"2\"
打印
./a.outfiles="fil1","fil2" param="2"
答案 0 :(得分:9)
你做不到。命令行参数实际上作为单独的字符串传递给新进程。查看linux内核源代码: kernel_execve
请注意kernel_execve(...)
需要const char *argv[]
- 因此Linux中没有长字符串命令行 - 上面的层需要将参数拆分为单独的组件。
编辑:实际上,系统调用在这里:
但上述声明仍然适用。 argv的参数已经在内核从C库调用到exec的时候被拆分。
“程序的启动程序”(通常是shell,但不一定是)负责生成argv []数组。它将执行“globbing”(将通配符文件名扩展到它匹配的实际文件)和剥离引号,变量替换等等。
我还要指出,虽然C库中有“exec”的几种变体,但只有一种方法可以进入内核。所有变体最终都在我上面链接的execve
系统调用中。其他变体仅仅是因为调用者可能不喜欢将参数拆分成单独的元素,因此C库通过为程序员执行此操作来“帮助”。类似地,为了将环境数组传递给新程序 - 如果程序员不需要特定的环境,他/她可以调用自动获取父进程env的变体。