要在 Mac 快捷指令中读取本地 Markdown 文件的内容,请先将文件输入转换为文本再使用。用一个可丢弃的示例检查结果;如果转换失败,请使用 cat 读取文件,并将其内容通过管道传入快捷指令。

本指南介绍如何在 Finder 中选择一个本地 Markdown 文件,并显示其原始文本,包括标题标记和列表标点。关键是区分三者:所选文件、文件路径,以及文件中存储的文本。

为什么快捷指令收到的是文件,而不是文件中的文本?

Finder 提供的是文件输入。Apple 将 Files 和 Text 定义为快捷指令中两种不同的输入类型:文件可以是任何类型的文档,而文本是不带格式的纯文本。因此,接收 Markdown 文件本身并不能保证下一个操作会将其内容作为文本接收。了解 Mac 快捷指令中的输入类型。

当操作需要不同类型的数据时,快捷指令会使用其内容图进行类型转换。Apple 也介绍了一种明确的控制方式:点按变量标记并更改其 Type。这种转换不同于选择文件名之类的属性。文件名或路径仍然只是对文件的描述。内容图引擎、在 Mac 快捷指令中调整变量。

Apple 引用的指南介绍了转换机制,但并未保证所有扩展名为 .md 的文件都会转换成其原始文本。请用已知内容验证转换结果。如果原生转换没有得到预期文本,下面的命令行方法会提供一条明确的文件读取路径。

创建一个内容已知、可丢弃的 Markdown 文件

使用这个合成样例,避免把文件名误当作读取成功的证据。将完整设置命令粘贴到终端中。它会创建一个新的临时目录,写入一个示例文件,并在 Finder 中打开该目录。

demo_dir=$(/usr/bin/mktemp -d /tmp/markdown-shortcuts.XXXXXX) &&
printf '%s\n' '# Sample board' '' '- Blue square' '- Green circle' > "$demo_dir/sample.md" &&
/usr/bin/open "$demo_dir"

预期的文件内容如下:

# Sample board

- Blue square
- Green circle

-d 选项告诉 mktemp 创建目录,末尾的 X 字符允许它选择一个唯一名称。因此,每次成功运行设置命令都会得到一个新的目录。如果创建失败,&& 链会阻止后续命令运行。Apple 提供了相关的 mktemp 手册。

printf 命令会写入合成示例的各行内容,包括空行。其输出重定向会在新目录中创建 sample.md。普通的 > 重定向可能覆盖已有文件,因此请保留此设置原样,不要将目标改为已有文档。这个示例通过新目录避免名称冲突。Apple 的 printf 手册、Shell 输入和输出。

创建一个明确请求文本的 Finder 快捷指令

创建一个名为 Read Markdown Text 的快捷指令。Apple 介绍了如何使用工具栏中的添加按钮创建快捷指令、为其命名,并从操作库添加操作。在 Mac 上创建自定义快捷指令。

设置 Finder 入口:

  1. 打开快捷指令的 Details 面板。
  2. 启用 Use as Quick Action,并选择 Finder。
  3. 在编辑器顶部的输入区块中允许 Files 和 Text。Files 支持 Finder 工作流;Text 则供下方的终端备用方法使用。
  4. 对于缺失的输入,选择 Stop and Respond,并输入 Select one example Markdown file.

Apple 介绍了 Finder 选项,并指出可能需要文件或文件夹输入才能启用它。其输入配置也支持在没有收到输入时停止并返回响应。在 Mac 上工作时运行快捷指令、限制快捷指令的输入。

现在添加处理内容的操作:

  1. 添加一个 Text 操作。
  2. 在其文本栏中只放入 Shortcut Input 变量。
  3. 点按该变量标记,打开其 Type 菜单,然后选择 Text。不要选择文件名属性。
  4. 在 Text 操作之后添加 Quick Look,并使用 Text 操作的输出。

明确地转换变量类型,就能在使用输入时请求文本。后续的 Text 操作输出就是接下来文本处理步骤要使用的值。Apple 介绍了如何通过变量编辑器更改变量类型。在 Mac 快捷指令中调整变量。

要确认你所安装版本的行为,请按住 Control 键并点按某个操作的图标,然后选择 Show Info。Apple 说明这是检查操作可接受的输入及其输出的方式。调整包含多个文件变量和文本变量的现有快捷指令时,这尤其有用。在 Mac 快捷指令中浏览操作列表。

在 Finder 中,只选择 sample.md,按住 Control 键并点按它,然后依次选择 Quick Actions 和 Read Markdown Text。Apple 介绍了这种运行方式。如果找不到该快捷指令,请先检查其 Finder 设置和可接受的输入类型。在 Mac 上工作时运行快捷指令。

成功的结果会包含 # Sample board 和两个列表项。只看到 sample.md 或其目录路径都不能通过此检查。Apple 建议在操作之间放置 Quick Look,以检查快捷指令中传递的内容。在 Mac 快捷指令中测试操作。

如果转换失败,先读取文件内容,再调用快捷指令

使用终端明确执行读取操作。Apple 的终端指南指出,cat 可用于查看文本文件内容。其快捷指令命令行指南区分了通过 -i 提供的文件输入,以及通过管道提供的文本。在 Mac 终端中查看文本文件、从命令行运行快捷指令。

以下命令是前面设置示例的后续步骤,并非独立程序。在设置成功后,于同一个终端标签页中运行,并确保快捷指令已保存为准确名称 Read Markdown Text:

(
    set -o pipefail

    if [ -f "$demo_dir/sample.md" ] && [ -r "$demo_dir/sample.md" ]; then
        /bin/cat "$demo_dir/sample.md" |
            /usr/bin/shortcuts run "Read Markdown Text"
    else
        printf '%s\n' 'The example file is missing or unreadable.' >&2
        exit 1
    fi
)

这里,cat 会读取文件,并将其内容写入标准输出。管道会将这些内容传递给快捷指令。给路径加上引号可确保它作为一个整体参数传入。-f 和 -r 检查要求文件存在、是普通文件且可读。命令行入门、Apple 的 test 手册。

括号会将对 shell 选项的更改限制在这个命令组内。pipefail 会使管道中某个阶段的失败反映在命令组的退出状态中。前置检查无法保证文件在之后读取时仍然可用;如果 cat 遇到读取错误,请检查该错误,不要将不完整的预览当作完整结果。

这种备用方法会将传入快捷指令的内容从文件改为文本。它不会重命名 Markdown 文件,也不会创建转换后的文档。现有的 Text 和 Quick Look 操作可以检查传入的文本。

以下三种命令形式含义不同:

命令形式 快捷指令收到的内容
shortcuts run "Read Markdown Text" -i "$demo_dir/sample.md" 文件输入;仍需在快捷指令内进行转换。
printf '%s\n' "$demo_dir/sample.md" | shortcuts run "Read Markdown Text" 以文本形式传入的路径名。
cat "$demo_dir/sample.md" | shortcuts run "Read Markdown Text" 通过标准输入传入的文件内容。

此表说明了 Apple 所介绍的区别:使用 -i 传递文件路径,使用管道传递文本。管道前执行的操作决定了该文本是路径名还是文档正文。从命令行运行快捷指令。

添加更多操作前,先诊断结果

用已知样例判断需要修正什么:

  • 只显示文件名: 检查变量是否提取了名称属性,而不是请求文本。
  • 只显示路径: 检查命令是否打印了路径,而不是读取文件。
  • 原生转换失败,但终端方法可用: 对此工作流使用明确的读取方法;只更改输入标签并不能解决转换问题。
  • 没有收到输入: 从已选中的 Finder 文件运行,或使用文档介绍的终端命令。在程序坞中启动快捷指令不会自动传入所选文件。
  • 源内容为空: 对照样例检查。有效的空文件和不存在的文件是不同情况。

Apple 将变量属性与内容类型转换分开介绍,并指出从程序坞启动的快捷指令可能没有收到初始输入。这些区别有助于在更改后续操作之前找到问题所在。在 Mac 快捷指令中调整变量、限制快捷指令的输入。

测试时,请将工作流限制在一个小型本地文本文件内。选择多个文件时,需要另行决定是逐个处理,还是合并其内容。此示例用于获取可读取的源文本,并非逐字节复制文件的流程。

预览中出现预期的标题和列表行后,将后续文本处理操作连接到 Text 操作的输出。保留合成样例,直到整个流程正常工作,然后在 Finder 中删除其临时目录。关键检查很简单:下一个操作必须收到你已验证过的文档正文。

来源