Differences between declare, typeset and local variable in Bash
Solution 1
- Difference between
typeset
anddeclare
:
The former is more portable(e.g. ksh), while the latter is more preferable when portability is not a concern.
- Difference between
declare
(ortypeset
) andlocal
when used inside a function:
The former implies the latter, but more powerful. For example, declare -i x
makes x
have the integer
attribute, declare -r x
makes x
readonly, etc.
Solution 2
As far as bash is concerned, no, there is no difference. In fact, the manpage has them share the same definition
declare [-aAfFilrtux] [-p] [name[=value] ...]
typeset [-aAfFilrtux] [-p] [name[=value] ...]
Declare variables and/or give them attributes. If no names are given then display the values of variables. The -p option will display the attributes and values of each name...
I also found this little tidbit which further substantiates my claim as well as the ksh
portability you mentioned.
The declare or typeset builtins, which are exact synonyms, permit modifying the properties of variables. This is a very weak form of the typing [1] available in certain programming languages. The declare command is specific to version 2 or later of Bash. The typeset command also works in ksh scripts.
Solution 3
In the Bash manual under section 4.2 Bash Builtin Commands it states:
'typeset'
typeset [-afFrxi] [-p] [NAME[=VALUE] ...]
The 'typeset' command is supplied for compatibility with the Korn shell; however, it has been deprecated in favor of the 'declare' builtin command.
lecodesportif
Updated on June 27, 2020Comments
-
lecodesportif almost 4 years
When typing variables in Bash, what is the difference between
declare
andtypeset
? When used inside a function: what is the difference betweendeclare
andtypeset
andlocal
?The only difference I have come across is that typeset is portable to ksh scripts. Other than that, are there any reasons why one should be preferred over the other?
UPDATE: Added
local
to the question. -
lecodesportif over 13 years"help typeset" tells me that it's obsolete. Deprecated in favor of "declare".
-
ormaaj about 12 years
local
anddeclare
are mostly identical and take all the same arguments with two exceptions: local will fail if not used within a function, and local with no args filters output to print only locals, declare doesn't. -
Hui Zheng about 12 years@ormaaj you're right, I didn't realize that
local
supports options too. Thanks a lot. -
osirisgothra over 10 yearsthis is a good example of the problems in the bash documentation and theres inconsistency with command line help (using the 'help' command) and the manual pages, (using 'man bash' and going to SHELL BUILTINS) and the builtin page (using 'man builtins'). There are also some typos in there, so be careful
-
Alexander Mills about 6 yearsso a variable declared with
typeset
ordeclare
is local? seems like that question is the most obvious question to answer. -
Aethalides over 5 years@AlexanderMills Using
declare
ortypeset
without the-g
modifier inside a function will declare a local variable.local
will of course also create a local variable. Any other method of declaring a variable inside a function will create a global variable. -
Roland about 4 years"When used in a function, declare makes each name local, as with the local command, unless the -g option is used." from gnu.org/software/bash/manual/html_node/Bash-Builtins.html
-
Paddy Landau over 3 yearsI know that this is old, but it's useful to note that within a function,
declare
andlocal
are identical (apart from usinglocal
without parameters). If you uselocal -g
, the variable will counterintuitively be global! For me, the only useful distinction is visual, so that the human reader knows thatlocal
is intended to be local, whereasdeclare
is intended to be used with-g
.