Shell

程序在輸入之前啟動

  • April 12, 2021
man -k . | fzf -e --tiebreak=begin | awk '{print $1}' | xargs man -Tpdf | zathura -
# searches for a man page and then outputs it as pdf to zathura

此命令允許使用者選擇手冊頁,然後顯示該頁面。它工作得很好,除了 zathura 在等待使用者做出選擇時開始空白,這導致 zathura 獲得輸入。必須將焦點從 zathura 轉移回終端,然後再回到 zathura,這真的很煩人。

我對腳本相當陌生,所以我認為可能有一種我不知道的解決方法。

最好不要ifne

這就是管道與它們之間的管道同時執行命令的全部意義。

對於順序執行的命令,您需要無限大小的管道,或者將輸出儲存到臨時文件中。

使用zsh,可以通過以下方式完成:

zathura =(
 man -k . |
  fzf -e --tiebreak=begin |
  awk '{print $1}' |
  xargs -rd '\n' man -Tpdf
)

(這裡添加特定於 GNU 的-r-d '\n'選項,因為我們不想要預設的解析模式並且如果沒有輸入也xargs不想執行)。man

where=(cmd)擴展為臨時文件的路徑,而不是包含cmd曾經返回的輸出(特定於cmd的第三種形式的程序替換zsh)。zathura命令返回後,臨時文件將自動刪除。

也許我在這裡遺漏了一些東西——在我看到這個問題之前,我從未聽說過fzf(或者zathura,就此而言),而且我的系統上沒有它們可供測試。但是……不是fzf從列表中選擇一個項目的重點嗎?讓我換個說法: 從列表fzf中選擇***一項不是重點嗎?***這裡不是 xargs矯枉過正嗎?基本不是邏輯

select a man page
and then display it

?

fzfGitHub 上的頁面建議使用. 以下應該有效:$(fzf *args*)

mp=$(man -k . | fzf -e --tiebreak=begin | awk '{print $1}')  &&  [ -n "$mp" ]  &&
               man -Tpdf "$mp" | zathura - &

從使用者輸入中讀取使用者選擇的手冊頁 ,然後顯示它。不需要(顯式)臨時文件。( 2> /dev/null如果您認為它是有益的,請添加。)

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