read -l -P "" number
if test -z "$number"
    set number 2
end
# do something e.g. echo "Processed"
echo "Processed"

我想从标准输入中阅读一些东西,然后做一些事情,例如回声"Processed"。从标准输入输入Ctrl C时,我希望永远不会执行do something。但是,do something始终被执行。

我试图将陷阱用于kill %self,就像

trap 'kill %self' INT
read -l -P "" number
if test -z "$number"
    set number 2
end
# do something e.g. echo "Processed"
echo "Processed"

但是,不应杀死%self。该程序是由快捷方式触发的。与终端PID相同的程序的PID。因此,当执行kill %self时,终端被关闭。这不是预期的。

与终端PID相同的程序的PID。

分析解答

read从终端读取并获得ctrl-c时,它已经流产[0]。

但是,在这种情况下,它将变量设置为空并返回错误状态。

您永远不会检查该状态,因此执行仅使用一个空变量继续。

您想要的就是这样:

read -l -P "" number
or exit # or return or handling it in another way.

您也可以使用if

if read -l -P "" number
   # do things you would do if read wasn't aborted
   # Note: $number can still be empty if the user just pressed enter!
end

[0]:当您从例如ctrl-c的管道通常会结束写作过程,因此阅读将获得end-of-file而不是newline,并且会发生同样的事情。