Конвейер сценария оболочки: другое поведение с или без xclip - PullRequest
1 голос
/ 12 сентября 2011

У меня есть скрипт с именем password-for-object, который я обычно запускаю так:

$ password-for-object example.com
sOtzC0UY1K3EDYp8a6ltfA

т.е. он выполняет сложное вычисление хэша и выводит пароль, который я должен использовать при доступе к объекту (например, веб-сайту) с именем example.com. Я просто дважды щелкну весь пароль, он будет скопирован в мой буфер, и я вставлю его в форму.

Я также узнал, как использовать такой скрипт, не делая мой пароль видимым:

$ password-for-object example.com | xclip

Таким образом, вывод скрипта заканчивается в основном буфере X, и я могу вставить его прямо в поле пароля в форме, и он не отображается на экране.

Единственная проблема с этим способом состоит в том, что password-for-object выводит строку с завершающим символом новой строки, и, таким образом, "xclip" всегда перехватывает дополнительный символ - этот символ новой строки. Если я опущу вывод новой строки в password-for-object, я получу испорченную строку без xclip, т.е. когда я просто помещу ее в стандартный вывод. Я использую 2 оболочки: zsh и bash, и я получу следующее в zsh (обратите внимание на дополнительный знак%):

$ password-for-object example.com
sOtzC0UY1K3EDYp8a6ltfA%
$

Или следующее в bash (обратите внимание, что приглашение будет запущено в той же строке):

$ password-for-object example.com
sOtzC0UY1K3EDYp8a6ltfA$

Есть идеи, как обойти эту проблему? Можно ли изменить скрипт таким образом, чтобы он обнаруживал, что xclip находится в конвейере, и выводил только новую строку, если это не так?

Ответы [ 2 ]

2 голосов
/ 12 сентября 2011

Если вы измените password-for-object, чтобы он не выводил символ новой строки, вы можете вызвать его с помощью сценария, например:

#!/bin/bash
password-for-object "$1"
if [ -t 1 ]
then
    echo
fi

Условие -t описано в bashmanual as:

-t fd

Истина, если файловый дескриптор fd открыт и ссылается на терминал.

См. Следующий вопрос:

1 голос
/ 12 сентября 2011

Попробуйте:

$ password-for-object example.com | tr -d '\n' | xclip

tr -d '\ n' удаляет символ новой строки

...