Shell
cat 進入標準輸入然後管道進入程序保持分叉的外殼打開,為什麼?
我不確定發生了什麼,但我一直在嘗試了解輸入和輸出發生了什麼。所以這是我的程序。
#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$
現在我嘗試回顯然後管道,但外殼立即關閉。
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
當我在這裡最後有 cat 時,它也可以工作。
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”然後通過管道輸入)保持打開狀態。
我相信它可能與標準輸出有關。
對於它“工作”的情況,您正在執行**
cat
一個正在讀取其標準輸入的程序,該輸入尚未關閉。由於它尚未(尚未)關閉,因此cat
**繼續執行,使其標準輸出保持打開狀態,供 shell 使用(也未關閉)。