Golang中cmder的奇怪行为问题探讨

Golang中cmder的奇怪行为问题探讨 我刚接触Go语言,基本上算是编程新手。 我注意到在运行编译为exe的Go程序时,cmder的bash会话出现了奇怪的行为。 我把程序放在Windows文件夹里。 这个程序只是计算文本的md5sum,命令行参数就是文本内容。 当我在cmd或cmder/cmd会话中运行程序时,它能按预期运行。 但如果我在cmder/bash会话中运行,系统会告诉我没有这样的文件或目录。它把参数当成了路径。 为什么会这样?我之所以问这个问题,是因为使用bash语法对我来说更方便。

9 回复

我会记住的。谢谢。

更多关于Golang中cmder的奇怪行为问题探讨的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Mac或Linux系统上这些操作会更简单。你尝试过这些平台吗?

让我们等待原帖作者提供更多信息。否则很难判断问题出在哪里。

尽管我总是更喜欢Linux而不是Windows或macOS,但建议使用不同的操作系统并不能解决当前的问题。

实际上,问题似乎在于用户不理解计算机上不同工具如何协同工作。这个问题可能发生在任何操作系统上,并非Windows独有。

我不太确定需要提供哪些信息。我现在使用的是 Windows 10 x64 系统。我计划安装 Linux 系统,但需要安装在另一块硬盘上,这需要我另外购买。我更喜欢 Linux,但不得不在 Windows 环境下工作。

我没有修改过 .bashrc 或其他任何配置文件。昨天我安装了 WLS,最终应该可以使用它。只要我弄清楚如何访问计算机的文件夹和文件就能开始使用了。

快速搜索后我发现 C 盘位于 /mnt 目录下。这么明显的事情我居然没想到 😄

我不确定是否完全理解你的意思……你说的"我把程序放进了Windows文件夹"是指什么?你这里指的是 C:\Windows 吗?请把它从那里移除,那是操作系统的空间,你不应该去改动。

从你描述的其他情况来看,这似乎是两个环境中 PATH 变量的差异问题。通常情况下,bash 会继承父环境(在你这里就是Windows系统)的 PATH,至少如果你使用的是像cygwin或"git for windows"这样的POSIX兼容层的 bash 的话。不过你可能在 .bashrc 中覆盖了它。

但如果你使用的是WSL的 bash,那么它有自己的环境,完全不会从Windows继承,因为它是一个"真正的"Linux系统,反正也无法运行Windows二进制文件。

wavic: 我不太确定需要提供哪些信息。我现在使用的是Windows 10 x64系统。我计划安装Linux系统,但会装在另一块硬盘上——这还需要我另外购买。我更喜欢Linux,但不得不在Windows环境下工作。

已了解,请记住Go程序需要针对部署操作系统进行交叉编译。

wavic: 我昨天安装了WLS(Windows Linux子系统),最终应该可以使用。只要我弄清楚如何访问计算机的文件夹和文件。 快速搜索后我发现C盘位于/mnt目录下。这么明显的事情我居然没想到。

据我理解,WLS是一个不同的系统。你需要编译为linux/amd64目标平台并尝试运行。

// 示例代码:设置交叉编译目标平台
// GOOS=linux GOARCH=amd64 go build main.go

这听起来像是一个构建架构问题。据我理解:

  1. 编译后的二进制文件适用于 windows/amd64(我假设你在Windows系统上操作)
  2. cmder/bash 应该在Unix架构下运行,这意味着有很多架构可以选择。(建议使用 linux/amd64
  3. cmd 在Windows架构下运行,因此现有的二进制文件可以正常工作。

尝试交叉编译到 linux/amd64 并使用 cmder/bash 来查找新的二进制文件。你需要设置 GOARCH=linux/amd64

我之前在这里写过一份指南:https://sites.google.com/view/chewkeanho/guides/go/build。但是我没有提供Windows命令行交叉编译的方法。你可能需要自己探索一下。

关键词:交叉编译,GOARCH


注意:由于你的问题提供的信息有限,我的理解可能不正确。

在Go语言中,当程序在cmder/bash会话中出现参数被当作路径处理的问题时,通常是由于bash对命令行参数的解释方式与cmd不同,特别是在处理特殊字符(如空格或路径分隔符)时。这可能导致Go程序接收到的参数与预期不符,从而引发错误。

以下是一个简单的Go程序示例,它计算输入文本的MD5哈希值。我们将讨论如何确保参数在不同环境中正确传递。

package main

import (
	"crypto/md5"
	"encoding/hex"
	"fmt"
	"os"
)

func main() {
	// 检查命令行参数数量
	if len(os.Args) < 2 {
		fmt.Println("Usage: program <text>")
		os.Exit(1)
	}

	// 获取第一个参数作为输入文本
	text := os.Args[1]

	// 计算MD5哈希
	hash := md5.Sum([]byte(text))
	hashStr := hex.EncodeToString(hash[:])

	// 输出结果
	fmt.Printf("MD5 hash of '%s': %s\n", text, hashStr)
}

在cmder/bash中运行此程序时,如果参数包含空格或特殊字符,bash可能会将其解释为路径或进行其他处理。例如,在bash中,如果参数未正确引用,./program hello world 会将 helloworld 作为两个单独的参数传递,而Go程序的 os.Args[1] 只会捕获 hello,导致行为异常。

要解决此问题,在bash中运行程序时,确保将参数用双引号括起来,以防止bash对参数进行分割或路径扩展。例如:

./program "your text here"

这能保证Go程序接收到完整的字符串作为单个参数。如果问题仍然存在,检查程序是否位于bash的PATH环境变量中,或使用绝对路径运行程序。例如:

/path/to/your/program "your text"

在Windows环境中,cmder/bash可能使用不同的路径解析规则,因此确保程序路径和参数格式一致。如果程序编译为exe并放在Windows系统文件夹中,在bash中运行时,可能需要指定完整路径,如 /c/Windows/yourprogram.exe "text",以避免bash将其误认为相对路径。

总之,问题根源在于bash对命令行参数的处理差异。通过正确引用参数和验证路径,可以确保Go程序在cmder/bash中正常运行。

回到顶部