[英]Shell: input for pdfinfo
在一条fish
上 shell 我写
ls -1t|head -1 |xargs pdfinfo
这基本上应该给我最新修改的文件(这是一个 PDF),然后打印这个文件的 PDFinfo。 但不知何故它因错误而失败
Syntax Warning: May not be a PDF file (continuing anyway)
Syntax Error: Couldn't find trailer dictionary
Syntax Error: Couldn't find trailer dictionary
Syntax Error: Couldn't read xref table
我得到与bash
相同的结果。 任何想法我需要适应什么才能运行命令?
这个问题很可能是由于xargs
对其输入进行了处理。
默认情况下,它将执行类似 bash 的分词,包括引号。
例如
echo "foo 'bar baz'" | xargs printf '<%s>\n'
将打印<foo>
和<bar baz>
,因为它会执行
printf '<%s>\n' foo 'bar baz'
这意味着如果你有一个带有空格或引号的文件名,它会执行错误的事情。 假设打印最新文件的“ls -1t | head -n 1”出现“foo bar.pdf”,那么它会像这样执行pdfinfo
pdfinfo foo bar.pdf
给它两个单独的文件名,“foo”和“bar.pdf”。
在这种情况下,最简单的解决方案是完全跳过 xargs:
pdfinfo (ls -1t | head -n 1)
您还可以使用鱼的切片来跳过head
:
pdfinfo (ls -1t)[1]
这只会采用ls -1t
s output 的第一行。请注意,fish 仍将在换行符处拆分(与 bash 不同,它不会在空格或制表符处拆分),因此如果您想使用换行符处理文件名(这通常会发生在 unix 上!)你必须以不同的方式来做 - 如果文件名可以包含换行符,则ls
output 是不明确的。 可能性包括使用-exec
find
。
如果你必须使用 xargs,你可以使用一些 xargs 实现中可用的-0
选项,连同 fish 的string join0
添加一个 NUL 字节:
ls -1t | head -n1 | string join0 | xargs -0 pdfinfo
这将告诉 xargs 禁止其单词拆分,而是读取 arguments NUL 终止(这是明确的,因为 UNIX 文件名和命令行 arguments 通常不能包含 NUL - 因为它将它们作为 NUL 终止的字符串传递)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.