Разница при выполнении bash-функции в псевдониме - PullRequest
0 голосов
/ 09 ноября 2018

В моем .bash_profile есть функция для печати текста предварительно написанного текста и его копирования в буфер обмена.

copyandprint () {
    s='\\033[1;32m' #strong
    n='\\033[0m'    #normal
    printf -- "printf -- '$1' | pbcopy;" #pbcopy copies to clipboard in macOS
    printf -- "echo -e copied '${s}$1${n}' to clipboard"
}

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

alias shrug=$( copyandprint '¯\_(ツ)_/¯')

image copied ¯_(ツ)_/¯ to clipboard">

Но когда я хотел использовать его с текстом, сгенерированным в то время, когда я использую псевдоним , я не могу просто вызвать его в определении псевдонима; псевдоним должен вызывать его.

alias copydate=$( copyandprint "$(date)" )

the time is from when the script was first executed, not when the alias was used

Значение генерируется при запуске сценария, а не при использовании псевдонима.

Через довольно много проб и ошибок я смог сделать модифицированную версию функции, которая делает то, что я хотел:

copyandprint_live () {
    s='\\033[1;32m' #strong
    n='\\033[0m'    #normal
    printf -- "$1" | pbcopy
    printf -- "echo -e copied ${s}$1${n} to clipboard"
}
alias copydate_live="\$( copyandprint_live \"\$(date)\" )"

date generated at time alias is used

Дата генерируется во время использования псевдонима, а не во время выполнения сценария.

Но когда я использую эту функцию так же, как и другую, она не работает:

alias shrug_2=$( copyandprint_live '¯\_(ツ)_/¯')
$ shrug_2
#=> -bash: syntax error near unexpected token `ツ'

И я пытался поставить двойные кавычки, но это не сработало

alias shrug_3=$( copyandprint_live '"¯\_(ツ)_/¯"')
$ shrug_3
#=> copied 033[1
#=> -bash: 32m¯\_(ツ)_/¯033[0m: No such file or directory

Мой вопрос: что здесь происходит? Почему они должны быть такими разными?

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Вы вызываете функцию, когда определяете псевдонимы, а не когда используете их. Вам нужно поместить определение псевдонима в одинарные кавычки, чтобы $(...) не выполнил команду в это время.

alias shrug='$( copyandprint "¯\_(ツ)_/¯")'
0 голосов
/ 09 ноября 2018

Избавление от псевдонимов и использование функций делает это намного проще.

copyandprint () {
  printf '%s' "$1" | pbcopy
  printf 'copied \033[1;32m%s\033[0m to clipboard\n' "$1"
}

shrug () {
  copyandprint '¯\_(ツ)_/¯'
}

copydate () {
  copyandprint "$(date)"
}

Функции работают аналогично любой другой команде:

$ foo () { echo hi; }
$ foo
hi
...