在别名中执行bash函数时的区别

时间:2018-11-09 20:31:23

标签: bash alias

我的.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"
}

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

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

$ shrug #=> 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 :(得分:2)

免除了别名并使用函数使此操作变得更加容易。

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

答案 1 :(得分:0)

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

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