登录
首页 >  Golang >  Go问答

执行 exec.Command("iconv", ...) 后文件为何不显示?

来源:stackoverflow

时间:2024-02-07 16:30:24 344浏览 收藏

从现在开始,我们要努力学习啦!今天我给大家带来《执行 exec.Command("iconv", ...) 后文件为何不显示?》,感兴趣的朋友请继续看下去吧!下文中的内容我们主要会涉及到等等知识点,如果在阅读本文过程中有遇到不清楚的地方,欢迎留言呀!我们一起讨论,一起学习!

问题内容

我正在尝试转换文件的编码,但结果文件没有出现。控制台命令正确运行。

func main() {
    from := "WINDOWS-1251"
    filename := "3_win1251.csv"
    cmd := exec.Command("iconv", fmt.Sprintf("-f %s", from), fmt.Sprintf("-t UTF-8//TRANSLIT %s", filename), fmt.Sprintf("-o ./convert_%s", filename))
    // command: /usr/bin/iconv -f WINDOWS-1251 -t UTF-8//TRANSLIT 3_win1251.csv -o ./convert_3_win1251.csv
    log.Println(cmd.String())
    err := cmd.Run()
    if err != nil {
        log.Fatal(err)
    }

    log.Println(cmd.ProcessState)
}

结果:exit 状态 0 且缺少文件。

文件:3_win1251.csv

操作系统:debian 11


正确答案


值得一提的是,strace 是诊断此类问题的完美工具:

$ strace iconv -f windows-1251 -t utf-8//translit 3_win1251.csv -o ./convert_3_win1251.csv 2>&1 | grep -f execve
execve("/usr/bin/iconv", ["iconv", "-f", "windows-1251", "-t", "utf-8//translit", "3_win1251.csv", "-o", "./convert_3_win1251.csv"], 0x7fffeed6e768 /* 55 vars */) = 0

比较:

$ strace -f ./main 2>&1 | grep -f execve
execve("./m", ["./m"], 0x7ffd85261008 /* 55 vars */) = 0
[pid 2745776] execve("/usr/bin/iconv", ["iconv", "-f windows-1251", "-t utf-8//translit 3_win1251.csv", "-o ./convert_3_win1251.csv"], 0xc0001ba000 /* 55 vars */ 
[pid 2745776] <... execve resumed>)     = 0

很容易发现参数是不同的。请注意,-f 选项会导致其跟踪子进程。

在windows上,我们可以使用进程监视器工具。让我们借用问题 exec with doublequoted argument 中的命令。

cmd.exe中运行时:

find "SomeText" file.txt

命令行find“sometext”文件.txt(见下面的截图)。

但是当使用exe.command运行时,命令行find \"sometext\" file.txt(见下面的截图)。 " 被错误地转义。正如该问题的答案所建议的,解决方案是直接设置整个命令行。

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>