win10 上面执行 go 的命令偶尔一直提示不是可运行的程序

2019-06-28 16:03:29 +08:00
 Buffer2Disk

如题,操作系统是 win10,golang 的环境变量配置应该是没问题的

不知道为啥 执行 go 的命令,总是偶尔提示不是可运行的程序, 比如 go version , go build

然后把 cmd 窗口关掉,再打开又好了,然后过几天又出现了相同的问题

大家有碰到过这种情况吗?

试过 go 1.11 ,1.12 版本都有这个情况。

相同的机器上面,cmd 窗口 执行 java 命令就一直没有问题,稳如老狗

3729 次点击
所在节点    程序员
23 条回复
misaka19000
2019-06-28 16:12:01 +08:00
也许是 win10 的 bug
Buffer2Disk
2019-06-28 16:20:46 +08:00
@misaka19000 非常的蛋疼,我之前是一直配置在系统变量里面的;

我刚刚试了下在用户变量里面也配置了个,好像又正常了
holajamc
2019-06-28 17:06:33 +08:00
偶尔 一直
总是 偶尔
所以……
geelaw
2019-06-28 17:23:17 +08:00
@misaka19000 #1 微软真惨,什么锅都能被甩到自己头上

我来试试念力 debug 法:楼主说关掉 cmd 再打开就又正常了,一个简单的假设是有些程序修改了正在运行的 cmd 的(进程级别)环境变量,尤其是 PATH,例如可能会在 PATH 的开头追加一些目录(并且忘记判断是否 PATH 已经含有需要路径而无脑增加),但是环境变量的总长度有限制,所以随着修改的次数增加,go 所在的目录就被挤掉了。

要判断是否有此事发生,首先考虑是否在命令中有 .bat/.cmd ,这些最容易修改 cmd 的环境变量。找到目标后阅读代码寻找 set 命令。

另一种判断方法是写一个程序,它的作用是查看自己的环境变量并和一个磁盘上的存档对比,如果不同则发出提示,如果磁盘上没有则把自己的环境变量存到磁盘上。如果可以同时运行多个 cmd,那么这个程序应该根据自己父进程的 PID 决定哪一个存档应该被检查。

接着在所有的命令后都追加调用该程序,即可看出哪两个命令之间 cmd 的环境变量发生了变化,从而定位问题所在。
leon0903
2019-06-28 17:47:16 +08:00
@geelaw 这个回复感觉靠谱
Buffer2Disk
2019-06-28 17:59:34 +08:00
@geelaw 大兄弟,首先感谢你的回复,看起来非常有道理

但是,我的情况是,重新打开 cmd 就正常的几率非常低,大部分情况下,重新打开 cmd 还是老样子

有时候重新设置一下环境变量(一模一样的环境变量),又好了(不是每一次都能成功)

综上这么诡异的情况,所以无法判断到底是哪里出了问题

而且你看我也说了,相同的情况下,java 的命令是一直正常的,所以我都不知道这个锅该甩给微软还是 golang 了
Buffer2Disk
2019-06-28 18:04:47 +08:00
@geelaw 不过你给的方法不错,但是看起来很麻烦的样子,毕竟我不会写 bash = =
Buffer2Disk
2019-06-28 18:05:12 +08:00
@Buffer2Disk 打错,bash --> bat
geelaw
2019-06-28 18:13:51 +08:00
@Buffer2Disk #6 你一开始并没有提到重新打开正常的概率很低。(你真的读了自己写了什么吗?!

你说重新设置环境变量就好了,那么你查看不能运行的时候 cmd 的环境变量了吗?用 set 命令可以查看。另外除了 PATH 会影响结果,PATHEXT 也有很大影响。

从目前的信息来看,没有理由怀疑是 Windows 的问题。
Humorce
2019-06-28 18:18:53 +08:00
用 Administrator 登录的?
oneonesv
2019-06-28 18:23:50 +08:00
请先搞明白环境变量
unknowncheater
2019-06-28 19:03:40 +08:00
畢竟是三哥維護的系統,Bug 多正常
dandycheung
2019-06-28 20:36:50 +08:00
如果现实不是可运行的程序,说明可执行体已经找到了,而不能执行,是不是,硬盘出了什么读写不稳定的状况?
blless
2019-06-28 20:45:01 +08:00
好歹打印一下环境变量,然后确定环境变量下进入目录打印一下截图再来说嘛
Buffer2Disk
2019-06-28 21:57:18 +08:00
@oneonesv 大佬,请你来解释一下什么是环境变量
Buffer2Disk
2019-06-28 22:00:59 +08:00
@geelaw 嗯,确实描述没清楚,主要是我也没抓住问题的重点啊

目前设置了 用户变量 后,还没复现问题

下次要是问题复现了,我再用 set 命令打印看看
Buffer2Disk
2019-06-28 22:03:10 +08:00
@dandycheung 没有吧,java 的可执行体是放在同一个 E 盘下的,没问题
WordTian
2019-06-28 22:16:42 +08:00
你的环境变量里用了相对引用吗?
感觉 win10 加载环境变量好像是随机加载的。如果用了相对引用的话,可能是加载环境变量的时候,被引用的环境变量还没被加载导致的
Buffer2Disk
2019-06-28 22:17:58 +08:00
@WordTian 对,go 的是相对的;
但是 java 的也是相对的啊,一直都可以
WordTian
2019-06-28 22:28:20 +08:00
@Buffer2Disk 我的 java 和 python 环境变量也是因为这种情况时好时坏的,后来改成绝对路径就好了。不过感觉绝对路径还是不太方便

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/578349

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX