Creating functions in Fish
Variables in Fish might be a bit counter intuitive for some one with a
programming background. It is done with the
set buildin. The
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
set galaxy_destroyers 42changes 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
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.