Ruby: выполнить команду оболочки 'echo' с опцией '-n' - PullRequest
6 голосов
/ 20 февраля 2011

Я хотел бы запустить следующую команду оболочки из Ruby, которая копирует строку в буфер обмена (в OS X), 'n' подавляет разрыв строки после строки, вызванной echo:

echo -n foobar | pbcopy

-> работает, отлично, теперь буфер обмена содержит "foobar"

Я пробовал следующее, но все они всегда копируют опцию '-n' в буфер обмена:

%x[echo -n 'foobar' | pbcopy]
%x[echo -n foobar | pbcopy]
system "echo -n 'foobar' | pbcopy"
system "echo -n foobar | pbcopy"
exec 'echo -n "foobar" | pbcopy'
`echo -n "foobar" | pbcopy`
IO.popen "echo -n 'foobar' | pbcopy"

Как правильно достичь этого?

Ответы [ 5 ]

7 голосов
/ 20 февраля 2011

Ваша проблема в том, что -n понимается только встроенной командой bash echo; когда вы говорите %x[...] (или любой другой вариант), команда подается на /bin/sh, который будет действовать как оболочка POSIX, даже если на самом деле это /bin/bash. Решение заключается в явной подаче команд оболочки в bash:

%x[/bin/bash -c 'echo -n foobar' | pbcopy]

Вам, конечно, нужно быть осторожным с цитированием того, чем на самом деле является * 1009. Переключатель -c по существу говорит /bin/bash, что вы даете ему встроенный скрипт:

-c строка
Если присутствует опция -c , то команды считываются из string . Если после строки есть аргументы, они присваиваются позиционному параметры, начиная с $ 0 .

6 голосов
/ 21 февраля 2011

Поскольку echo ведет себя по-разному в разных оболочках и в /bin/echo, рекомендуется использовать printf.

Нет новой строки:

%x[printf '%s' 'foobar' | pbcopy]

С новой строкой:

%x[printf '%s\n' 'foobar' | pbcopy]
2 голосов
/ 20 февраля 2011

Возможно, вы изобретаете колесо.

IRB_Tools и Utility_Belt, которые используются для настройки IRB, предоставляют возможность использовать буфер обмена.Оба являются коллекциями существующих драгоценных камней, поэтому я выполнил быстрый поиск с использованием gem clipboard -r и нашел:

clipboard (0.9.7)
win32-clipboard (0.5.2)

Глядя на RubyDoc.info для буфера обмена , открывается:

буфер обмена

Доступ к буферу обмена и не волнует, если ОС Linux, MacOS или Windows.

Использование

У вас есть Clipboard.copy,

Clipboard.paste и

Clipboard.clear

Веселитесь;)


РЕДАКТИРОВАТЬ: Если вы проверяете источник на связанной страницедля Mac вы увидите для копии:

def copy(data)
  Open3.popen3( 'pbcopy' ){ |input,_,_| input << data }
  paste
end

и для вставки вы увидите:

def paste(_ = nil)
  `pbpaste`
end

и очистите просто:

def clear
  copy ''
end

Это должно направить вас в правильном направлении.

1 голос
/ 20 февраля 2011

Это может выглядеть как уродливый обходной путь, но я уверен, что он будет работать:

Создайте исполняемый файл myfoobar.sh, содержащий строку, которую вы хотите выполнить.

#! /bin/sh
echo -n foobar | pbcopy

Затем вызовите этот файл из ruby.

0 голосов
/ 30 апреля 2013

Используйте sutil для правильной настройки:


    $ ssh-copy-id user@host

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...