Files
fish-shell/tests/checks/fds.fish
2026-05-23 00:59:56 +08:00

128 lines
2.9 KiB
Fish

# RUN: fish=%fish %fish -C "set helper %fish_test_helper" %s
#REQUIRES: command -v %fish_test_helper
# Check that we don't leave stray FDs.
set -l fds ($helper print_fds)
test "$fds" = "0 1 2"
or begin
echo This test needs to have all fds other than 0 1 and 2 closed before running >&2
echo Please close the other fds and try again >&2
exit 1
end
$helper print_fds
# CHECK: 0 1 2
$helper print_fds 0>&-
# CHECK: 1 2
$helper print_fds 0>&- 2>&-
# CHECK: 1
false | $helper print_fds 0>&-
# CHECK: 0 1 2
$helper print_fds </dev/null
# CHECK: 0 1 2
$helper print_fds </dev/null
# CHECK: 0 1 2
$helper print_fds 3</dev/null
# CHECK: 0 1 2 3
$helper print_fds 5>&2
# CHECK: 0 1 2 5
# This attempts to trip a case where the file opened in fish
# has the same fd as the redirection. In this case, the dup2
# does not clear the CLOEXEC bit.
$helper print_fds 4</dev/null
# CHECK: 0 1 2 4
$helper print_fds 5</dev/null
# CHECK: 0 1 2 5
$helper print_fds 6</dev/null
# CHECK: 0 1 2 6
$helper print_fds 7</dev/null
# CHECK: 0 1 2 7
$helper print_fds 8</dev/null
# CHECK: 0 1 2 8
$helper print_fds 9</dev/null
# CHECK: 0 1 2 9
$helper print_fds 10</dev/null
# CHECK: 0 1 2 10
$helper print_fds 11</dev/null
# CHECK: 0 1 2 11
$helper print_fds 12</dev/null
# CHECK: 0 1 2 12
$helper print_fds 13</dev/null
# CHECK: 0 1 2 13
$helper print_fds 14</dev/null
# CHECK: 0 1 2 14
$helper print_fds 15</dev/null
# CHECK: 0 1 2 15
$helper print_fds 16</dev/null
# CHECK: 0 1 2 16
$helper print_fds 17</dev/null
# CHECK: 0 1 2 17
$helper print_fds 18</dev/null
# CHECK: 0 1 2 18
$helper print_fds 19</dev/null
# CHECK: 0 1 2 19
$helper print_fds 20</dev/null
# CHECK: 0 1 2 20
# Check heightenization of the redirection file descriptors
#
# If heightenization does NOT work, ">$tmpfile" creates a temporary fd on a fd n
# (n being the first free descriptor) during parsing, then "n>&1" redirects fd n
# to fd 1 (still stdout at this stage), lastly, ">$tmpfile" redirects fd 1 is
# redirected to the "temporary" fd n (which is now stdout instead of $tmpfile).
#
# If heightenization does work, ">$tmpfile" creates a temporary fd on 10+,
# then fd n is redirected to fd 1 (still stdout), the fd 1 is redirect to
# the "temporary" fd 10+ (still $tmpfile)
#
# Since we don't know what `n` will be, we need to redirect all the descriptors
# reserved for the user
set -l tmpfile (mktemp)
printf 'stdout: %s\n' "$($fish -c "$helper print_fds 3>&1 4>&1 5>&1 6>&1 7>&1 8>&1 9>&1 >$tmpfile")"
printf "tmp file: %s\n" $(cat $tmpfile)
# CHECK: stdout:
# CHECK: tmp file: 0 1 2 3 4 5 6 7 8 9
# Check heightenization of the file descriptors when sourcing
echo '
path filter /proc/$fish_pid/fd/{3,4,5,6,7,8,9}
' >"$tmpfile"
echo start source
$fish -c "source '$tmpfile'"
echo end source
# CHECK: start source
# CHECK: end source
# Check heightenization of descriptors for script files passed to fish
echo start fish
$fish "$tmpfile"
echo end fish
# CHECK: start fish
# CHECK: end fish