Bash Built-In Variables: Difference between revisions

From NovaOrdis Knowledge Base
Jump to navigation Jump to search
No edit summary
 
(95 intermediate revisions by the same user not shown)
Line 1: Line 1:
=External=
=External=


* GNU manual, bash variables: https://www.gnu.org/software/bash/manual/html_node/Bash-Variables.html#Bash-Variables
* bash Internal Variables http://www.tldp.org/LDP/abs/html/internalvariables.html
* bash Internal Variables http://www.tldp.org/LDP/abs/html/internalvariables.html
* http://answers.oreilly.com/topic/1498-built-in-bash-shell-variables/


=Internal=
=Internal=


* [[bash Variables]]
* [[bash Parameters and Variables]]
* [[bash Concepts#bash_Environment_Variables|bash Concepts]]
* [[Bash Parameter and Variable Expansion|bash Parameter and Variable Expansion]]


=Overview=
=Overview=


==Environment Variable Hierarchy==
This page documents [[Bash_Parameters_and_Variables#Variables|variables]] that have a special meaning to the shell and are known as internal, keyword or built-in variables. For a list of special parameters, see <span id='.240'></span><span id='.24.2A'></span><span id='.24.40'></span><span id='.24.24'></span><span id='.24.3F'></span><span id='.24.23'></span><span id='.24-'></span><span id='.24'></span><span id='.24.21'></span><span id='.24_2'>[[Bash Special Parameters|bash Special Parameters]].


When a parent shell forks a new sub-shell, the sub-shell process has ''a copy of the parent's environment'' and no access to the parent process's environment whatsoever. When the shell sub-process terminates any changes made to its environment are lost. There is no way to modify directly the parent's environment.
=BASH=


=Standard Environment Variables=
The path to the bash binary.


==IFS==
=BASH_VERSION=
 
=BASH_ENV=
 
An environment variable pointing to a bash startup file to read when the script is invoked.
 
=BASH_SUBSHELL=
A variable indicating the [[bash Concepts#Subshell|subshell]] level. Introduced in bash 3. The main bash process reports 0. If a function is invoked with $(...), it will report BASH_SUBSHELL=1. If another function is invoked with $(...) from it, it will report BASH_SUBSHELL=2, and so on.
 
=BASHPID=
 
The process ID of the current instance of bash. It is different from [[#.24.24|$$]] in that [[#.24.24|$$]] always stay the same for a bash script execution, representing the process ID of the top level bash process, the script itself, even if invoked from [[Bash_Concepts#Subshell|subshells]] with (...), whereas BASHPID has different values, depending on the [[Bash_Concepts#Subshell|subshell]] it is dereferenced into.
 
=<tt>BASH_SOURCE</tt>=
 
An array variable whose members are the source filenames where the corresponding shell function names in the FUNCNAME array variable are defined. The shell function ${FUNCNAME[$i]} is defined in the file ${BASH_SOURCE[$i]} and called from ${BASH_SOURCE[$i+1]}
 
${BASH_SOURCE[0]}  is equivalent with $0, with the observation that ${BASH_SOURCE[0]} contains the (potentially relative) path of the containing script in all invocation scenarios, notably also when the script is sourced, which is not true for $0.
 
When the script is sourced, $0 contains "-bash", while ${BASH_SOURCE[0]} contains the path of the script.
 
=<tt>DIRSTACK</tt>=
{{Internal|Bash Directory Manipulation Built-in Commands#DIRSTACK|Directory Manipulation Built-in Commands}}
 
=<tt>IFS</tt>=


<tt>IFS</tt> is the internal field separator. This variable determines how bash recognizes ''fields'' (word boundaries) when it interprets character strings. <tt>IFS</tt> defaults to whitespace (space, tab and newline). This is the proof:
<tt>IFS</tt> is the internal field separator. This variable determines how bash recognizes ''fields'' (word boundaries) when it interprets character strings. <tt>IFS</tt> defaults to whitespace (space, tab and newline). This is the proof:
Line 37: Line 61:
</blockquote>
</blockquote>


===Restoring the default IFS value===
<font color=darkkhaki>To research, <code>IFS=</code> seems equivalent with <code>IFS="$(printf '\n\r')"</code> in that it recognizes '\n' and '\r' as separators but not the space ' '. It did not work for me, but why it worked in examples?</font>
 
==Restoring the default IFS value==


<pre>
<pre>
IFS="$(printf ' \t\n')"
IFS="$(printf ' \t\n\r')"
</pre>
</pre>


===IFS and for===
==IFS and for==


<tt>for</tt> honors the value of IFS (default the space). If you set IFS to something else, before the <tt>for</tt> statement, <tt>for</tt> will use that as field separator while iterating over the list.
<tt>for</tt> honors the value of IFS (default the space). If you set IFS to something else, before the <tt>for</tt> statement, <tt>for</tt> will use that as field separator while iterating over the list.
Line 56: Line 82:
* [[bash set#List_Separator|bash <tt>set</tt> List Separator]]
* [[bash set#List_Separator|bash <tt>set</tt> List Separator]]


==$*==
==IFS and read==


All arguments on command line as one string ("$1 $2 ..."). The values are separated by the first character in $IFS.  
IFS characters are used to split the line processed by [[bash read|read]] into words.


|[bash set#SetAndPositionalParameters]
=PATH=
{{Internal|PATH#Overview|PATH}}


==$@==
=PIPESTATUS=
See: {{Internal|Bash_Concepts#Pipeline|Pipeline}}


All arguments on command line, individually quoted ("$1" "$2" ...).
=<span id='.24PPID'></span>PPID=
 
==$?==
 
Exit value of last executed command, in the interactive shell or within a script.
 
After the execution of a command in the context of an <tt>if</tt>, the exit code can be retrieved with <tt>$?</tt>:
 
<pre>
if ! bash -c "exit 4"; then
    echo "we expect the failure code to be 4 and it is $?"
fi
</pre>
 
==$$==
 
The pid of the current process. Also see $BASHPID, which differs from $$ under certain circumstances, such as subshells that do not require bash to be re-initialized.
 
==$PPID==


The process ID of the shell's parent.  This variable is readonly.
The process ID of the shell's parent.  This variable is readonly.


==$# ==
=PS1=
 
{{Internal|Bash Prompt|Bash Prompt}}
Number of command line arguments
 
==$-==
 
Options currently in effect (supplied on command line or to set). The shell sets some options automatically.
 
==$==
 
Process number of the shell.
 
==$!==


Process number (PID) of last background command.
=FUNCNAME=


==$0==
An array containing the names of all shell functions currently in the execution call stack. Invoked as ${FUNCNAME} returns the name of the current function. See: {{Internal|Bash_Functions#The_FUNCNAME_Array|The FUNCNAME Array}}


First word; that is, the command name. This will have the full pathname if it was found via a PATH search.
=OLDPWD=


==$1, $2, ...==
Contains directory before the last cd command.


Individual arguments on command line (positional parameters). The Bourne shell allows only nine parameters to be referenced directly (n = 1–9); Bash allows n to be greater than 9 if specified as ${n}.
cd directory
echo $OLDPWD
/home/user


==$_==
=LD_LIBRARY_PATH=
{{External|https://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html}}
{{Internal|Linux Shared Libraries|Linux Shared Libraries}}


Temporary variable; initialized to pathname of script or program being executed. Later, stores the last argument of previous command. Also stores name of matching MAIL file during mail checks.
=LD_PRELOAD=
{{External|https://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html}}
{{Internal|Linux Shared Libraries|Linux Shared Libraries}}

Latest revision as of 00:08, 26 July 2023

External

Internal

Overview

This page documents variables that have a special meaning to the shell and are known as internal, keyword or built-in variables. For a list of special parameters, see bash Special Parameters.

BASH

The path to the bash binary.

BASH_VERSION

BASH_ENV

An environment variable pointing to a bash startup file to read when the script is invoked.

BASH_SUBSHELL

A variable indicating the subshell level. Introduced in bash 3. The main bash process reports 0. If a function is invoked with $(...), it will report BASH_SUBSHELL=1. If another function is invoked with $(...) from it, it will report BASH_SUBSHELL=2, and so on.

BASHPID

The process ID of the current instance of bash. It is different from $$ in that $$ always stay the same for a bash script execution, representing the process ID of the top level bash process, the script itself, even if invoked from subshells with (...), whereas BASHPID has different values, depending on the subshell it is dereferenced into.

BASH_SOURCE

An array variable whose members are the source filenames where the corresponding shell function names in the FUNCNAME array variable are defined. The shell function ${FUNCNAME[$i]} is defined in the file ${BASH_SOURCE[$i]} and called from ${BASH_SOURCE[$i+1]}

${BASH_SOURCE[0]} is equivalent with $0, with the observation that ${BASH_SOURCE[0]} contains the (potentially relative) path of the containing script in all invocation scenarios, notably also when the script is sourced, which is not true for $0.

When the script is sourced, $0 contains "-bash", while ${BASH_SOURCE[0]} contains the path of the script.

DIRSTACK

Directory Manipulation Built-in Commands

IFS

IFS is the internal field separator. This variable determines how bash recognizes fields (word boundaries) when it interprets character strings. IFS defaults to whitespace (space, tab and newline). This is the proof:

echo "$IFS" | cat -vte
 ^I$
$

IFS can be changed. For example, this is how you set IFS so for iterates over lines:

IFS="$(printf '\n\r')"
Note you must set IFS back to whitespace after setting it to something else, so the basic shell function work as expected. This is done as shown below: restoring the default IFS value.

To research, IFS= seems equivalent with IFS="$(printf '\n\r')" in that it recognizes '\n' and '\r' as separators but not the space ' '. It did not work for me, but why it worked in examples?

Restoring the default IFS value

IFS="$(printf ' \t\n\r')"

IFS and for

for honors the value of IFS (default the space). If you set IFS to something else, before the for statement, for will use that as field separator while iterating over the list.

Note be extremely careful when setting IFS before a for loop, even if you restore the default value after the loop: everything inside the loop will use the non-standard IFS value and it may not work as expected.

Also see:

IFS and read

IFS characters are used to split the line processed by read into words.

PATH

PATH

PIPESTATUS

See:

Pipeline

PPID

The process ID of the shell's parent. This variable is readonly.

PS1

Bash Prompt

FUNCNAME

An array containing the names of all shell functions currently in the execution call stack. Invoked as ${FUNCNAME} returns the name of the current function. See:

The FUNCNAME Array

OLDPWD

Contains directory before the last cd command.

cd directory
echo $OLDPWD
/home/user

LD_LIBRARY_PATH

https://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html
Linux Shared Libraries

LD_PRELOAD

https://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html
Linux Shared Libraries