【问题标题】:Difference when executing bash function in an alias在别名中执行 bash 函数时的区别
【发布时间】:2018-11-10 05:20:41
【问题描述】:

我的.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 '¯\_(ツ)_/¯')

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

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

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

通过几乎完全的反复试验,我能够制作出我想要的功能的修改版本:

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)\" )"

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

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

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

我的问题是,这里发生了什么?为什么它们需要如此不同?

【问题讨论】:

    标签: bash alias


    【解决方案1】:

    免除别名并使用函数使这变得容易得多。

    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
    

    【讨论】:

    • 如果您指的是我的shrug 函数,那么定义别名shruggie 的好处为零;你只是分叉了一个额外的 shell 来运行可以在你当前 shell 中运行的东西。
    • chepner 在上面回复的评论说:“你也可以使用它来定义别名:alias shruggie="$(shrug)"
    • 但是如何在终端中使用它而不将其定义为别名?这样做的重点是要有终端别名
    • 函数只是一个命名命令。您不需要别名来引用它;你只是使用它。
    • 我重新定义了copyandprint 以实际进行复制和打印,而不是生成别名的正文。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-04
      • 1970-01-01
      • 2013-10-29
      • 1970-01-01
      相关资源
      最近更新 更多