About
A shell function is an object that:
- is called like a simple command and
- executes a compound command with a new set of positional parameters. ie a function definition is itself a compound command
By convention, the function name starts with an underscore.
Syntax
[ function ] name () compound-command [redirection]
where:
- function is a optional reserved word
- name is the function name.
- () If the function reserved word is supplied, the parentheses are optional.
- compound-command is the body of the function. Usually a list of commands between { and }, but may be any compound command. compound-command is executed whenever name is specified as the name of a simple command.
- redirection. Any redirections specified when a function is defined are performed when the function is executed.
Scope
- Functions see the locals of their callers but can't access a caller's positional parameters (except through BASH_ARGV if extdebug is enabled).
- Functions can be exported to the global scope export -f name
Feedback
Bash functions don't return anything or store value in variable, they only:
- have an exit status
- and produce output streams.
Exit Status
The exit status of a function definition is zero unless a syntax error occurs or a readonly function with the same name already exists.
When executed, the exit status of a function is the exit status of the last command executed in the body that can be overwritten with the return function
Capturing Value
Subshell
The function is executed in a SubShell
foo() {
echo "Nico"
}
x=$(foo)
echo "foo returned '$x'"
Global Variable
foo() {
return="Return Value"
}
foo
echo "foo returned '$return'"
Local Variable
Bash - local - Variable declaration in function - (Builtin)
bar() {
var=$(($1+$2))
}
foo() {
local var
bar 6 2
echo "$var"
}
foo
8
File redirection
Storing the value in a file.
# The function
foo() {
echo "Returned Value" > "$1"
}
# The temp file
tmpfile=$(mktemp)
# The function call
foo "$tmpfile"
# Retrieving the value
echo "foo returned '$(<"$tmpfile")'"
# Close (removing the resource)
rm "$tmpfile"
foo returned 'Returned Value'
Features
- Bash functions
- returns an exit code
- may produce output streams (of string) that can be captured
- Passable: Nothing is “passable”, especially not arrays. Bash uses strictly call-by-value semantics (magic alias hack excepted).
- Nesting: Function definitions may be nested, but these are not closures, though they look very much the same.
- Functions are not passable (first-class),
- Namespace: Reusable functions can't be guaranteed free of namespace collisions unless you resort to weird naming rules to make conflicts sufficiently unlikely.
Documentation / Reference
help function