Intereting Posts
Как скрыть сообщения о статусе пользователя в XChat? Диск почти заполнен на сервере с помощью CPanel Как разблокировать безопасно, не загрязняя текущий каталог в случае tarbomb? Как запустить скрипт без root для sniff network (libpcap)? Как выполнить команду оболочки, созданную с использованием echo и sed? Как я могу обнулить файлы в файле образа VMware, чтобы их пространство было исправлено? Добавление метки времени в файл журнала с помощью команды cronjob Joli OS на устройствах ARM Объединить вывод сценария в тело письма и отправить его как одно электронное письмо? проверить текущий размер очереди для отставания Доступ к Windows Share с локальной Linux-машины через удаленный ssh-сервер Использование ~ в цели символической ссылки или создание символической ссылки с переменной Добавление текста после определенной строки файла в скрипте Bash Скопировать определенный тип файла, сохраняя структуру папок OpenConnect работает только один раз

xsel </ tmp / xselection не работает в скрипте

Я пытаюсь использовать следующий скрипт:

#!/usr/bin/env bash # Edit xselection in gvim xsel > /tmp/xselection gvim /tmp/xselection xsel < /tmp/xselection 

Но последняя строка, похоже, не правильно загружает файл в xselection. Если я запустил эту строку сразу после вызова сценария, она будет успешной. Я не понимаю, почему. Что мне не хватает?

Вам не хватает того факта, что вызов gvim не блокируется, пока вы не выйдете из gvim, он немедленно возвращается. Таким образом, xsel < /tmp/xselection обрабатывает файл перед его редактированием.

Я включил информацию из обоих / всех трех ответов, чтобы создать следующее:

 #!/usr/bin/env bash # Edit xselection in gvim xsel > /tmp/xselection gvim -f /tmp/xselection xsel -i < /tmp/xselection 

Вам нужно использовать опцию -i . ( -o – значение по умолчанию)

 xsel -i </tmp/xselection # -o, --output  write the selection to standard output. # -i, --input  read standard input into the selection.* 

Эти оппоненты работают с основным выбором X (а не с буфером обмена), поэтому вам нужно щелкнуть по центру, чтобы увидеть resullt. Я тестировал его с паузой перед последней командой. Это позволило мне вручную выбрать другой текст перед выполнением последней команды. Я щелкнул по центру и работал отлично … и он работает без задержки.

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

Возможно, ваша проблема – это комбинация опции -i и ответа Paul Tomblin о том, как gvim отрывается от процесса скрипта.

Мой предыдущий ответ был немного переполнен и был неполным (и осталось только одно редактирование). Итак, вот исправленный ответ, который включает в себя обе идеи … варианты и отключение .

Как я уже упомянул в дополнении к комментарию Джайлса (предыдущий ответ), опция -i определенно необходима в некоторых ситуациях (в тестовой системе Ubuntu) .. поэтому -i и -o используются здесь.

Поскольку «gvim» отрывается от процесса скрипта, он не ждет, и следующая команда выполняется немедленно. (Пол Томблин уже указал на это в ответе ГЭС).

Вы не можете использовать команду wait bash, поскольку она работает только для дочерних процессов . В качестве обходного пути вы можете настроить цикл, ожидающий завершения не-дочернего процесса. Это работает для редактора, который запускается с новым процессом каждый раз (как это делает «gvim» в этом случае).

Вот измененный скрипт

 xsel -o >/tmp/xselection gvim /tmp/xselection 2>/dev/null pid=$(pgrep -n "gvim") # get gvim's pid and wait while kill -0 "$pid" 2>/dev/null; do sleep 0.5; done xsel -i </tmp/xselection 

Вышеприведенное предполагает, что gvim` pid уже установлен с помощью управления временем, которое возвращается к скрипту. Если при высокой загрузке системы pid не был установлен после выполнения следующей команды, тогда этот метод ожидания gvim должен работать.

 xsel -o >/tmp/xselection pre=$(pgrep -n gvim) # get previous gvim pid gvim /tmp/xselection 2>/dev/null while pid=$(pgrep -n "gvim"); [[ "$pid" == "$pre" ]]; do sleep .1; done while kill -0 "$pid" 2>/dev/null; do sleep 0.5; done xsel -i </tmp/xselection