2017-02-15 2 views
2

Ich habe diese kleine Funktion:Einfügen von Text an die Klemme

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

Er druckt den Text ich es dem STDOUT geben, und druckt es auch in den Befehlszeilenpuffer.

Zum Beispiel:

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

Wie kann ich es nicht ausgegeben der Text zu STDOUT machen, sondern nur auf den cli Puffer?

Oder genauer gesagt, ich verwende es, um eine Variable zu drucken, und danach verwende ich read, um Benutzern zu ermöglichen, diese Variable zu ändern, während sie an Ort und Stelle statt neu zu schreiben.

Danke.

+2

Siehe auch [Kann Bash auf seinen eigenen Eingangsstrom schreiben?] (Http://unix.stackexchange.com/q/213799/45537) –

+0

@ HåkonHægland Das ist super danke. Aber ich habe daraus nicht verstanden, wie man die erste Ausgabe der Saite eliminieren kann. – Moshe

+0

@ HåkonHægland die Bash-Option ist auch nicht gut, weil es eine Warnung anzeigt: 'bind: warning: Zeilenbearbeitung nicht aktiviert' – Moshe

Antwort

1

Scheint so, als ob die Ausgabe an das Terminal irgendwie damit verbunden ist, ob die Eingabeaufforderung zurückgegeben wurde oder nicht, wenn ìoctl ausgeführt wird. Zum Beispiel, wie die folgenden Werke zu erwarten:

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; 
} 

Wenn ich die sleep 1 entfernen, funktioniert es nicht (seitdem ist es nicht genug Zeit für die Eingabeaufforderung zurückzukehren).

Verwandte Themen