mirror of
https://github.com/fish-shell/fish-shell.git
synced 2024-12-03 08:23:51 +08:00
eaecb817ca
This makes two changes: 1. Remove the 'brace_text_start' idea. The idea of 'brace_text_start' was to prevent emitting `BRACE_SPACE` at the beginning or end of an item. But we later strip these off anyways, so there is no apparent benefit. If we are not doing brace expansion, this prevented emitting whitespace at the beginning or end of an item, leading to #6564. 2. When performing brace expansion, only stomp the space character with `BRACE_SPACE`; do not stomp newlines and tabs. This is because the fix in came from a newline or tab literal, then we would have effectively replaced a newline or tab with a space, so this is important for #6564 as well. Moreover, it is not easy to place a literal newline or tab inside a brace expansion, and users who do probably do not mean for it to be stripped, so I believe this is a good change in general. Fixes #6564
208 lines
4.4 KiB
Fish
208 lines
4.4 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 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 "Testing builtin 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 | sort | 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
|