相关疑难解决方法(0)

欺骗应用程序认为它的标准输出是一个终端,而不是管道

我正试图做相反的事情

检测stdin是终端还是管道?

我正在运行一个正在更改其输出格式的应用程序,因为它检测到stdout上的管道,我希望它认为它是一个交互式终端,以便在重定向时获得相同的输出.

我当时认为将它包装在expect脚本中或使用proc_open()PHP中的它会这样做,但事实并非如此.

有什么想法吗?

bash terminal stdin pipe

137
推荐指数
7
解决办法
5万
查看次数

如何知道是否从终端/命令行中调用git hook

我有一个git钩子,只要有人提交到他们的本地存储库就会运行.

有些人从终端提交,有些人从SourceTree或SmartGit或其他第三方应用程序提交.

SourceTree在钩子方面表现不同.例如,默认情况下错误是红色的,并且似乎不支持用户输入,因此我需要根据用户是否从SourceTree或SmartGit等提交来更改我的python脚本.

在我的脚本中有没有办法做到这一点?

python git githooks atlassian-sourcetree

9
推荐指数
1
解决办法
329
查看次数

当管道和重定向时,stdin的行为会有所不同

我正在尝试将信息传递给不接受来自stdin的输入的程序.为此,我使用/ dev/stdin作为参数,然后尝试输入我的输入.我注意到如果我用管道字符做这个:

[pkerp@comp ernwin]$ cat fess/structures/168d.pdb | MC-Annotate /dev/stdin
Run Code Online (Sandbox Code Playgroud)

我没有输出.但是,如果我使用左插入符字符做同样的事情,它可以正常工作:

[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
Run Code Online (Sandbox Code Playgroud)

我的问题是,这两项业务之间有什么区别?为什么它们会产生不同的结果呢?作为一个额外的问题,是否有一个使用"<"符号指定输入的正确术语?

更新:

我目前最好的猜测是,正在运行的程序内部的东西会利用文件中的搜索.下面的答案似乎表明它与文件指针有关,但运行以下小测试程序:

#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);
    } …
Run Code Online (Sandbox Code Playgroud)

bash stdin

7
推荐指数
1
解决办法
1295
查看次数

如何阅读C中的管道内容?

我希望能够这样做:

$ echo "hello world" | ./my-c-program
piped input: >>hello world<<
Run Code Online (Sandbox Code Playgroud)

我知道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);
  }

}
Run Code Online (Sandbox Code Playgroud)

我使用以下方法编译:

gcc -o my-c-program my-c-program.c
Run Code Online (Sandbox Code Playgroud)

几乎可以工作,除了它似乎总是在管道内容字符串的末尾添加一个U + FFFD REPLACEMENT CHARACTER和换行符(我确实理解换行符).为什么会发生这种情况,如何避免这个问题呢?

echo "hello world" | ./my-c-program
piped content: >>hello world
?<<
Run Code Online (Sandbox Code Playgroud)

免责声明:我对C没有任何经验.请放轻松我.

c stdin pipe

4
推荐指数
1
解决办法
1779
查看次数

期待来自std :: cin的输入(Unix C++)

可能重复:
检测stdin是C/C++/Qt中的终端还是管道?

我正在编写一个命令行应用程序,它将数据作为命令行参数或来自cin.

有没有办法检查用户是否在应用程序中传输了一些数据($ ./myapp <test.txt),如果没有,只显示键盘输入的提示?

如果我正在检查!cin.good()/ cin.eof()等,则提示将永远不会出现.

c++ unix linux command-line pipe

2
推荐指数
1
解决办法
478
查看次数

C++检测输入重定向

可能重复:
检测stdin是C/C++/Qt中的终端还是管道?

考虑我们有一个小程序,需要一些标准的C输入.

我想知道用户是否正在使用输入重定向,例如:

./programm < in.txt
Run Code Online (Sandbox Code Playgroud)

有没有办法程序中检测这种输入重定向方式?

c++ iostream io-redirection

2
推荐指数
1
解决办法
2893
查看次数

如何知道输出是否转到终端?

可能重复:
检测stdin是C/C++/Qt中的终端还是管道?

我想知道我的程序的输出是直接进入终端还是被重定向到管道或文件.

因为如果它进入终端我想输出转义序列来制作彩色文本,但是在文件或管道中那些不受欢迎.

我知道这是可能的,因为"ls"做到了,有谁知道怎么做?

c python linux bash xterm

2
推荐指数
1
解决办法
179
查看次数