Tanto quanto eu sei, não. Você tem que fechá-lo manualmente:
if flock 9 -nx
then
program 9>&- #<= manual close of fd 9 after 'program' has forked but before it execs
else
echo "Lock held :/)" >&2
fi 9> /tmp/lk
Se você quiser obter mais hacky, pode definir o sinalizador chamando a função fcntl
diretamente por meio de ctypes.sh :
#!/bin/bash
echo initial
ls /proc/$$/fd/
echo with 9
{
ls /proc/$$/fd/
echo with 9 in an execced child
bash -c ' ls /proc/$$/fd/'
} 9</etc/passwd
echo
echo BEGIN MAGIC
FD_CLOEXEC=1
FD_SETFD=2
. ctypes.sh
echo initial
ls /proc/$$/fd/
echo with 9
{
dlcall fcntl int:9 int:$FD_SETFD int:$FD_CLOEXEC
ls /proc/$$/fd/
echo with 9 in an execced child
bash -c ' ls /proc/$$/fd/'
} 9</etc/passwd
Saída:
initial
0
1
2
255
with 9
0
1
2
255
9
with 9 in an execced child
0
1
2
3
9
BEGIN MAGIC
initial
0
1
2
255
with 9
0
1
2
255
9
with 9 in an execced child
0
1
2
3
(Não é um erro de digitação na colagem - o 9 realmente se fechou quando o filho foi executado).