.desktop文件拖拽触发bash脚本不执行pdfseparate命令问题
Linux桌面拖拽拆分PDF功能异常问题排查与解决
需求背景
要实现的功能为:将多页PDF拖放到.desktop桌面快捷方式上,自动拆分出生成各页对应的单页PDF。手动直接执行bash脚本时功能完全正常,但将文件拖放到.desktop文件上触发执行时,仅pdfseparate命令不执行,其余日志打印逻辑均正常。
运行环境:Linux Mint 20 + Mate桌面
相关配置代码
.desktop文件代码
#!/usr/bin/env xdg-open [Desktop Entry] Encoding=UTF-8 Name=Test Comment=Drag a multipage pdf to seperate it into single pages. Exec=mate-terminal -e "/home/spoolserver/Desktop/pdfsepfiles/extractpages.sh \"%u\"" #Exec=mate-terminal -e /home/spoolserver/Desktop/pdfsepfiles/extractpages.sh %U Icon=/home/spoolserver/Desktop/pdfsepfiles/old/pdfsep1.svg Type=Application Terminal=true Name[en_US]=Separate pdf pages.desktop
extractpages.sh 脚本代码
#!/bin/bash thefile="$1" #thefile=/home/spoolserver/Desktop/pdfsepfiles/PIO11082021A.pdf thename="$(basename "$thefile")" #not excluding the extension thebasename="${thename%.*}" #excluding the extension thepath=$(dirname "$thefile") thenewname="$thebasename"'%02d.pdf' echo "thefile is $thefile" >> /home/spoolserver/Desktop/pdfsepfiles/test.log echo "$1" >> /home/spoolserver/Desktop/pdfsepfiles/test.log echo "thepath is $thepath" >> /home/spoolserver/Desktop/pdfsepfiles/test.log echo "thenewname= $thenewname" >> /home/spoolserver/Desktop/pdfsepfiles/test.log echo "The command is pdfseparate $thefile $thepath/$thenewname'" >> /home/spoolserver/Desktop/pdfsepfiles/test.log echo "-------------------------" >> /home/spoolserver/Desktop/pdfsepfiles/test.log pdfseparate "$thefile" "$thepath"/"$thenewname'"
排查过程
初步运行日志
thefile is '/home/spoolserver/Desktop/pdfsepfiles/PIO1102021A.pdf' '/home/spoolserver/Desktop/pdfsepfiles/PIO1102021A.pdf' thepath is '/home/spoolserver/Desktop/pdfsepfiles thenewname= PIO1102021A%02d.pdf The command is pdfseparate '/home/spoolserver/Desktop/pdfsepfiles/PIO1102021A.pdf' '/home/spoolserver/Desktop/pdfsepfiles/PIO1102021A%02d.pdf' -------------------------
Bash脚本排错方法
在需要排查的命令后追加2>> 日志文件路径,即可捕获命令的标准错误输出到指定日志。本次排查捕获到的报错如下:
I/O Error: Couldn't open file '"/home/ftpusers/Pioneer/PIO11182021B.pdf"': No such file or directory. Syntax Error: Could not extract page(s) from damaged file ('"/home/ftpusers/Pioneer/PIO11182021B.pdf"')
问题根因与解决方案
根因
.desktop文件Exec行中%u周围的\"属于多余转义引号,会给传入脚本的文件路径额外包裹一层双引号,导致系统识别路径时将引号也作为路径的一部分,无法匹配到真实存在的文件。
解决方案
将.desktop文件的Exec行修改为如下内容,删除%u周围多余的转义引号即可:
Exec=mate-terminal -e "/home/spoolserver/Desktop/pdfsepfiles/extractpages.sh %u"
Bash脚本通用排错技巧
- 开启调试模式:在脚本开头添加
set -x,运行时会打印所有执行的命令和变量展开结果,可直观校验参数是否符合预期 - 分流日志:将标准输出和标准错误分开存储,
命令 >> run.log 2>> error.log,分别记录正常输出和报错信息 - 变量前置校验:关键变量在使用前先打印到日志,确认变量赋值、展开是否正常
内容的提问来源于stack exchange,提问作者beckersj
相关产品推荐
相关产品推荐

