如何讓管道等待文件結束或在出錯後停止?
在觀看有關管道惡作劇的影片後,我嘗試了以下命令。
man -k . | dmenu -l 20 | awk '{print $1}' | xargs -r man -Tpdf | zathura -
它基本上將手冊頁列表列印到 dmenu 供使用者選擇其中一個,然後使用 xargs 執行
man -Tpdf %
(從 xargs 的輸入列印到標準輸出手冊頁 git 的 pdf)並將 pdf 傳遞給 pdf 閱讀器(zathura )。問題是(正如您在影片中看到的那樣)pdf 閱讀器甚至在我在 dmenu 中選擇一個聯機幫助頁之前就開始了。如果我點擊 Esc 並選擇無,pdf 閱讀器仍然打開,根本沒有顯示任何文件。
如何使 pdf 閱讀器(以及管道鏈中的任何其他命令)僅在其輸入到達文件末尾或完全接收到輸入時執行?或者,或者,如何使管道鏈在其中一個連結命令返回非零退出狀態後停止(這樣如果 dmenu 由於未選擇選項而返回錯誤,則以下命令不會執行)?
如何使 pdf 閱讀器(以及管道鏈中的任何其他命令)僅在其輸入到達文件末尾或完全接收到輸入時執行?
有
ifne
(在 Debian 中它在moreutils
包中):
ifne
當且僅當標準輸入不為空時執行以下命令。在你的情況下:
… | ifne zathura -
Pdf 文件應該是可搜尋的;任何 pdf 查看器都必須首先查看預告片,然後從那裡跳轉到外部參照表的偏移量。
由於管道不可搜尋,
zathura
因此使用了混淆技巧,將所有輸入複製到臨時文件,然後像往常一樣使用該臨時文件。這種“聰明”的把戲正在製造虛假的希望,並導致人們認為 pdf 文件是可流式傳輸的。但無論如何,在顯示文件之前
zathura
確實會等待 EOF,您無需為此做任何事情:(sleep 10; cat file.pdf) | zathura - # will really show the content of file.pdf after 10 seconds
問題是
zathura
沒有選項只能在文件正常的情況下打開視窗,如果不是這種情況則退出並出現錯誤——它會一直呆在那裡,就好像一切正常:$ dd if=file.pdf bs=50000 count=1 status=none | zathura - error: could not open document # its window still hanging around showing nothing $ echo $? 0 # really?
因此,即使您自己將輸出重定向到臨時文件,並且僅
zathura
在一切正常時才執行,也不能保證如果zathura
由於某種原因不喜歡輸出,使用者將不會看到黑色視窗.順便提一句,
man -X man
將在 X11 視窗中顯示聯機幫助頁
gxditview
,即使它看起來直接來自 ‘70 ;-)而且,當然,您總是可以使用:
... | xargs xterm -e man
除了許多其他增強功能外,它還允許您在搜尋和正確的文本選擇中使用正則表達式。