簡體   English   中英

Shell:pdfinfo 的輸入

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM