linux - 通过 Docker 调用 OCRmyPDF 的 bash 脚本的错误响应

标签 linux bash shell docker

EDIT(Update): 通过不断的搜索和测试,我发现问题似乎出在 $PWD (或 $(dirs -l) 或 $(pwd) ) 被 docker 解释为相对路径,尽管实际上是绝对路径。

然而,$PWD、$(dirs -l)、$(pwd) 的复制然后粘贴输出仍然可以完美运行。这个终端打印输出与 bash 传递给 docker 的相同变量有何不同?


请耐心等待,我对任何类型的脚本编写都很陌生。因此,我不仅确定此脚本中存在明显的冗余,而且我还可能遗漏了一些基本的东西。

我编写了一个小的 bash 脚本,试图将从 Docker 容器运行 OCRmyPDF 所需的冗长命令转换为更易于管理的命令。这是实现此目的的长命令(根据创建者的 github):

docker run -t -i -v "</path/to/pdfdir>:/home/docker/" paulstaab/ocrmypdf \  
OCRmyPDF <additional options> <pdf> <out.pdf>

我的目标是制作一个名为 ocrmypdf 的脚本,它将采用一个命名的 .pdf 和任何指定的参数,对 pdf 文件进行 OCR,并输出一个带有原始名称的文件'_ocr' 尾部。

这是我对 bash 脚本的尝试(脚本名称 - ocrmypdf):

#!/bin/bash
#docker ocrmypdf ease-of-use script

BASENAME=$(basename "$1")
BASENOSUFFIX=$(basename -s .pdf "$1")
DIRECTORY=$(dirs -l):/home/docker/
docker run -t -i -v \"$DIRECTORY\" paulstaab/ocrmypdf \ OCRmyPDF $2 \"$BASENAME\" \""$BASENOSUFFIX"_OCR.pdf\"

我知道在这么简单的脚本中可能不一定需要变量,但我在进行故障排除时已经实现了它们。

问题是,当我运行脚本时,专注于我知道该程序能够进行 OCR 的 .pdf 文件,我返回了错误:

FATA[0000] Error response from daemon: cannot bind mount volume: "/home/blue/Documents/PDF/Massumi/1995 volume paths must be absolute.

但是,令我困惑的是,如果我“回显”脚本的最后一行“docker run -t ...”,回显 输出在复制到终端时会完美运行.例如,...的输出 (最后一行回显)

./ocrmypdf test.pdf -f

是('-f' 强制 ocrmypdf 对 .pdf 进行 ocr 而不管已经扫描的文本)

docker run -t -i -v "/home/blue/Documents/PDF/Massumi/1995:/home/docker/" paulstaab/ocrmypdf  OCRmyPDF -f "test.pdf" "test_OCR.pdf"

其中,如果粘贴回终端,则成功对“test.pdf”进行 OCR。但是,当脚本在没有最后一行 echoed 的情况下运行时,我收到上面列出的“无法绑定(bind)安装卷”错误。

最佳答案

我认为问题在于您的 DIRECTORY 变量。 尝试在声明中的 : 前面放一个反斜杠,例如 DIRECTORY=$(dirs -l)\:/home/docker/。 为了安全起见,您应该始终将变量用双引号引起来,在这种情况下,您的 中的 $DIRECTORY$2$BASENAME docker 命令。

关于linux - 通过 Docker 调用 OCRmyPDF 的 bash 脚本的错误响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30207983/

相关文章:

linux - mv: 无法统计错误

mysql - 如何编写通过 SSH 通过 TCP/IP 连接到 mysql 的脚本?

linux - 在/dev 文件上设置 root-only 权限并构建二进制文件

shell - 使用 UNIX 命令替换 csv 中的字符或修复不正确的换行符

c - 如何在其他笔记本电脑上运行在我的笔记本电脑gcc环境中创建的可执行文件a.out?

c - 如何用socket地址获取自己的IP地址?

linux - 就地编辑文件

linux - 使用 Team Explorer Everywhere 命令行 Linux 在不下载所有项目的情况下在 TFS 中创建一个新的高级文件夹

bash - shell 脚本: Copy Multiple Files and add Timestamp

linux - 通过 ENTER 或 ESC 等键在 bash 中创建中断