Как мне использовать 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'

Есть указатели?

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 не работает, !! находится внутри одинарных кавычек, и замена истории происходит, если !! не котируется Так как это замена истории команд, которая по определению является интерактивной, сохранение ее в переменные и псевдонимы очень сложно.

Вы также можете использовать 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. Terminal и iTerm по умолчанию устанавливают переменные локали в что-то вроде en_US.UTF-8.

Другие вопросы по тегам