作者: Jim Wang 公众号: 巴博萨船长

摘要:主要讨论问题:如何程序运行的时候已经将标准输入使用”<“符号或者”|“符合在命令行定向为一个文件。

Abstract: The main discussion problem: how to use the standard input “<” symbol or “|” to be directed to a file on the command line when the program is running.

作者: Jim Wang 公众号: 巴博萨船长

问题

遇见问题是,如何程序运行的时候已经将标准输入使用”<“符号或者”|“符合在命令行定向为一个文件。

可是在程序的运行过程中希望从键盘得到输入内容。

因为/dev/tty为当前进程的控制台,STDIN 为当前的标准输入. 如果重定向,例如:

1
perl script.pl <myfile.txt

STDIN 被指向 myfile.txt, 但是 /dev/tty 仍然来自于控制终端。所有的Unix都是这样,不单单是指这个perl。

解决方案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/perl -w
use strict;
$| = 1;
my $stream;
while (<>) {
$stream .= $_;
}
open STDIN, "/dev/tty" or die;
print "Do you want to process the stream? ";
my $ans = <STDIN>;
chomp $ans;
print "Got '$ans'\n";
print "stream = $stream";
#...
exit;
__END__

测试:

1
2
3
4
$ echo foo | ./stdin 
Do you want to process the stream? yes
Got 'yes'
stream = foo

发现标准输入重新指向键盘。问题解决。祝君好运。

才疏学浅,欢迎交流提意见彼此提高。需要声明一下51cto博客作者zuiwuxin就是作者本人,所以不存在版权问题。以后该博客将作为个人文章的主要发布地。


版权声明:
文章首发于 Jim Wang's blog , 转载文章请务必以超链接形式标明文章出处,作者信息及本版权声明。