mirror of
https://github.com/fish-shell/fish-shell.git
synced 2024-12-03 00:16:20 +08:00
5eade35257
If a function process is deferred, allow it to be unbuffered. This permits certain simple cases where functions are piped to external commands to execute without buffering. This is a somewhat-hacky stopgap measure that can't really be extended to more general concurrent processes. However it is overall an improvement in user experience that might help flush out some bugs too.
224 lines
4.9 KiB
Fish
224 lines
4.9 KiB
Fish
#
|
|
# Test function, loops, conditionals and some basic elements
|
|
#
|
|
|
|
logmsg "Comments in odd places don't cause problems"
|
|
for i in 1 2 # Comment on same line as command
|
|
# Comment inside loop
|
|
for j in a b
|
|
# Double loop
|
|
echo $i$j
|
|
end;
|
|
end
|
|
|
|
logmsg Bracket expansion
|
|
echo x-{1}
|
|
echo x-{1,2}
|
|
echo foo-{1,2{3,4}}
|
|
|
|
echo foo-{} # literal "{}" expands to itself
|
|
echo foo-{{},{}} # the inner "{}" expand to themselves, the outer pair expands normally.
|
|
echo foo-{""} # still expands to foo-
|
|
echo foo-{$undefinedvar} # still expands to nothing
|
|
|
|
echo foo-{,,,} # four empty items in the braces.
|
|
echo foo-{,\,,} # an empty item, a "," and an empty item.
|
|
|
|
logmsg Escaped newlines
|
|
echo foo\ bar
|
|
echo foo\
|
|
bar
|
|
echo "foo\
|
|
bar"
|
|
echo 'foo\
|
|
bar'
|
|
|
|
for i in \
|
|
a b c
|
|
echo $i
|
|
end
|
|
|
|
|
|
logmsg Simple function tests
|
|
|
|
function foo
|
|
echo >../test/temp/fish_foo.txt $argv
|
|
end
|
|
|
|
foo hello
|
|
|
|
cat ../test/temp/fish_foo.txt |read foo
|
|
|
|
if test $foo = hello;
|
|
echo Test 2 pass
|
|
else
|
|
echo Test 2 fail
|
|
end
|
|
|
|
function foo
|
|
printf 'Test %s' $argv[1]; echo ' pass'
|
|
end
|
|
|
|
foo 3a
|
|
|
|
for i in Test for continue break and switch builtins problems;
|
|
switch $i
|
|
case Test
|
|
printf "%s " $i
|
|
case "for"
|
|
printf "%s " 3b
|
|
case "c*"
|
|
echo pass
|
|
case break
|
|
continue
|
|
echo fail
|
|
case and
|
|
break
|
|
echo fail
|
|
case "*"
|
|
echo fail
|
|
end
|
|
end
|
|
|
|
set -l sta
|
|
if eval true
|
|
if eval false
|
|
set sta fail
|
|
else
|
|
set sta pass
|
|
end
|
|
else
|
|
set sta fail
|
|
end
|
|
echo Test 4 $sta
|
|
|
|
logmsg "Ensure eval doesn't unnecessarily mess with the exit status"
|
|
function empty_func ; end
|
|
false ; eval empty_func ; echo $status
|
|
true ; eval empty_func ; echo $status
|
|
|
|
function test_builtin_status
|
|
return 1
|
|
end
|
|
test_builtin_status
|
|
if [ $status -eq 1 ]
|
|
set sta pass
|
|
else
|
|
set sta fail
|
|
end
|
|
echo Test 5 $sta
|
|
|
|
logmsg Verify that we can turn stderr into stdout and then pipe it
|
|
# Note that the order here has historically been unspecified - 'errput' could conceivably appear before 'output'.
|
|
begin ; echo output ; echo errput 1>&2 ; end 2>&1 | tee ../test/temp/tee_test.txt ; cat ../test/temp/tee_test.txt
|
|
|
|
logmsg "Test that trailing ^ doesn't trigger redirection, see #1873"
|
|
echo caret_no_redirect 12345^
|
|
|
|
logmsg Verify that we can pipe something other than stdout
|
|
# The first line should be printed, since we output to stdout but pipe stderr to /dev/null
|
|
# The second line should not be printed, since we output to stderr and pipe it to /dev/null
|
|
begin ; echo is_stdout ; end 2>| cat > /dev/null
|
|
begin ; echo is_stderr 1>&2 ; end 2>| cat > /dev/null
|
|
|
|
####################
|
|
logmsg echo tests
|
|
echo 'abc\ndef'
|
|
echo -e 'abc\ndef'
|
|
echo -e 'abc\zdef'
|
|
echo -e 'abc\41def'
|
|
echo -e 'abc\041def'
|
|
echo -e 'abc\121def'
|
|
echo -e 'abc\1212def'
|
|
echo -e 'abc\cdef' # won't output a newline!
|
|
echo ''
|
|
echo -
|
|
echo -h
|
|
echo -ne '\376' | display_bytes
|
|
echo -e Catch your breath
|
|
echo -e 'abc\x21def'
|
|
echo -e 'abc\x211def'
|
|
|
|
logmsg "Verify that pipes don't conflict with fd redirections"
|
|
# This code is very similar to eval. We go over a bunch of fads
|
|
# to make it likely that we will nominally conflict with a pipe
|
|
# fish is supposed to detect this case and dup the pipe to something else
|
|
echo "/bin/echo pipe 3 <&3 3<&-" | source 3<&0
|
|
echo "/bin/echo pipe 4 <&4 4<&-" | source 4<&0
|
|
echo "/bin/echo pipe 5 <&5 5<&-" | source 5<&0
|
|
echo "/bin/echo pipe 6 <&6 6<&-" | source 6<&0
|
|
echo "/bin/echo pipe 7 <&7 7<&-" | source 7<&0
|
|
echo "/bin/echo pipe 8 <&8 8<&-" | source 8<&0
|
|
echo "/bin/echo pipe 9 <&9 9<&-" | source 9<&0
|
|
echo "/bin/echo pipe 10 <&10 10<&-" | source 10<&0
|
|
echo "/bin/echo pipe 11 <&11 11<&-" | source 11<&0
|
|
echo "/bin/echo pipe 12 <&12 12<&-" | source 12<&0
|
|
|
|
logmsg "Make sure while loops don't run forever with no-exec (#1543)"
|
|
echo "Checking for infinite loops in no-execute"
|
|
echo "while true; end" | ../test/root/bin/fish --no-execute
|
|
|
|
logmsg "For loops with read-only vars is an error (#4342)"
|
|
for status in a b c
|
|
echo $status
|
|
end
|
|
|
|
logmsg "That goes for non-electric ones as well (#5548)"
|
|
for hostname in a b c
|
|
echo $hostname
|
|
end
|
|
|
|
logmsg For loop control vars available outside the for block
|
|
begin
|
|
set -l loop_var initial-value
|
|
for loop_var in a b c
|
|
# do nothing
|
|
end
|
|
set --show loop_var
|
|
end
|
|
|
|
set -g loop_var global_val
|
|
function loop_test
|
|
for loop_var in a b c
|
|
if test $loop_var = b
|
|
break
|
|
end
|
|
end
|
|
set --show loop_var
|
|
end
|
|
loop_test
|
|
set --show loop_var
|
|
|
|
begin
|
|
set -l loop_var
|
|
for loop_var in aa bb cc
|
|
end
|
|
set --show loop_var
|
|
end
|
|
set --show loop_var
|
|
|
|
logmsg 'Comments allowed in between lines (#1987)'
|
|
echo before comment \
|
|
# comment
|
|
after comment
|
|
|
|
logmsg 'Backslashes are part of comments and do not join lines (#1255)'
|
|
# This should execute false, not echo it
|
|
echo -n # comment\
|
|
false
|
|
|
|
function always_fails
|
|
if true
|
|
return 1
|
|
end
|
|
end
|
|
|
|
logmsg 'Verify $argv set correctly in sourced scripts (#139)'
|
|
echo 'echo "source argv {$argv}"' | source
|
|
echo 'echo "source argv {$argv}"' | source -
|
|
echo 'echo "source argv {$argv}"' | source - abc
|
|
echo 'echo "source argv {$argv}"' | source - abc def
|
|
|
|
always_fails
|
|
echo $status
|