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