# RUN: %fish %s # Do not run under sanitizers in CI, as they intercept a busted posix_spawn # which mishandles shebangless scripts. # REQUIRES: test -z "$FISH_CI_SAN" # Test for shebangless scripts - see 7802. set testdir (mktemp -d) cd $testdir touch file chmod a+x file function runfile # Run our file twice, printing status. # Arguments are passed to exercise the re-execve code paths; they have no other effect. true # clear status set -g fish_use_posix_spawn 1 ./file arg1 arg2 arg3 echo $status true # clear status set -g fish_use_posix_spawn 0 ./file arg1 arg2 arg3 arg4 arg5 echo $status end # Empty executable files are 'true'. true >file sleep 0.1 runfile #CHECK: 0 #CHECK: 0 # Files without NUL are 'true' as well. echo -e -n '#COMMENT\n#COMMENT' >file runfile #CHECK: 0 #CHECK: 0 # Never implicitly pass files ending with .fish to /bin/sh. true >file.fish sleep 0.1 chmod a+x file.fish set -g fish_use_posix_spawn 0 ./file.fish #CHECKERR: exec: {{.*}} #CHECKERR: exec: {{.*}} echo $status #CHECK: 126 set -g fish_use_posix_spawn 1 ./file.fish #CHECKERR: exec: {{.*}} #CHECKERR: exec: {{.*}} echo $status #CHECK: 126 rm file.fish # On to NUL bytes. # The heuristic is that there must be a line containing a lowercase letter before the first NUL byte. echo -n -e 'true\n\x00' >file sleep 0.1 runfile #CHECK: 0 #CHECK: 0 # Doesn't meet our heuristic as there is no newline. echo -n -e 'true\x00' >file sleep 0.1 runfile #CHECK: 126 #CHECKERR: exec: {{.*}} #CHECKERR: exec: {{.*}} #CHECK: 126 #CHECKERR: exec: {{.*}} #CHECKERR: exec: {{.*}} # Doesn't meet our heuristic as there is no lowercase before newline. echo -n -e 'NOPE\n\x00' >file sleep 0.1 runfile #CHECK: 126 #CHECKERR: exec: {{.*}} #CHECKERR: exec: {{.*}} #CHECK: 126 #CHECKERR: exec: {{.*}} #CHECKERR: exec: {{.*}} echo 'echo foo' >./- sleep 0.1 chmod +x ./- set PATH ./ $PATH sleep 0.1 - #CHECK: foo echo $status #CHECK: 0