在别名中执行 bash 函数时的差异

Difference when executing bash function in an alias

我的 .bash_profile 中有一个功能,用于打印一些预先编写的文本并将其复制到剪贴板。

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

我用它来为我一直想粘贴到其他应用程序中的东西起别名,例如静态 ID,或者只是难以在键盘上快速键入的愚蠢东西。

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

但是当我想将它与生成的文本一起使用时 在我使用别名 时,我不能只在别名定义中调用它;别名需要调用它。

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

该值是在脚本为 运行 时生成的,而不是在使用别名时生成的。

通过大量的反复试验,我能够制作出满足我要求的函数的修改版本:

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

日期是在使用别名时生成的,而不是在执行脚本时生成的。

但是当我像使用另一个函数那样使用那个函数时,它失败了:

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

我的问题是,这是怎么回事?为什么他们需要如此不同?

放弃别名并使用函数使这变得容易得多。

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

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

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

功能与任何其他命令类似:

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

您是在定义别名时调用函数,而不是在使用别名时调用函数。您需要将别名定义放在单引号中,以防止$(...)当时执行命令。

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