peonicles
peonicles

Reputation: 1637

What do the characters in the bash environment variable $- mean?

I've been looking through some of the .bashrc and .profile scripts that come with various Linux distros and am seeing that sometimes they check $-.

Here's one in Ubuntu

case $- in
    *i*) ;;
    *) return;;
esac

In this case it's checking for the "i" flag is present to see if the current shell is an interactive one.

My current session gives me this :

# echo $-
himBH

What are the other flags/options mean? Is there a comprehensive list somewhere?

Upvotes: 14

Views: 2889

Answers (2)

phihag
phihag

Reputation: 287755

From man bash:

-

Expands to the current option flags as specified upon invocation, by the set builtin command, or those set by the shell itself (such as the -i option).

So these are the current options that control the behavior of the shell. In particular:

  • h: Cache location of binaries in the $PATH. Speeds up execution, but fails if you move binaries around during the shell session.
  • i: The current shell is interactive
  • m: Job control is enabled
  • B: Brace expansion is enabled
  • H: History substitution like !-1

Upvotes: 23

pgl
pgl

Reputation: 7981

They mean various things. Each letter corresponds to an option being set for bash. eg, "i" means that the shell is interactive (so the code sample you gave is a test to see if it's an interactive shell or not).

A full list is available in the bash man page. Look for "set" - here's the first line:

set [+abefhkmnptuvxBCEHPT] [+o option-name] [arg ...]

Upvotes: 1

Related Questions