2017-02-15 126 views
2

我有这样的小功能:粘贴文本到终端

writecmd() { 
    perl -e 'ioctl STDOUT, 0x5412, $_ for split //, do{ chomp($_ = <>); $_ }' ; 
} 

它打印我给它的STDOUT的文本,打印它还向命令行缓冲器。

例如:

[root]$ echo "text" | perl -e 'ioctl STDOUT, 0x5412, $_ for split //, do{ chomp($_ = <>); $_ }' ; 
text[root]$ text 

我怎样才能使它不输出文本到stdout,但只有到CLI缓冲区?

或者更具体地说,我用它来打印一个变量,之后我使用read来允许用户在编辑它的同时修改该变量,而不是一遍又一遍地编写它。

谢谢。

+2

另请参见[可以bash写入自己的输入流?](http://unix.stackexchange.com/q/213799/45537) –

+0

@HåkonHægland这真棒谢谢。但是我不明白如何消除字符串的第一个输出。 – Moshe

+0

@HåkonHæglandbash选项也不好,因为它显示一个警告:'bind:warning:line editing not enabled' – Moshe

回答

1

似乎输出到终端与执行ìoctl时提示是否返回有关。例如,预期了以下工作:

use strict; 
use warnings; 

my $pid = fork(); 
if ($pid == 0) { 
    sleep 1; 
    my $cmd = "ls"; 
    # 0x5412 = TIOCSTI, see c include file: <asm-generic/ioctls.h> 
    ioctl STDOUT, 0x5412, $_ for split //, $cmd; 
} 

如果我删除sleep 1,它不工作(因为再没有足够的时间及时返回)。