如何在perl脚本中读取终端上的文本

如何在perl脚本中读取终端上的文本,perl,shell,unix,terminal,text-parsing,Perl,Shell,Unix,Terminal,Text Parsing,有没有办法在perl脚本中捕获termianl屏幕上的文本。我知道有一些函数,如system、exec、backticks,但问题是它们执行脚本中的命令。例如:-在终端中,我写入cd/(或)ls,然后运行perl脚本,它将读取termianl屏幕上写入的内容(在本例中,scipt将捕获cd/(或)ls,以给定给termianl的为准)。我提供了一个解决方案,通过将您在termianl上编写的命令作为命令行参数传递给脚本,但是否有其他方法??类似于此: history | perl -ne 'pr

有没有办法在perl脚本中捕获termianl屏幕上的文本。我知道有一些函数,如system、exec、backticks,但问题是它们执行脚本中的命令。例如:-在终端中,我写入cd/(或)ls,然后运行perl脚本,它将读取termianl屏幕上写入的内容(在本例中,scipt将捕获cd/(或)ls,以给定给termianl的为准)。我提供了一个解决方案,通过将您在termianl上编写的命令作为命令行参数传递给脚本,但是否有其他方法??

类似于此:

history | perl -ne 'print $_'

据我所知,在这样一种情况下,您在终端中键入了一些内容:

[tai@littlerobot ~] echo "Hello"
Hello
[tai@littlerobot ~] perl myscript.pl
您希望myscript.pl能够访问
echo“Hello”
部分,还可能访问该命令输出的
Hello

Perl不提供这样的特性。没有任何编程语言提供或能够提供这样的功能,因为脚本/程序运行的过程在运行之前对同一终端中发生的事情没有内在的了解。它访问此文本的唯一方法是询问当前正在运行的终端,该终端将有一些此信息的记录(即滚动缓冲区),即使它无法区分文本中哪些字符是您键入的,哪些是输出的。然而,据我所知,没有终端通过任何类型的公共API公开这些信息

因此,如果您希望myscript.pl能够访问该
回显“Hello”
,则需要将其传递给脚本。将
history
导入脚本(如马克·塞切尔在回答中所示)是一种技巧
history
是一个内置的shell,因此它拥有与shell相同的知识(这与您的终端所拥有的知识并不完全相同)。特别是,它可以为您提供在此shell会话中键入的命令的列表。但是,它不能告诉您这些命令生成的输出。而且它不能告诉您关于其他shell会话的信息,因此在Perl中这样做是毫无用处的:

my @history = `tcsh -c history`;
您可以尝试的最后一件事(尽管这将非常复杂)是询问X服务器(或Windows,如果在该操作系统上运行)屏幕截图,然后尝试定位当前终端运行的矩形并在其上执行。不过,这将充满问题,例如处理重叠窗口


总之,你不能这么做。这与Perl无关。在任何编程语言中都无法做到这一点。

我猜您需要
my$input=
但这会暂停代码,直到用户实际输入并按下enter键。您还需要使用
chomp($input)
afterwords.can你能扩展一下吗..我是perl新手..刚刚开始了2-3天的学习,下面的代码:
print“Enter your name:”;我的$input=;chomp($输入);打印“Hello$input,很高兴认识您。\n”这有点像:printf(“\n输入一个数字”);scanf(“%d”和“&a”);在C中…我不想让脚本等待用户输入..我想让它读取终端屏幕上写的内容。例如,为了运行脚本,我编写了perl tool.pl,所以当我运行scipt时,它应该读取终端上的perl tool.pl或之前给出的任何cmds…可能吗???@shikhardep:不要使用
printf
print
足够时。这是Shikhar在其评论中提到的“将命令(我正试图捕获)作为命令行参数传递的想法”的一个变体,但我认为这可能是他将得到的最接近的。will-ne将执行什么??Perl文档的一部分将告诉您Perl的各种命令行选项的作用,包括
-n
-e
。是的,这就是我正在尝试做的(捕获echo hello)…好的,如果不可能,那么我将继续将cmd作为cmd行参数传递。感谢您的详细解释