如何定义zsh别名自动包裹Perl脚本calc.pl的表达式参数?
实现zsh别名自动为计算表达式添加单引号
我花了大量时间搜索都没找到解决方案。我正在使用一个天文相关的Perl脚本,它在命令行和脚本中进行计算时非常实用,但使用时必须手动转义括号:
calc.pl (1+1)/(2+2) zsh: unknown file attribute: 2 calc.pl \(1+1\)/\(2+2\) 0.5
更简便的替代方法是用单引号包裹整个表达式,这样就不用逐个转义:
calc.pl '(1+1) / (2+2)' 0.5
请问怎么定义zsh别名(比如alias calc="${HOME}/bin/calc.pl"),让调用该别名后传入的表达式自动被单引号包裹?
直接用别名无法实现这个需求,因为别名只是简单的字符串替换,不能处理参数的动态包裹。你需要定义一个zsh函数来替代别名:
calc() { "${HOME}/bin/calc.pl" "$*" }
把这段代码添加到你的~/.zshrc文件中,执行source ~/.zshrc生效后,就可以直接像下面这样调用:
calc (1+1)/(2+2) 0.5
这个函数会将你输入的所有参数合并成一个完整的字符串,用双引号包裹后传递给calc.pl,双引号会保留表达式中的括号等特殊字符,效果和手动加单引号一致。
如果你的表达式中包含单引号,可以改用更严谨的写法,确保特殊字符都被正确转义:
calc() { local expr="$*" "${HOME}/bin/calc.pl" "${expr//\'/\'\\\'\'}" }
内容的提问来源于stack exchange,提问作者GBelanger
相关产品推荐
相关产品推荐

