LinuxForum.Fans
Тема

Копирование с последующим выводом на чтение

Автор: SamuelLinux 9 сообщений 2097 просмотров
#221608

Здравствуйте.

Необходимо вывод некоторой команды скопировать в буфер X'ов, а затем вывести в пейджер. Возможно ли такое?

Вот работающий пример, копирующий в файл, а затем выводящий в less:

[console]
$ ls | tee files.txt | less
[/console]

В примере используется утилита tee, которая сохраняет поток вывода в файл, а затем передает его в less. Мне требуется схожее поведение, чтобы сначала данные передавались на ввод утилите xclip, а затем писались в пейджер. То есть должно быть примерно так:

[console]
# Не рабочий код!
$ ls | tee xclip -sel 'clipboard' | less
[/console]

Как добиться описанного поведения?

Спасибо.

#221612

если там не мегабайты текста, то можно тупо чрез переменную:
[console]
OUT="$(ls)"
echo "$OUT" | xclip -sel 'clipboard'
echo "$OUT" | less
[/console]
если много, то можно через файл или именованную трубу...
всё это не особо красиво конечно...

[оффтоп]
как вы подсветку сделали?

#221650

Частично разобрался с вопросом.

Для решения проблемы можно использовать замену файла процессом*. Команда должна выглядеть примерно так:

[console]
$ ls | tee >(xclip >&2) | less
[/console]

Конструкция >(команда) является командой, которая внешне выглядит как файл и таким образом может быть передана команде ожидающей файла в качестве аргумента.

Таким образом, вышеописанная команда выводит список файлов в текущей директории, перенаправляет его на ввод команде tee, которая, в свою очередь, во-первых пишет этот список в буфер X'ов (посредством xclip) и во-вторых перенаправляет его на ввод less.

Хотя данная команда и решает описанную в данной теме проблему, у меня всё же возникло два вопроса:

1. Зачем нужно использовать перенаправление STDOUT в STDERR внутри конструкции заменителя (`>(xclip >&2)`)?

2. Почему по завершению работы команды процесс xclip еще некоторое время прододжает болтаться в списке процессов текущей консоли (проверяется командой ps)?

________
    *process substitution

#221654
Fat-Zer написал:

как вы подсветку сделали?

С помощью тегов color внутри консоли.

text

[console]
[color=red]R[/color][color=green]G[/color][color=blue]B[/color] и тд.
[/console]
#221671
SamuelLinux написал:
1. Зачем нужно использовать перенаправление STDOUT в STDERR внутри конструкции заменителя (`>(xclip >&2)`)?

не знаю. вроде без всякого смысла. Наверное автору нужно было это для чего-нить другого.

SamuelLinux написал:
2. Почему по завершению работы команды процесс xclip еще некоторое время прододжает болтаться в списке процессов текущей консоли (проверяется командой ps)?

на самом деле, это перенаправление вовсе не "выглядит как файл", оно и есть - файл. А именно именованная труба (named pipes). Слева в в неё байты заталкиваете, а внутри скобок - читаете. Пока данные в трубе ещё есть, команда действительно ещё немного работает, даже после прекращения работы команд слева. (пока там всё из трубы вытечет...) Сам файл лежит в /dev/fd, но посмотреть его можно только изнутри процесса (для всех процессов этот каталог свой).

#221675

ещё теоретический вопрос: это ведь плюшки баша?
[оффтоп]

SamuelLinux написал:
С помощью тегов color внутри консоли.

и не лень oO

#221686
Fat-Zer написал:
ещё теоретический вопрос: это ведь плюшки баша?

да.

man bash написал:
Process Substitution
Process substitution is supported on systems that support named pipes (FIFOs) or the
/dev/fd method of naming open files. It takes the form of <(list) or >(list). The
process list is run with its input or output connected to a FIFO or some file in
/dev/fd. The name of this file is passed as an argument to the current command as the
result of the expansion. If the >(list) form is used, writing to the file will pro‐
vide input for list. If the <(list) form is used, the file passed as an argument
should be read to obtain the output of list.

When available, process substitution is performed simultaneously with parameter and
variable expansion, command substitution, and arithmetic expansion.
#221708

Как оказалось, всё проще гораздо:

[console]
$ ls | xclip -f | less
[/console]

Опция -f (-filter) для xclip заставляет утилиту писать обратно в STDOUT, после передачи текста в буфер X'ов.

По поводу перенаправления STDOUT в STDERR, внутри заменителя, так и не понял, зачем это нужно. Если его не использовать, то данная команда просто отобразит список файлов и застынет в таком виде, не передавая управления обратно. Как мне кажется это особенность работы xclip, тем более, что если использовать её внутри заменителя с ключом -f или использовать, вообще, другую команду, всё работает без каких либо проблем.

По поводу нахождения в списке процессов по окончанию работы, думаю, что это тоже особенность xclip, поскольку при использовании других утилит, подобного не происходит.

#221745
SamuelLinux написал:
Опция -f (-filter) для xclip заставляет утилиту писать обратно в STDOUT, после передачи текста в буфер X'ов.

эта опция имеется также у многих других утилит. Причём это не просто вывод, а ещё и не буферезированный вывод, т.е. выводится минимально возможными порциями, по 1й строчке.

SamuelLinux написал:
По поводу перенаправления STDOUT в STDERR, внутри заменителя, так и не понял, зачем это нужно. Если его не использовать, то данная команда просто отобразит список файлов и застынет в таком виде, не передавая управления обратно.

очевидно вывод в stdout по умолчанию буферезированый, вот она и выводит до заполнения буфера. А буфер там довольно большой, как минимум 64К.

SamuelLinux написал:
По поводу нахождения в списке процессов по окончанию работы, думаю, что это тоже особенность xclip, поскольку при использовании других утилит, подобного не происходит.

угу. типа того...

Войдите или зарегистрируйтесь, чтобы ответить.