我有一个脚本,可以并行执行多个http请求,并允许用户搜索结果:
#!/usr/bin/env zsh
function swapiperson() {
curl -sL "https://swapi.co/api/people/$1" | jq -r '.name'
}
function fzfpeople() {
set -e
person=$({for ((req=0;req<10;req++)); do
swapiperson $req &
done} | fzf --no-hscroll +m)
[ ${#person} -gt 0 ] && echo $person
}
此脚本需要安装curl
,jq
和fzf
。如果执行fzfpeople
,然后按ctrl-c
而未选择任何选项,则父zsh
进程将死,终端仿真器将关闭。我知道问题不是fzf
,因为我的其他fzf
脚本没有这样做,并且因为如果我将fzf
替换为less
,也会遇到相同的问题:
#!/usr/bin/env zsh
function swapiperson() {
curl -sL "https://swapi.co/api/people/$1" | jq -r '.name'
}
function lesspeople() {
set -e
{for ((req=0;req<10;req++)); do
swapiperson $req &
done} | less
}
运行lesspeople
,按ctrl-c
,shell退出。这向我表明,我运行并行请求并将它们全部管道化的方式存在一些问题。我遇到的问题是否有任何简单的解决方案?我需要能够组合多个并行请求的stdout
并将它们通过管道传递到fzf
。
答案 0 :(得分:1)
解决方案非常简单。我只需要分别从set -e
和lesspeople
中删除fzfpeople
。这是正确的工作代码清单:
fzfpeople.zsh
:
#!/usr/bin/env zsh
function swapiperson() {
curl -sL "https://swapi.co/api/people/$1" | jq -r '.name'
}
function fzfpeople() {
person=$({for ((req=0;req<10;req++)); do
swapiperson $req &
done} | fzf --no-hscroll +m)
[ ${#person} -gt 0 ] && echo $person
}
lesspeople.zsh
:
#!/usr/bin/env zsh
function swapiperson() {
curl -sL "https://swapi.co/api/people/$1" | jq -r '.name'
}
function lesspeople() {
{for ((req=0;req<10;req++)); do
swapiperson $req &
done} | less
}