LINUX.ORG.RU

А есть ли такая стандарнтая утилита?


0

0

Чтобы что-то прочитать со стандартного ввода, поместить во временный файл, напустить на него редактор, подождать, пока человек всё отредактирует, и выдвть результат на стандартный вывод?

Наверняка ведь есть, неохота придумывать очередной велик. :)

"Велик" в 5 строк, легче написать, чем искать.

З.Ы. Очень непонятное желание редактировать stdin и выдавать результат на stdout. Можно пример из жизни, когда это надо?

sdio ★★★★★
()
Ответ на: комментарий от sdio

> Можно пример из жизни, когда это надо?

Ну вот например, у Mercurial есть плагин tralsplant, который позволяет переносить отдельные патчи из одного репозитория в другой. При этом эти патчи можно пропускать через фильтр, который читает stdin, что-то делает и результат выдаёт на stdout. Вот я и хочу такой фильтр, чтоб вручную можно было эти патчи редактировать. =)

ero-sennin ★★
() автор топика
Ответ на: комментарий от ero-sennin

Сейчас попробовал по-быстрому написать, и обнаружил, что консольные редакторов дохнут, если stdin не является терминалом. Попробуйте запустить ls|vim или ls|nano. А если редактор запускать из скрипта, которому что-то подаётся на stdin через трубу, так оно и получается. Сразу и не придумаю, как побороть.

ero-sennin ★★
() автор топика
Ответ на: комментарий от ero-sennin

Извращение конечно, но:

from os import system, ttyname from sys import stderr

tty = ttyname(stderr.fileno()) system('vi <%s >%s' % (tty, tty))

anonymous
()
Ответ на: комментарий от ero-sennin

Извращение конечно, но:

from os import system, ttyname
from sys import stderr

tty = ttyname(stderr.fileno())
system('vi <%s >%s' % (tty, tty))

anonymous
()
Ответ на: комментарий от anonymous

Таки родил велик. Спасибо анонимусу за идею. :)

#!/usr/bin/env python

from sys import stdin, stdout, stderr
from os import environ, system, ttyname
from tempfile import NamedTemporaryFile as tempfile

tty = ttyname(stderr.fileno())
editor = environ.get('EDITOR', 'vi')

f = tempfile(prefix='pipe-editor')
f.write(stdin.read())
f.flush()
system('%s %s <%s >%s' % (editor, f.name, tty, tty))
f.seek(0)
stdout.write(f.read())

ero-sennin ★★
() автор топика

О блин, а фильтру этот transplant, оказывается, ничего на stdin не подаёт, а просто передаёт в виде параметров 2 файла, которые можно редактировать. :)

ero-sennin ★★
() автор топика
Ответ на: комментарий от ero-sennin

>Сейчас попробовал по-быстрому написать, и обнаружил, что консольные редакторов дохнут, если stdin не является терминалом. Попробуйте запустить ls|vim или ls|nano. А если редактор запускать из скрипта, которому что-то подаётся на stdin через трубу, так оно и получается. Сразу и не придумаю, как побороть.

А маны почитать? ls | vim -

anonymous
()
Ответ на: комментарий от anonymous

> ls | vim -

Это не совсем то. :) Со стандартного ввода vim прочитает, а вот на стандартный вывод так просто не выведет. :)

ero-sennin ★★
() автор топика

Редактор joe (мой любимый) поддерживает редакторование stdin, при этом если сохранить содержимое, то это аналогично выводу на stdout. В manpage описывается:

quota -v | joe - | mail root

Но конечно же, надо подконфигурировать немного, чтобы удобнее работало.

Лично мне трудно понять, где может пригодиться такой pipe-edit, потому как я часто обнаруживаю во время редактирования, что что-то забыто и надо отменить комманду, а тут все 3 комманды в pipe уже запущены.

Но если уж заговорили об интересных способах редактирования, сам я использую alias jn="joe /dev/null" как временный редактируемый буфер. А если надо слишком длинные строки копировать, то и alias cn="cat >/dev/null". Очень удобно. :-)

mihalych ★★★
()
Ответ на: комментарий от ero-sennin

Вот, так работает:

#!/bin/sh
TTY=`ps | awk -- '/pts/ { print "/dev/" $2; exit; }'`
TMPFILE=`mktemp -p /tmp`
cat > $TMPFILE
vim $TMPFILE <$TTY
cat $TMPFILE
rm $TMPFILE

unDEFER ★★★★★
()
13 декабря 2006 г.

Наткнулся случайно

VIPE(1)                                                                VIPE(1)

NAME
       vipe - edit pipe

SYNOPSIS
       command | vipe | command

DESCRIPTION
       vipe allows you to run your editor in the middle of a unix pipeline and
       edit the data that is being piped between programs.

ENVIRONMENT VARIABLES
       EDITOR
           Editor to use.

       VISUAL
           Also supported to determine what editor to use.

AUTHOR
       Copyright 2006 by Joey Hess <joey@kitenet.net>

       Licensed under the GNU GPL.

sdio ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.