程序在通过管道传输之前启动

程序在通过管道传输之前启动
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

答案1

这就是管道与管道之间同时运行命令的全部要点。

对于顺序运行的命令,您需要无限大小的管道,或者诉诸将输出存储到临时文件中。

使用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

答案2

也许我在这里遗漏了一些东西——在我看到这个问题之前我从未听说过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如果您认为它有益,请添加。)

答案3

#!/bin/sh
name=$( man -k . | fzf +i -e --tiebreak=begin | awk '{print ($2,$1)}' | tr -d "()")
if [ -n "$name" ]; then
man -Tpdf $(echo $name) | zathura - &
fi

经过更好的思考后,我想出了这个,效果很好,现在支持所有手册页(考虑到手册页的标签,例如1p ls

G-mans 的答案似乎更复杂,并且没有上面提到的额外功能(因为从来没有要求过,这是可以理解的)。

答案4

我“解决”了我的问题,我将输出重定向到我的 /tmp/ 目录,然后让 zathura 从那里读取。我也把这一切都写进了一个脚本里。

   #!/bin/sh
   d=$(date +'%M_%S');
   man -k . | fzf -e --tiebreak=begin | awk '{print $1}' | xargs man -Tpdf > /tmp/man_${d};
   zathura /tmp/man_${d} 2> /dev/null &

编辑:不是真正的解决方案,请不要使用它

相关内容