单字母目录下Bash中awk简易计算器函数执行异常问题
问题原因与解决办法
哈哈,这个问题我太熟悉了!本质是你选的函数名?在bash里是个特殊角色——它是路径通配符,专门用来匹配任意单个字符。
当你在有单字母目录(比如示例里的B)的目录中输入? "1+2"时,bash会先执行「路径名扩展」操作:它会把?替换成当前目录中匹配的单字母文件名/目录名(也就是B),然后尝试执行B "1+2",自然就会弹出B: command not found的错误。而在没有单字母文件/目录的目录里,?找不到任何匹配项,bash才会把它当成你定义的函数名来执行,这时候就正常了。
给你几个靠谱的解决办法:
临时调用时规避通配符:每次调用函数时,给
?加转义或者引号,让bash别把它当成通配符:\? "1+2" # 或者 '?' "1+2"永久重命名函数(推荐):把函数名改成非通配符的名字,比如
calc,修改你.bashrc里的定义:calc () { awk "BEGIN{ pi=3.14159265359; printf \"%5.5f\n\", $* }" ; }修改完后执行
source ~/.bashrc让改动生效,之后直接输入calc "1+2"就不会有任何问题了。优化函数写法(更安全):你的函数还有个潜在风险——用双引号包裹awk脚本时,bash会提前解析里面的变量和特殊字符。换成单引号包裹awk脚本,再把参数通过
-v选项传递给awk,能避免很多意外问题:calc () { awk -v expr="$*" 'BEGIN{ pi=3.14159265359; printf "%5.5f\n", expr }' ; }
内容的提问来源于stack exchange,提问作者rnels12
相关产品推荐
相关产品推荐

