I've recently discovered the declare Bash builtin, which declares variables with local scope and can also be used to export variables or even set type.
# bar an baz have local scope
foo()
{
declare bar
local baz
}
# bing and bong are both exported
declare -x bing
export bong
# i is an integer, j is read-only integer
declare -i i=0
declare -ri j=10
I've started using it everywhere and stopped using local and export. So why do local and export even exist?
'declare' is a bash built-in command that allows you to update attributes applied to variables within the scope of your shell. In addition, it can be used to declare a variable in longhand. Lastly, it allows you to peek into variables.
Export is a built-in command of the Bash shell. It is used to mark variables and functions to be passed to child processes. Basically, a variable will be included in child process environments without affecting other environments.
It means that the shell's child processes do not inherit the shell's variables. The user must export the variables to make them available to child processes. This tutorial will show you how to export Bash variables in Linux using the export command. Access to the terminal/command line. The bash shell.
The easiest way to set environment variables in Bash is to use the “export” keyword followed by the variable name, an equal sign and the value to be assigned to the environment variable.
They exists because of the history. This manual says declare was introduced in bash version 2, local was introduced earlier. People use local, export and readonly by convention and readability.
When I see local I think - 'Och! This must be a function local variable. I must be reading a function.'. When I see declare I need to scroll up until I see a function declaration, to know if i'm in a function and to see if the variable is local.
With export, the export is a POSIX builtin, so it will work everywhere, which is important. But it's similar. When I see export I think - 'Och! This variable is getting exported!'. When I see declare -x I need to refresh my memory with declare options (well, it's easy, -x sounds like export, but it's still one more thing to remember). I prefer writing local and export. Because it is they way my mind thinks - this variable is local, that variable is exported.
When I read scripts with only local and export, without the use of declare, I know it's an easy script. declare -i or declare -n can complicate things.
Also, typeset and declare are exact synonyms. So, you could also ask, why declare, when you can typeset? Probably typeset was introduced, so you can run ksh scripts using bash without any changes. Same with local and readonly keywords. Similar with mapfile and readarray. Convention. With a file you could go with mapfile, but with a here string I sometimes go with readarray, because I am reading some data into an array, and not mapping the file.
I believe the local keyword is (a bit?) more portable then declare. You could read ex. this unix.stackexchange thread for some more info.
In most cases Yes! but remember using declare in most cases with few of its flags causes the shell to interpret them as expressions rather than just plain assignment strings. Assume you want to define a variable to hold integer only values with the -i attribute
declare -i x; x=2+2; echo $x
4
export x; x=2+2; echo $x
2+2
The shell has forced the assignment to be treated as a integer expression instead of a plain variable assignment. The export/local commands don't define this special processing to be applied to assignments.
Also the built-ins local/export were added to bash much earlier than the attributes which declare provides. POSIX does not define either local or declare, so if you were to target scripts written on a minimal sh shell, only export is available ( note that exporting a function with -f is still only Bash-ism and not POSIX )
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With