mirror of
https://github.com/fish-shell/fish-shell
synced 2024-12-27 05:13:10 +00:00
51468b7646
It's currently too easy for someone to bork their shell by doing something like `function test; return 0; end`. That's obviously a silly, contrived, example but the point is that novice users who learn about functions are prone to do something like that without realizing it will bork the shell. Even expert users who know about the `test` builtin might forget that, say, `pwd` is a builtin. This change adds a `--shadow-builtin` flag that must be specified to indicate you know what you're doing. Fixes #3000
59 lines
1.5 KiB
Fish
59 lines
1.5 KiB
Fish
# vim: set filetype=fish:
|
|
#
|
|
# Test the `function` builtin
|
|
|
|
# utility function
|
|
function show_ary -a name --no-scope-shadowing
|
|
set -l count (count $$name)
|
|
echo "\$$name: ($count)"
|
|
if test $count -gt 0
|
|
for i in (seq $count)
|
|
echo "$i: '$$name[1][$i]'"
|
|
end
|
|
end
|
|
end
|
|
|
|
# Test the -V flag
|
|
set -g foo 'global foo'
|
|
set -l foo 'local foo'
|
|
set bar one 'two 2' \t '' 3
|
|
set baz
|
|
function frob -V foo -V bar -V baz
|
|
show_ary foo
|
|
show_ary bar
|
|
show_ary baz
|
|
end
|
|
echo "Testing -V"
|
|
frob
|
|
echo "Testing -V with changed variables"
|
|
set foo 'bad foo'
|
|
set bar 'bad bar'
|
|
set baz 'bad baz'
|
|
frob
|
|
|
|
# Test that -a does not mix up the function name with arguments
|
|
# See #2068
|
|
function name1 -a arg1 arg2 ; end
|
|
function -a arg1 arg2 name2 ; end
|
|
function name3 --argument-names arg1 arg2 ; end
|
|
function --argument-names arg1 arg2 name4 ; end
|
|
for i in (seq 4)
|
|
if functions -q name$i
|
|
echo "Function name$i found"
|
|
else
|
|
echo "Function name$i not found, but should have been"
|
|
end
|
|
end
|
|
|
|
# Test that we can't define a function that shadows a builtin by accident.
|
|
function pwd; end
|
|
or echo 'yes, it failed as expected' >&2
|
|
|
|
# Test that we can define a function that shadows a builtin if we use the
|
|
# right flag.
|
|
function pwd --shadow-builtin; end
|
|
and echo '"function pwd --shadow-builtin" worked'
|
|
|
|
# Using --shadow-builtin for a non-builtin function name also fails.
|
|
function not_builtin --shadow-builtin; end
|
|
or echo 'yes, it failed as expected' >&2
|