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
?
fzf
GitHub 上的页面建议使用.以下应该有效:$(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 &
编辑:不是真正的解决方案,请不要使用它