在 bash 或 zsh 中直接传递含 `&`、`?`、`=` 等 shell 元字符的 url 会导致命令被错误拆分,引发后台作业(如 `[1] 51873`)和参数截断;解决方法是用单引号或双引号将整个 url 括起,避免 shell 提前解析。
当你在终端中运行类似 gophers -github_url=https://github.com/search?utf8=…&q=…&type=Users 的命令时,看似是在向 Go 程序传入一个完整 URL,实则 Shell(macOS 默认使用 Zsh,旧版为 Bash)会将 & 视为后台执行分隔符、将 ? 视为通配符、将空格视为参数分界——于是原始命令被拆解为多个独立进程:
gophers -github_url=https://github.com/search?utf8=%E2%9C%93 q=location%3A%22San+Fransisco%22+location%3ACA+followers%3A%3E100 type=Users ref=advsearch l=
这就是你看到 [1] 51873、[2] Done 等输出的原因:Shell 把 & 后的内容当作新命令在后台启动,而 Go 程序实际只收到了被截断的首段 URL(如 https://github.com/search?utf8=%E2%9C%93),后续参数完全丢失,甚至可能触发意料之外的网络请求或 panic。
✅ 正确做法:始终用引号包裹含特殊字符的 URL