10

WARNING - this question is about the Bash before the vulnerability, due to which it was changed.


I have seen something like this in my bash ENV:

module=() {  eval `/usr/bin/modulecmd bash $*` }

How does this construct work? What is it called?

I'm not asking about modulecmd, I am asking about the entire construct.

mcede
  • 103
  • 1
    Are you sure you found it in that exact syntax (especially with the = sign)? Because for me, bash doesn't like it. However without the = it would be a function definition. – celtschk Aug 29 '14 at 16:13
  • Yeah, that is how it appears... There are several other examples of that also. Yeah, I tried it out and got an error from bash about it, but I have examples of it in my ENV. – mcede Aug 29 '14 at 16:30

1 Answers1

9

It's really a function named module. It appears in environment variables when you export a function.

$ test() { echo test; }
$ export -f test
$ env | sed -n '/test/{N;p}'
test=() {  echo test
}

From bash documentation - export:

export

 export [-fn] [-p] [name[=value]]

Mark each name to be passed to child processes in the environment. If the -f option is supplied, the names refer to shell functions; otherwise the names refer to shell variables. The -n option means to no longer mark each name for export. If no names are supplied, or if the -p option is given, a list of exported names is displayed. The -p option displays output in a form that may be reused as input. If a variable name is followed by =value, the value of the variable is set to value.

The return status is zero unless an invalid option is supplied, one of the names is not a valid shell variable name, or -f is supplied with a name that is not a shell function.

cuonglm
  • 153,898