Variables and functions in bash
$PPID prints the bash’s parent process ID
$ echo $PPID 32147
Readonly variables
Use readonly prefix before assigning a variable to make it immutable.
$ readonly VAR='some message' $ VAR='message update' bash: VAR: readonly variable $ echo $VAR 'some message'
Environment variables
env command lists all the environment variables. That isn’t all the variables that are set in you shell, though. They are only environment variables that are exported to precesses that you start in the shell. If you want to see all the variables that are available in current shell session, use the command below. compgen is a command that generates list of possible ‘word completions’ in bash when you hit tab repeatedly.
$ env SHELL=/bin/zsh LSCOLORS=Gxfxcxdxbxegedabagacad ITERM_PROFILE=Default COLORTERM=truecolor LESS=-R [...]
$ compgen -v BASH BASHOPTS BASHPID BASH_ALIASES BASH_ARGC BASH_ARGV BASH_ARGV0 [...]
Exporting variables
We can assign variable in a ‘normal’ way or we can export a variable. The difference is, that when variable is exported, in can be use in subsequent process called in the bash, eg some scripts.
$ VAR1='var1' $ export VAR2='var2' --- script.sh #!/bin/bash echo 'VAR1: ' $VAR1 echo 'VAR2: ' $VAR2 --- $ ./script.sh VAR1: VAR2: var2
Variable scopes
Variables can have scope in bash. This is particularly useful in functions, where you don’t want your variables to be accessible from outside the function.
--- script.sh ---
#!/bin/bash
function print_variable {
echo $myvar
}
print_variable
myvar='Overriden variable'
print_variable
function local_variable {
local myvar='Local variable'
echo $myvar
}
local_variable
echo $myvar
local myvar='Can I change it?'
--- ---
$ ./script.sh
Overriden variable
Local variable
Overriden variable
./functions.sh: line 18: local: can only be used in a function
Overriding a builtin
If you want to know what functions are set in your environment, run declare -f. This will show the functions with their bodies. If you just want the function names, use the -F flag. This feature can be useful when we want to check if some builtin functions, eg cd are not overriden and whether we can use it safely.
Builtins vs programs
To determine if given command is builtin or program, use type builtin.
$ type grep grep is /usr/bin/grep $ type pwd pwd is a shell builtin