Shell函数内执行unzip命令报错‘Archive:: command not found’求助
问题根源与解决办法
这问题我之前帮同事排查过类似的,核心是你调用函数的方式踩了shell的小坑!
为什么会报错?
你用了$(wget_unzip "https://www.mylinktoagerritpatch.org/patch?zip")这种命令替换语法来调用函数,这是关键错误。
命令替换$(...)的作用是:把括号里命令/函数执行时输出到标准输出的所有内容,抓出来当成新的shell命令去执行。而unzip默认会打印一些日志信息(比如Archive: ./patch?zip),这些信息被$(...)捕获后,shell就傻呵呵地去执行Archive:这个“命令”——这玩意儿根本不存在,自然就报Archive:: command not found了。哪怕换成/usr/bin/unzip,unzip本身还是会输出这类日志,所以还是会触发类似的UnZip:: command not found错误。
而你在脚本主代码里直接跑unzip ./patch\?zip时,这些日志只是直接打印到终端,不会被当成命令执行,所以完全没问题。
怎么修复?
超级简单,把命令替换的语法去掉,直接调用函数就行:
#!/bin/sh function wget_unzip { wget "$1" # 给URL加双引号,避免特殊字符出问题 unzip "./patch?zip" # 用双引号包裹文件名,比反斜杠转义更清晰 } # 直接调用函数,不要加$(...) wget_unzip "https://www.mylinktoagerritpatch.org/patch?zip"
另外给两个小建议:
- 给
wget的参数$1加上双引号,防止URL里的?这类特殊字符被shell意外解析; - unzip的文件名用双引号包裹,比你原来的反斜杠转义更直观,也能避免文件名里的特殊字符出问题。
额外验证(可选)
如果你想确认我说的没错,可以临时改下脚本,把函数的输出存到文件里:
$(wget_unzip "https://www.mylinktoagerritpatch.org/patch?zip") > debug.txt
打开debug.txt就能看到unzip输出的那些日志行——这些就是shell尝试执行的“命令”,看完你就彻底明白为啥报错了。
内容的提问来源于stack exchange,提问作者qmastery
相关产品推荐
相关产品推荐

