---
name: "getenv"
section: "3"
platform: "macos"
package: "Libc"
version: "1752.120.2"
release: "macOS 26.5"
platforms: ["linux", "freebsd", "macos"]
url: "https://new.carta.tech/getenv"
---

# getenv(3)

environment variable functions

## NAME

**getenv**, **putenv**, **setenv**, **unsetenv** – environment variable functions

## LIBRARY

Standard C Library (libc, -lc)

## SYNOPSIS

**#include \<stdlib.h\>**

*char* *\**\

**getenv**(*const char \*name*);

*int*\

**setenv**(*const char \*name*, *const char \*value*, *int overwrite*);

*int*\

**putenv**(*char \*string*);

*int*\

**unsetenv**(*const char \*name*);

## DESCRIPTION

These functions set, unset and fetch environment variables from the host *environment* *list*.

The **getenv**() function obtains the current value of the environment variable, *name*. The application should not modify the string pointed to by the **getenv**() function.

The **setenv**() function inserts or resets the environment variable *name* in the current environment list. If the variable *name* does not exist in the list, it is inserted with the given *value*. If the variable does exist, the argument *overwrite* is tested; if *overwrite* is zero, the variable is not reset, otherwise it is reset to the given *value*.

The **putenv**() function takes an argument of the form \`\`name=value'' and is equivalent to:

```
setenv(name, value, 1);
```

The string pointed to by *string* becomes part of the environment. A program should not alter or free the string, and should not use stack or other transient string variables as arguments to **putenv**(). The **setenv**() function is strongly preferred to **putenv**().

The **unsetenv**() function deletes all instances of the variable name pointed to by *name* from the list. Note that only the variable name (e.g., "NAME") should be given; "NAME=value" will not work.

## RETURN VALUES

The **getenv**() function returns the value of the environment variable as aNUL -terminated string. If the variable *name* is not in the current environment, NULL is returned.

The **setenv()**, **putenv()**, and **unsetenv()** functions return the value 0 if successful; otherwise the value -1 is returned and the global variable errno is set to indicate the error.

## ERRORS

- \[EINVAL\]

  The function **getenv**(), **setenv**() or **unsetenv**() failed because the *name* is a NULL pointer, points to an empty string, or points to a string containing an “=” character.

  The function **putenv**() failed because *string* is a NULL pointer or *string* is without an “=” character.

- \[ENOMEM\]

  The function **setenv**(), **unsetenv**() or **putenv**() failed because it was unable to allocate memory for the environment.

## LEGACY SYNOPSIS

**#include \<stdlib.h\>**

*void*\
 **unsetenv**(*const char \*name*);

**unsetenv**() doesn't return a value.

## COMPATIBILITY

**putenv**() no longer copies its input buffer. This often appears in crash logs as a crash in **getenv**(). Avoid passing local buffers or freeing the memory that is passed to **putenv**(). Use **setenv**(), which still makes an internal copy of its buffers.

**unsetenv**() no longer parses the variable name; e.g., unsetenv ("FOO=BAR") no longer works. Use unsetenv("FOO"). **unsetenv**() also now returns a status value and will set *errno* to EINVAL if *name* is not a defined environment variable.

## SEE ALSO

[csh(1)](/csh/1.md), [sh(1)](/sh/1.md), [execve(2)](/execve/2.md), [compat(5)](/compat/5.md), [environ(7)](/environ/7.md)

## STANDARDS

The **getenv**() function conforms to ISO/IEC 9899:1990 (“ISO C90”). The **setenv**(), **putenv**() and **unsetenv**() functions conforms to IEEE Std 1003.1-2001 (“POSIX.1”).

## HISTORY

The functions **setenv**() and **unsetenv**() appeared in Version 7 AT&T UNIX. The **putenv**() function appeared in 4.3BSD-Reno.

## BUGS

Successive calls to **setenv**() that assign a larger-sized *value* than any previous value to the same *name* will result in a memory leak. The FreeBSD semantics for this function (namely, that the contents of *value* are copied and that old values remain accessible indefinitely) make this bug unavoidable. Future versions may eliminate one or both of these semantic guarantees in order to fix the bug.
