在别名中执行 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 "¯\_(ツ)_/¯")'
我的 .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 "¯\_(ツ)_/¯")'