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