Вы наверняка умеете работать с копированием и вставкой через сочетания клавиш: Ctrl + C, Ctrl + V.
Но знаете ли вы, что можете более эффективно обрабатывать содержимое буфера обмена прямо из командной строки?
Буфер обмена — это общее название для блока памяти, в котором временно находится скопированная информация.
Большинство X11 окружений рабочего стола поддерживают два варианта буфера:
1. Системный буфер обмена (clipboard). Когда вы выполняете операции "cut/copy" через горячие клавиши, содержимое попадает в этот буфер. После вставки информация извлекается.
2. Первичный буфер обмена (primary selection). Запись происходит, когда вы мышью выделяете текст в определенных приложениях. Для извлечения используется нажатие на колесо.
Если у кого в наличии только тачпадам, следует одновременно нажать левую и правую кнопки для вставки текста.
Обычно эти буферы не связаны и хранящиеся в них данные не влияют друг на друга. Записываем что-то в clipboard, primary selection остается нетронутым.
Подключение буферов к потокам
В Linux есть команда xclip, которая соединяет X-буферы обмена с потоками stdin и stdout.
Благодаря ей можно заполнять буферы информацией либо извлекать ее через конвейер и перенаправление файла.
По умолчанию команда читает stdout и записывает его в первичный буфер:
$ xclip < myfile.txt
$ echo "Some cool text" | xclip
Теперь выведем текст в stdout, перенаправим его в файл и передадим команде wc:
$ xclip -o
Some cool text
$ xclip -o > file.txt
$ xclip -o | wc -w
3
Очистим первичный буфер обмена, поместив в него пустую строку:
$ echo -n | xclip
Параметр "-n" важен, так как в противном случае echo выведет в stdout символ новой строки "\n", который окажется в первичном буфере обмена.
Команда поддерживает явное указание буфера. Чтобы скопировать текст в системный буфер обмена вместо первичного, запустим xclip с параметром "-selection clipboard":
$ ls | grep scr | xclip -selection clipboard
$ xclip -selection clipboard -o
script.sh
Теперь вы можете либо использовать комбинации клавиш для вывода либо просто флаг "-o".
При необходимости параметры xclip могут быть сокращены "-selection clipboard == -sel c"
Немного практики
Чтобы дополнительно облегчить себе жизнь, можно создать на xclip несколько алиасов:
$ alias ccopy="xclip -sel c"
$ alias cpaste="xclip -sel c -o"
Теперь, допустим, нам нужно установить определенный deb пакет, предварительно определив его среди общей массы:
$ ls ~/Downloads | grep code
code_1.96.4-1736994636_arm64.deb
Отлично, копируем название в буфер, затем выполняем вставку после целевой команды:
$ ls ~/Downloads | grep code | ccopy
$ sudo dpkg -i ~/Downloads/$(cpaste)
LinuxCamp
