Здравствуйте.
Необходимо вывод некоторой команды скопировать в буфер X'ов, а затем вывести в пейджер. Возможно ли такое?
Вот работающий пример, копирующий в файл, а затем выводящий в less:
[console]
$ ls | tee files.txt | less
[/console]
В примере используется утилита tee, которая сохраняет поток вывода в файл, а затем передает его в less. Мне требуется схожее поведение, чтобы сначала данные передавались на ввод утилите xclip, а затем писались в пейджер. То есть должно быть примерно так:
[console]
# Не рабочий код!
$ ls | tee xclip -sel 'clipboard' | less
[/console]
Как добиться описанного поведения?
Спасибо.
Копирование с последующим выводом на чтение
если там не мегабайты текста, то можно тупо чрез переменную:
[console]
OUT="$(ls)"
echo "$OUT" | xclip -sel 'clipboard'
echo "$OUT" | less
[/console]
если много, то можно через файл или именованную трубу...
всё это не особо красиво конечно...
[оффтоп]
как вы подсветку сделали?
Частично разобрался с вопросом.
Для решения проблемы можно использовать замену файла процессом*. Команда должна выглядеть примерно так:
[console]
$ ls | tee >(xclip >&2) | less
[/console]
Конструкция >(команда) является командой, которая внешне выглядит как файл и таким образом может быть передана команде ожидающей файла в качестве аргумента.
Таким образом, вышеописанная команда выводит список файлов в текущей директории, перенаправляет его на ввод команде tee, которая, в свою очередь, во-первых пишет этот список в буфер X'ов (посредством xclip) и во-вторых перенаправляет его на ввод less.
Хотя данная команда и решает описанную в данной теме проблему, у меня всё же возникло два вопроса:
1. Зачем нужно использовать перенаправление STDOUT в STDERR внутри конструкции заменителя (`>(xclip >&2)`)?
2. Почему по завершению работы команды процесс xclip еще некоторое время прододжает болтаться в списке процессов текущей консоли (проверяется командой ps)?
________
*process substitution
как вы подсветку сделали?
С помощью тегов color внутри консоли.
[console]
[color=red]R[/color][color=green]G[/color][color=blue]B[/color] и тд.
[/console]
1. Зачем нужно использовать перенаправление STDOUT в STDERR внутри конструкции заменителя (`>(xclip >&2)`)?
не знаю. вроде без всякого смысла. Наверное автору нужно было это для чего-нить другого.
2. Почему по завершению работы команды процесс xclip еще некоторое время прододжает болтаться в списке процессов текущей консоли (проверяется командой ps)?
на самом деле, это перенаправление вовсе не "выглядит как файл", оно и есть - файл. А именно именованная труба (named pipes). Слева в в неё байты заталкиваете, а внутри скобок - читаете. Пока данные в трубе ещё есть, команда действительно ещё немного работает, даже после прекращения работы команд слева. (пока там всё из трубы вытечет...) Сам файл лежит в /dev/fd, но посмотреть его можно только изнутри процесса (для всех процессов этот каталог свой).
ещё теоретический вопрос: это ведь плюшки баша?
[оффтоп]
С помощью тегов color внутри консоли.
и не лень oO
ещё теоретический вопрос: это ведь плюшки баша?
да.
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.
Как оказалось, всё проще гораздо:
[console]
$ ls | xclip -f | less
[/console]
Опция -f (-filter) для xclip заставляет утилиту писать обратно в STDOUT, после передачи текста в буфер X'ов.
По поводу перенаправления STDOUT в STDERR, внутри заменителя, так и не понял, зачем это нужно. Если его не использовать, то данная команда просто отобразит список файлов и застынет в таком виде, не передавая управления обратно. Как мне кажется это особенность работы xclip, тем более, что если использовать её внутри заменителя с ключом -f или использовать, вообще, другую команду, всё работает без каких либо проблем.
По поводу нахождения в списке процессов по окончанию работы, думаю, что это тоже особенность xclip, поскольку при использовании других утилит, подобного не происходит.
Опция -f (-filter) для xclip заставляет утилиту писать обратно в STDOUT, после передачи текста в буфер X'ов.
эта опция имеется также у многих других утилит. Причём это не просто вывод, а ещё и не буферезированный вывод, т.е. выводится минимально возможными порциями, по 1й строчке.
По поводу перенаправления STDOUT в STDERR, внутри заменителя, так и не понял, зачем это нужно. Если его не использовать, то данная команда просто отобразит список файлов и застынет в таком виде, не передавая управления обратно.
очевидно вывод в stdout по умолчанию буферезированый, вот она и выводит до заполнения буфера. А буфер там довольно большой, как минимум 64К.
По поводу нахождения в списке процессов по окончанию работы, думаю, что это тоже особенность xclip, поскольку при использовании других утилит, подобного не происходит.
угу. типа того...