出于好奇,我在我的cygwin中玩了一点,得到了这个(对我来说很惊讶)结果:
$ cat >test-int.c <
> #include
>
> int main(int argc, char **argv)
> {
> printf("sizeof (128): %u\n", sizeof (128));
> printf("sizeof (4294967296): %u\n", sizeof (4294967296));
> printf("sizeof (281474976710656): %u\n", sizeof (281474976710656));
> return 0;
> }
> EOF
$ gcc -std=c11 -o test-int test-int.c
$ ./test-int
sizeof (128): 4
sizeof (4294967296): 8
sizeof (281474976710656): 8
$ bash -xe ./test-int
./test-int: ./test-int: cannot execute binary file
$
经过一番搜索,我发现了它 . 实际上,你和我偶然发现了同样的陷阱......
根据 man bash (接近顶部):
如果参数处理后参数仍然存在,并且未提供-c和-s选项,则假定第一个参数是包含shell命令的文件的名称 .
我学会了这个,我试过:
$ bash -c ./test-int
sizeof (128): 4
sizeof (4294967296): 8
sizeof (281474976710656): 8
$ bash -xec ./test-int
+ ./test-int
sizeof (128): 4
sizeof (4294967296): 8
sizeof (281474976710656): 8
$
Update:
我刚刚意识到另一个陷阱 - 命令行参数 . 以下示例说明了这一点:
$ cat >test-arg.c <
> #include
>
> int main(int argc, char **argv)
> {
> for (int i = 0; i < argc; ++i) printf("argv[%d]: '%s'\n", i, argv[i]);
> return 0;
> }
> EOF
$ gcc -std=c11 -o test-arg test-arg.c
$ ./test-arg arg1 arg2 arg3
argv[0]: './test-arg'
argv[1]: 'arg1'
argv[2]: 'arg2'
argv[3]: 'arg3'
$ bash -c ./test-arg arg1 arg2 arg3
argv[0]: './test-arg'
$
所以呢?争论丢失了!
$ bash -xec ./test-arg arg1 arg2 arg3
+ ./test-arg
argv[0]: './test-arg'
$
这一次,我在没有咨询 man bash 的情况下找到了解决方案:
$ bash -xec "./test-arg arg1 arg2 arg3"
+ ./test-arg arg1 arg2 arg3
argv[0]: './test-arg'
argv[1]: 'arg1'
argv[2]: 'arg2'
argv[3]: 'arg3'
$
要进行一次调用,命令和参数必须为"quoted together" .