Reputation: 1474
I know there's a lot of questions similar to mine, but I didn't found any about trapping signals sent when a subshell is taking place on the terminal. Let me explain:
#!/bin/sh
trap 'echo "exiting.."; exit 0;' INT
var1=$(echo "ab\nab" | fzf)
var2=$(echo "cd\ncd" | fzf)
fzf is a tool to display a selector of items of a list, so when the program reaches var1 a pretty selector covers my terminal screen prompting ab in one line and ab in the second, with the arrow keys I select the desired one and the result gets printed. Looks a lot like dmenu using this way.
The problem is that Ctrl-C doesn't get trapped by the script when fzf is prompting those lines. Instead, Ctrl-C kills fzf but the script keeps running.
So the question here is more about how to propagate this signal to the parent process.
Upvotes: 4
Views: 859
Reputation: 391
There is no easy way to propagate the particular signal from child to parent.
However, exit code is 130 if the program is terminated by Ctrl-C in many cases. fzf
follows it also.
Checking exit status and sending signal to own process is one of the workaround.
#!/bin/sh
trap 'echo "exiting.."; exit 0;' INT
var1=$(echo "ab\nab" | fzf)
[ $? -eq 130 ] && kill -INT $$
var2=$(echo "cd\ncd" | fzf)
[ $? -eq 130 ] && kill -INT $$
However, it is not common way.
If it needs to do something when terminated with any errors, using set -e
and trapping EXIT
or other signals is general way.
#!/bin/sh
set -e
trap 'echo "exiting.."; exit 0;' EXIT
var1=$(echo "ab\nab" | fzf)
var2=$(echo "cd\ncd" | fzf)
Upvotes: 3