无需预先保存文件,如何执行附加二进制数据的自解压Bash脚本?
无需预先保存文件,如何执行附加二进制数据的自解压Bash脚本?
我太懂这个困扰了!你之前用/bin/bash -c "$(curl -fsSL https://<omitted>/script.sh)"行不通,核心问题在于脚本里的tail -n+$ARCHIVE_START_LINE $0完全依赖$0指向包含完整二进制数据的脚本文件,但这种执行方式下$0要么是bash进程本身,要么只是个字符串参数,根本读不到末尾的归档数据。
给你两个更简洁的替代方案,都不用手动创建临时文件:
方案一:用进程替换(最推荐)
bash <(curl -fsSL https://<omitted>/script.sh)
bash的<(command)语法会把curl拉取到的完整内容(脚本+二进制)放到一个临时的文件描述符里(比如/dev/fd/123),然后bash会把这个描述符当作本地脚本文件来执行。此时$0就指向这个包含全部内容的“虚拟文件”,tail就能精准定位到后面的归档数据,完美复刻本地执行脚本的逻辑。
方案二:直接管道结合/dev/stdin
如果你的环境对进程替换支持有限(比如老版本bash),可以试试这个:
curl -fsSL https://<omitted>/script.sh | exec bash /dev/stdin
这里我们让bash直接从标准输入读取脚本内容,同时exec确保$0指向/dev/stdin——curl已经把完整的脚本+二进制数据输出到管道里,当执行到tail命令时,剩下的归档数据还在标准输入流里,tail就能顺利提取。
对比你原来的临时文件方案,这两种方式更简洁,也避免了手动清理临时文件的麻烦。
备注:内容来源于stack exchange,提问作者Edward Ruchevits
相关产品推荐
相关产品推荐

