xclip по-разному работает в интерактивных и неинтерактивных оболочках

В большинстве оболочек символ "*" не совпадает с начальным "." по историческим причинам (например, файлы, начинающиеся с ".", считаются скрытыми, а "." & ".." относятся к каталогам)

Следовательно ls не будет отображать .bashrc, но ls -a покажет все файлы. Точно так же ls * расширится на все файлы, кроме тех, которые начинаются с "." персонаж.

Измените это поведение с помощью shopt -s dotglob , который сообщает bash, что "*" также должно соответствовать начальному "." символ. После этого ls * также покажет .bashrc.

4
23.05.2017, 15:40
3 ответа

Автор оригинального вопроса на Stackoverflow определил, что это проблема в xclip. Использование xsel вместо xclip для работы с буфером обмена X устраняет проблему (обратите внимание, что xclip был заменен на xsel только при помещении данных в буфер обмена, а не при чтении из буфера обмена):

$ cat xclip_test 
#!/usr/bin/env bash
set -x
xterm -e bash -c "echo abc|xclip -selection clipboard; sleep 3"&
sleep 1
xclip -o -selection clipboard
sleep 4
xclip -o -selection clipboard

$ cat xsel_test 
#!/usr/bin/env bash
set -x
xterm -e bash -c "echo abc|xsel --input --clipboard; sleep 3"&
sleep 1
xclip -o -selection clipboard
sleep 4
xclip -o -selection clipboard

$ diff xclip_test xsel_test 
3c3
< xterm -e bash -c "echo abc|xclip -selection clipboard; sleep 3"&
---
> xterm -e bash -c "echo abc|xsel --input --clipboard; sleep 3"&


$ ./xclip_test 
+ sleep 1
+ xterm -e bash -c 'echo abc|xclip -selection clipboard; sleep 3'
+ xclip -o -selection clipboard
abc
+ sleep 4
+ xclip -o -selection clipboard
Error: target STRING not available     # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

$ ./xsel_test 
+ sleep 1
+ xterm -e bash -c 'echo abc|xsel --input --clipboard; sleep 3'
+ xclip -o -selection clipboard
abc
+ sleep 4
+ xclip -o -selection clipboard
abc

И xclip, и xsel работают, отделяясь от терминала и порождая дочерний процесс, который отвечает за предоставление выбора(ов) по требованию (пока не будет сделан новый выбор):

$ ps -H
  PID TTY          TIME CMD
24307 pts/12   00:00:01 bash
27476 pts/12   00:00:00   ps
$ echo qwerty|xclip -selection clipboard
$ ps -H
  PID TTY          TIME CMD
27481 pts/12   00:00:00 xclip  <-- !!!!!!
24307 pts/12   00:00:01 bash
27482 pts/12   00:00:00   ps

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

3
27.01.2020, 20:53

На самом деле, X "системный буфер обмена" не существует. Выборки в X работают двумя взаимодействующими X-клиентами: один X-клиент заявляет, что у него есть выбор (первичный, вторичный, буфер обмена), а другой X-клиент, который хочет вставить выбор, связывается с первым клиентом, который его получит.

Итак, когда первый клиент мертв, выбора нет. Однако я не уверен, как интерактивный режим bash переводится как «терминал / bash все еще доступен для ответа». Выполнение ps может помочь прояснить ситуацию.

То же самое относится к выбору из буфера обмена, , если вы не запускаете одновременно программу xclipboard (или аналогичную программу), которая берет на себя ответственность за предоставление выбора. (См., Например, статью википедии ).

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

3
27.01.2020, 20:53

Я столкнулся с той же проблемой с passв eshell. Программа passиспользует xclip, которая давала сбой точно так же, как вы упомянули.

Мое решение состояло в том, чтобы создать скрипт-оболочку с таким же именем xclipв месте перед /usr/bin в моем PATH со следующим содержимым:

#!/bin/sh
exec setsid /usr/bin/xclip "$@"
3
02.12.2021, 14:09

Теги

Похожие вопросы