C 程序未读取重定向的 shell 命令标准输入
C program is not reading redirected shell command standard input
我已经编译了下面的 c 代码,它应该将它在标准输入中接收到的任何输入发送到标准输出。它在以下情况下按预期工作:
[user@host ~]$ ./my_program
test...
test...
^C
[user@host ~]$ echo "Hello" | ./my_program
Hello
[user@host ~]$ ./my_program < test.txt
Contents of test.txt ...
但是,如果我像这样将 shell 命令的输出重定向到我的程序中:
[user@host ~]$ ./my_program <(echo "Hello")
它不输出任何东西并等待输入,就好像我只用 ./my_program
启动程序一样
我希望输出 Hello
然后程序结束。当我 运行 命令 cat <(echo "Hello")
我得到这个预期的结果。是什么导致 cat
和 my_program
之间的行为差异?
/* my_program.c */
#include <stdio.h>
int main()
{
int c = getchar();
while (c != EOF) {
putchar(c);
c = getchar();
}
return 0;
}
正在发布社区 Wiki,因为问题是由打字错误引起的,因此 off-topic。
您在程序的命令行上传递了一个与输出 echo "Hello"
的管道关联的文件名,而不是将其附加到标准输入。
要将其附加到标准输入,您需要在命令行上添加一个额外的 <
:
./my_program < <(echo "Hello")
它以另一种方式与 cat
一起工作,因为当 cat
传递给 command-line 参数时,它将它们视为要读取的文件。
我已经编译了下面的 c 代码,它应该将它在标准输入中接收到的任何输入发送到标准输出。它在以下情况下按预期工作:
[user@host ~]$ ./my_program
test...
test...
^C
[user@host ~]$ echo "Hello" | ./my_program
Hello
[user@host ~]$ ./my_program < test.txt
Contents of test.txt ...
但是,如果我像这样将 shell 命令的输出重定向到我的程序中:
[user@host ~]$ ./my_program <(echo "Hello")
它不输出任何东西并等待输入,就好像我只用 ./my_program
我希望输出 Hello
然后程序结束。当我 运行 命令 cat <(echo "Hello")
我得到这个预期的结果。是什么导致 cat
和 my_program
之间的行为差异?
/* my_program.c */
#include <stdio.h>
int main()
{
int c = getchar();
while (c != EOF) {
putchar(c);
c = getchar();
}
return 0;
}
正在发布社区 Wiki,因为问题是由打字错误引起的,因此 off-topic。
您在程序的命令行上传递了一个与输出 echo "Hello"
的管道关联的文件名,而不是将其附加到标准输入。
要将其附加到标准输入,您需要在命令行上添加一个额外的 <
:
./my_program < <(echo "Hello")
它以另一种方式与 cat
一起工作,因为当 cat
传递给 command-line 参数时,它将它们视为要读取的文件。