shell - shell参数是如何解析的?
问题描述
我在msys shell中使用了这个简单的脚本,名为echo_arg
echo $1
echo $2
echo $3
对于从 CLI 调用的这两种情况,
$ C:/msys/1.0/bin/sh.exe -c "C:/msys/1.0/bin/sh.exe echo_arg a "b" c"
$ C:/msys/1.0/bin/sh.exe -c "C:/msys/1.0/bin/sh.exe echo_arg a \"b\" c"
输出是
a
b
c
但是C 程序中的 CreateProcess 函数没有给出相同的结果(使用 mingw-w64 编译,线程:win32,异常:seh,版本:7.3.0)
#include <windows.h>
#include <stdio.h>
void main( int argc, char *argv[] )
{
int i;
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
char * cmd[] = {
"C:/msys/1.0/bin/sh.exe -c \"C:/msys/1.0/bin/sh.exe echo_arg a \"b\" c\"", \
"C:/msys/1.0/bin/sh.exe -c \"C:/msys/1.0/bin/sh.exe echo_arg a \\\"b\\\" c\"", \
"C:/msys/1.0/bin/sh.exe -c \"/bin/sh.exe echo_arg a \\\"b\\\" c\"" } ;
for (i=0;i<3;i++) {
printf("\t%s\n",cmd[i]);
CreateProcess(NULL, cmd[i] , NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
WaitForSingleObject( pi.hProcess, INFINITE );
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread ); }
}
输出:
C:/msys/1.0/bin/sh.exe -c "C:/msys/1.0/bin/sh.exe echo_arg a "b" c"
a
b
c
C:/msys/1.0/bin/sh。 exe -c "C:/msys/1.0/bin/sh.exe echo_arg a \"b\" c"
a
b c
C:/msys/1.0/bin/sh.exe -c "/bin/sh.exe echo_arg a \"b\" c"
a
b
c
为什么,在第二种情况下, b 和 c 没有分开($2="b c" 和 $3 是空的)?以及为什么案例 3 有效。
仅供参考,我不是一个喜欢玩“\”/的疯子……我在尝试安装GNU MP库(操作系统:windows 10)时遇到了这个问题。它没有用,在我找到原因之前,这是一个漫长故事的开始。
解决方案
推荐阅读
- python - 为什么当键确实在列表中时,“mydict 中的键为真”返回 false?
- c++ - 关于打印 STL 容器以进行认可测试的公约
- javascript - vue-chart.js / vuex:当 vuex 状态改变时图表不更新
- postgresql - PostgresSQL 函数需要很长时间
- ubuntu - 如何使用 user@hostname:$ 启动终端
- javascript - 这个元素可能在来自不同 src 的 iframe 内。目前 chropath 不支持它们
- python - 我们可以在 for 循环中声明一个空函数吗?
- rest - 无法对 github 存储库统计信息进行分页
- spring - @ControllerAdvice 未捕获 Rest API 异常
- php - php - fpdf 选择案例 $row