Как использовать pbcopy в функции bash? Можно ли заскриптовать?

Я часто копирую команды истории в буфер обмена, используя это:

echo !123 | pbcopy

Это отлично работает из терминала. Предполагая !123 = cd .., это выглядит примерно так:

$ echo !123 | pbcopy
echo cd .. | pbcopy
    //result: `cd ..` is in the clipboard

Чтобы упростить жизнь, я добавил эту функцию bash в свой .bashrc:

function pb() {
    echo $1 | pbcopy
}

В идеале эта команда должна вызываться так: pb !!. Однако это не работает. Вот что происходит:

$ pb !123
pb cd .. | pbcopy
    //result: `!!` is in the clipboard

Независимо от того, какую команду истории я вызываю, она всегда возвращает !! в буфер обмена. Я тоже пытался создать псевдоним, но у него та же проблема:

alias pb='echo !! | pbcopy'

Любые указатели?


person JP Lew    schedule 13.06.2013    source источник
comment
Знаете ли вы, что вы выполняете обратный поиск в истории, используя Ctrl-R.   -  person devnull    schedule 13.06.2013
comment
да. Однако это ничего не копирует в буфер обмена (для использования в других программах).   -  person JP Lew    schedule 13.06.2013


Ответы (2)


Ваша функция несколько неверна. Он должен использовать $@ вместо $1

то есть

function pb() {
    echo "$@" | pbcopy
}

Результат:

samveen@minime:/tmp $ function pb () { echo "$@" | pbcopy ; }
samveen@minime:/tmp $ pb !2030
pb file `which bzcat`
    //result: `file /bin/bzcat` is in the clipboard
samveen@minime:/tmp $

Чтобы объяснить, почему alias не работает, !! заключено в одинарные кавычки, а замена истории происходит, если !! не заключен в кавычки. Поскольку это замена истории команд, которая по определению является интерактивной, сохранить ее в переменных и псевдонимах очень сложно.

person Samveen    schedule 13.06.2013

Вы также можете использовать fc -l -1 или history -p '!!' для печати последней записи истории:

pb() {
  [[ $# = 0 ]] && local n=-1 || local n="$1 $1"
  fc -l $n | cut -d' ' -f2- | printf %s "$(cat)" | LC_CTYPE=UTF-8 pbcopy
}

Если LC_CTYPE равен C, pbcopy искажает символы, отличные от ASCII. Терминал и iTerm по умолчанию устанавливают переменные локали на что-то вроде en_US.UTF-8.

person Lri    schedule 13.06.2013