Creating functions in Fish
Creating functions in Fish
Variable declarations
Variables in Fish might be a bit counter intuitive for some one with a
programming background. It is done with the
set buildin. The
plain set galaxy_destroyers
does one of two things depending on the
global state of the shell.
- If there is already a global variable with the name
galaxy_destroyers
invokation ofset galaxy_destroyers 42
changes that variable to 42. - If there is no such variable invokation creates a local variable with said value.
To avoid this ambiguity it is wise to use set
with the -l
flag in
your functions. This forces the variable to be local (with a twist…).
When following this best practice you’d might be temped to do:
function galaxy_destroyer
if test 1 -eq 1 # always true
set -l destroyer 234
end
echo $destroyer
end
$ sheep
> 234
This works!
However:
function last_destroyer
set -l destroyers dalek cylon borg
for i in $destroyers
set -l last $i
end
echo $last
end
$ herd
>
This returns nothing! That is because the if
clause does not introduce
a new scope but the for
clause does. Using the -l
flag makes the
variable local to the scope.
To avoid these subtle errors you often see the variables declared in a function like so:
function herd
set -l destroyers
...
end
This concludes part 1. In the next part I’ll elucidate return types in Fish.