我不确定发生了什么,但我一直在尝试了解输入和输出发生了什么。这是我的程序。
#include <stdio.h>
#include <stdlib.h>
int main(){
char pass[8];
fgets(pass, 8, stdin);
if (pass[1] == 'h'){
printf("enter shell\n");
system("/bin/bash");
printf("leave shell\n");
}
return 0;
}
这是一些终端命令。当我定期运行它并输入“hh”时,外壳保持打开状态。
idkanything ~ $ ./a.out
hh
enter shell
bash-3.2$
现在我尝试回显然后管道,但是 shell 立即关闭。
idkanything ~ $ echo "hh" | ./a.out
enter shell
leave shell
所以现在是它起作用的时候了:
idkanything ~ $ cat <(python -c 'print "hh"') - | ./a.out
enter shell
this work
/bin/bash: line 1: this: command not found
leave shell
但是当我省略标准输入的“-”时,它不起作用,因为外壳会立即关闭。
idkanything ~ $ cat <(python -c 'print "hh"') | ./a.out
enter shell
leave shell
当我这里最后有猫时,它也有效。
idkanything ~ $ (python -c 'print "hh"'; cat) | ./a.out
enter shell
this works
/bin/bash: line 1: this: command not found
leave shell
有人可以解释一下发生了什么事吗?哪些命令可以使 shell 保持打开状态?为什么 shell 只对这些命令保持打开状态,而不对其他命令(例如回显“hh”然后通过管道输入)保持打开状态。
我相信这可能与标准输出有关。
答案1
对于“有效”的情况,您将让进程保持运行状态cat
正在阅读它是标准输入,尚未关闭。由于该项目(尚未)尚未关闭,cat
继续奔跑,离开它是标准输出打开,由 shell 使用(也未关闭)。