You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Windows下使用Pandoc合并多个Markdown文件报错求助

解决Pandoc合并Markdown文件时*.md通配符失效的问题

问题重现

我在文件夹里有多个.md文件,想通过Pandoc合并成一个最终的Markdown文件,写了这样的bash脚本:

#!/bin/bash
pandoc *.md > final.md

双击运行时却报错:pandoc: *.md: openBinaryFile: invalid argument (Invalid argument),生成的final.md还是空的。但手动把所有文件名列出来执行pandoc file1.md file2.md ... > final.md时,就能得到正常的合并文件。

问题原因

核心问题是通配符*.md的展开逻辑
当你在终端手动敲命令时,终端的交互式shell会先把*.md解析成当前目录下所有.md文件的列表,再把这个列表传给Pandoc,所以Pandoc能正确找到所有文件。
但双击运行脚本时,桌面环境启动的是非交互式shell,它不会自动展开通配符,而是直接把字符串*.md传给Pandoc。Pandoc找不到名为*.md的文件,自然报错,也没有内容写入final.md

解决方案

这里给你几个靠谱的解决办法:

  • 优化脚本,显式处理文件列表
    如果你想让脚本在任何环境下都能正常工作,可以用bash数组来存储所有.md文件,避免通配符展开失败的问题,还能兼容带空格的文件名:

    #!/bin/bash
    # 把当前目录下所有.md文件存入数组
    md_files=(*.md)
    # 将数组元素作为参数传给pandoc
    pandoc "${md_files[@]}" > final.md
    

    要是你担心有隐藏的.md文件(文件名以.开头),可以改成:

    #!/bin/bash
    # 包含隐藏的.md文件
    shopt -s dotglob
    md_files=(*.md)
    pandoc "${md_files[@]}" > final.md
    
  • 用终端运行脚本
    最简单的办法:右键脚本文件,选择「在终端中运行」或者「用终端打开」。这样脚本会在交互式bash环境下执行,通配符会自动展开,和你手动敲命令的效果一样。

  • 确保脚本有可执行权限
    先在终端给脚本加上执行权限:

    chmod +x your_script_name.sh
    

    有些桌面环境会因为脚本没有可执行权限,用错误的程序打开它,导致通配符无法正常解析。加完权限后再双击试试,大概率能正常运行。

内容的提问来源于stack exchange,提问作者ziselos

火山引擎 最新活动