用多个进程按ctrl-c,将其stdout传递到单个进程中会杀死shell

时间:2018-08-22 15:37:44

标签: shell zsh

我有一个脚本,可以并行执行多个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
}

此脚本需要安装curljqfzf。如果执行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

1 个答案:

答案 0 :(得分:1)

解决方案非常简单。我只需要分别从set -elesspeople中删除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
}