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
时,终端被关闭。这不是预期的。
分析解答
当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,并且会发生同样的事情。