Portál AbcLinuxu, 8. května 2025 04:22

Dotaz: Jak zrušit pipe mód přest system() v Perlu

19.4.2017 12:17 RM
Jak zrušit pipe mód přest system() v Perlu
Přečteno: 294×
Odpovědět | Admin
Měl bych záludný dotaz nejen na uživatele Perlu ohledně použití roury. Co se týče roury, vycházím z těchto předpokladů: Při napojení roury na vstup se vytvoří spojení STDOUT->|->STDIN a u druhého programu se tedy nastaví filedeskriptor 0 na čtení z roury (/proc/$$/fd/0). Dovolil jsem si to nazvat jako (pipe mód). Na základě toho pak změní své chování program, protože deskriptor (tedy mód) se dědí. Takhle nějak to chápu, a jde mi o to, nějak toto dědění potlačit. Problém se dá minimalizovat do perlího one-lineru takto:
echo "ahoj" | perl -ne 'print $_; system(vim, /tmp/file.test) '
Potřebuji nějak pracovat se vstupem ze STDIN (zde puze print) a pak použít system(), který dědí filedeskriptor napojený na rouru a dle toho se program vim zachová tak, že očekává vstup přes STDIN, k čemuž by ale potřeboval místo zadaného souboru pomlčku; takže si zanadává a v mém případě rozbije terminál. Zkoušel jsem zavřít STDIN, ale to nepomůže, protože pipe mód (zřejmě stále platné /proc/$$/fd0) zůstane. Je nějaký způsob jak před system() nebo exec() zrušit pipe mód a program spustit normálně?
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

19.4.2017 13:32 Lyco | skóre: 14 | blog: Lyco
Rozbalit Rozbalit vše Re: Jak zrušit pipe mód přest system() v Perlu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Připoj vimu na stdin svůj řídící terminál, viz také https://linux.die.net/man/4/tty

ve tvém případě funguje primitivní úprava:
echo "ahoj" | perl -ne 'print $_; system("vim /tmp/file.test </dev/tty")'
Pokud už řídící terminál nemáš, můžeš použít expect, nebo si nastudovat jak se pracuje s pseudoterminálem.
Příspěvek se rázem stává až o 37,5 % pravdivější, je-li pod ním napsáno reálné jméno.
19.4.2017 18:12 RM
Rozbalit Rozbalit vše Re: Jak zrušit pipe mód přest system() v Perlu
Zdá se, že spouštět kvůli tomu shell není třeba. Tohle funguje také:
echo "ahoj" | perl -ne 'print $_; open STDIN, "/dev/tty" ;system qw(vim /tmp/file.test)'
Takže díky moc, informace pomohla.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.