V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Buffer2Disk
V2EX  ›  程序员

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

  •  
  •   Buffer2Disk · 2019-06-28 16:03:29 +08:00 · 3597 次点击
    这是一个创建于 1757 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

    23 条回复    2019-07-07 02:04:20 +08:00
    misaka19000
        1
    misaka19000  
       2019-06-28 16:12:01 +08:00
    也许是 win10 的 bug
    Buffer2Disk
        2
    Buffer2Disk  
    OP
       2019-06-28 16:20:46 +08:00
    @misaka19000 非常的蛋疼,我之前是一直配置在系统变量里面的;

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

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

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

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

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

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

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

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

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

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

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

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

    下次要是问题复现了,我再用 set 命令打印看看
    Buffer2Disk
        17
    Buffer2Disk  
    OP
       2019-06-28 22:03:10 +08:00
    @dandycheung 没有吧,java 的可执行体是放在同一个 E 盘下的,没问题
    WordTian
        18
    WordTian  
       2019-06-28 22:16:42 +08:00 via Android
    你的环境变量里用了相对引用吗?
    感觉 win10 加载环境变量好像是随机加载的。如果用了相对引用的话,可能是加载环境变量的时候,被引用的环境变量还没被加载导致的
    Buffer2Disk
        19
    Buffer2Disk  
    OP
       2019-06-28 22:17:58 +08:00
    @WordTian 对,go 的是相对的;
    但是 java 的也是相对的啊,一直都可以
    WordTian
        20
    WordTian  
       2019-06-28 22:28:20 +08:00 via Android
    @Buffer2Disk 我的 java 和 python 环境变量也是因为这种情况时好时坏的,后来改成绝对路径就好了。不过感觉绝对路径还是不太方便
    forcecharlie
        21
    forcecharlie  
       2019-06-29 07:00:47 +08:00 via iPhone
    这种问题基本上是环境变量设置顺序有关 如果相对路径的环境变量未在 path 之前设置开则不行, 然后再次 set path=%path% 则因那个环境变量已设置则可以在 path 之间展开 通过计算机属性设置环境变量通常要注意这个问题,这应该跟注册表有关。 如果你在 bat 文件中设置环境变量 则不会出现上述问题 bat 文件严格按照你预期的顺序初始化。
    Buffer2Disk
        22
    Buffer2Disk  
    OP
       2019-06-29 10:51:50 +08:00
    @forcecharlie java 和 go 的相对路径的环境变量都是在 path 之前设置开的。

    而且 go 的命令出问题的时候,我还进了 path 里面直接设置成绝对路径的,也不行
    WordTian
        23
    WordTian  
       2019-07-07 02:04:20 +08:00 via Android
    @Buffer2Disk 系统变量设完要重启啊,大兄弟
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2759 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 12:20 · PVG 20:20 · LAX 05:20 · JFK 08:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.