Shell-Script

如何讓管道等待文件結束或在出錯後停止?

  • December 17, 2020

在觀看有關管道惡作劇的影片後,我嘗試了以下命令。

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

除了許多其他增強功能外,它還允許您在搜尋和正確的文本選擇中使用正則表達式。

引用自:https://unix.stackexchange.com/questions/515862