Windows下使用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




