我正试图做相反的事情
我正在运行一个正在更改其输出格式的应用程序,因为它检测到stdout上的管道,我希望它认为它是一个交互式终端,以便在重定向时获得相同的输出.
我当时认为将它包装在expect脚本中或使用proc_open()PHP中的它会这样做,但事实并非如此.
有什么想法吗?
我有一个git钩子,只要有人提交到他们的本地存储库就会运行.
有些人从终端提交,有些人从SourceTree或SmartGit或其他第三方应用程序提交.
SourceTree在钩子方面表现不同.例如,默认情况下错误是红色的,并且似乎不支持用户输入,因此我需要根据用户是否从SourceTree或SmartGit等提交来更改我的python脚本.
在我的脚本中有没有办法做到这一点?
我正在尝试将信息传递给不接受来自stdin的输入的程序.为此,我使用/ dev/stdin作为参数,然后尝试输入我的输入.我注意到如果我用管道字符做这个:
[pkerp@comp ernwin]$ cat fess/structures/168d.pdb | MC-Annotate /dev/stdin
我没有输出.但是,如果我使用左插入符字符做同样的事情,它可以正常工作:
[pkerp@plastilin ernwin]$ MC-Annotate /dev/stdin < fess/structures/168d.pdb
Residue conformations -------------------------------------------
A1 : G C3p_endo anti
A2 : C C3p_endo anti
A3 : G C3p_endo anti
我的问题是,这两项业务之间有什么区别?为什么它们会产生不同的结果呢?作为一个额外的问题,是否有一个使用"<"符号指定输入的正确术语?
更新:
我目前最好的猜测是,正在运行的程序内部的东西会利用文件中的搜索.下面的答案似乎表明它与文件指针有关,但运行以下小测试程序:
#include <stdio.h>
int main(int argc, char *argv[])
{   
    FILE *f = fopen(argv[1], "r");
    char line[128];
    printf("argv[1]: %s f: %d\n", argv[1], fileno(f));
    while (fgets(line, sizeof(line), f)) {
    printf("line: %s\n", line);
    }
    printf("rewinding\n");
    fseek(f, 0, SEEK_SET);
    while (fgets(line, sizeof(line), f)) {
    printf("line: %s\n", line);
    } …我希望能够这样做:
$ echo "hello world" | ./my-c-program
piped input: >>hello world<<
我知道isatty应该用来检测stdin是否是tty.如果它不是tty,我想读出管道内容 - 在上面的例子中,这是字符串hello world.
在C中这样做的推荐方法是什么?
这是我到目前为止所得到的:
#include <stdio.h>
#include <unistd.h>
int main(int argc, char* argv[]) {
  if (!isatty(fileno(stdin))) {
    int i = 0;
    char pipe[65536];
    while(-1 != (pipe[i++] = getchar()));
    fprintf(stdout, "piped content: >>%s<<\n", pipe);
  }
}
我使用以下方法编译:
gcc -o my-c-program my-c-program.c
它几乎可以工作,除了它似乎总是在管道内容字符串的末尾添加一个U + FFFD REPLACEMENT CHARACTER和换行符(我确实理解换行符).为什么会发生这种情况,如何避免这个问题呢?
echo "hello world" | ./my-c-program
piped content: >>hello world
?<<
免责声明:我对C没有任何经验.请放轻松我.
我正在编写一个命令行应用程序,它将数据作为命令行参数或来自cin.
有没有办法检查用户是否在应用程序中传输了一些数据($ ./myapp <test.txt),如果没有,只显示键盘输入的提示?
如果我正在检查!cin.good()/ cin.eof()等,则提示将永远不会出现.
考虑我们有一个小程序,需要一些标准的C输入.
我想知道用户是否正在使用输入重定向,例如:
./programm < in.txt
有没有办法在程序中检测这种输入重定向方式?
我想知道我的程序的输出是直接进入终端还是被重定向到管道或文件.
因为如果它进入终端我想输出转义序列来制作彩色文本,但是在文件或管道中那些不受欢迎.
我知道这是可能的,因为"ls"做到了,有谁知道怎么做?