2014-03-25 48 views
6

我正在處理makefile規則,並希望在遞歸調用make之前取消設置環境變量MAKEFILES。在其他BSD系統,我不喜歡這樣寫道:如何在OS X上取消設置env變量?

env -u MAKEFLAGS $(MAKE) $(SUBDIR_ARGS) 

在Linux上,我不喜歡這樣寫道:

env --unset=MAKEFLAGS $(MAKE) $(SUBDIR_ARGS) 

然而,無論是風格是工作在Macintosh OS X小牛隊,雖然,我會期望在其他地方使用的BSD風格有效。

我與BSD風格的調用得到的錯誤是:

env: illegal option -- u 

我怎樣才能調用在OS X中的命令之前取消設置一個環境變量,爲什麼不在別處使用BSD風格的工作嗎?

這裏是Mac的手冊頁ENV:

ENV(1)     BSD General Commands Manual     ENV(1) 

NAME 
    env -- set and print environment 

SYNOPSIS 
    env [-i] [name=value ...] [utility [argument ...]] 

DESCRIPTION 
    env executes utility after modifying the environment as specified on the command line. The option name=value specifies an environmental variable, name, with a value of value. The option `-i' causes env to completely ignore the environment it inherits. 

    If no utility is specified, env prints out the names and values of the variables in the environment, with one name=value pair per line. 

DIAGNOSTICS 
    If the utility is invoked, the exit status of env shall be the exit status of utility; otherwise, the env utility exits with one of the following values: 

    0  The env utility completed successfully 

    1-125 An error occurred in the env utility. 

    126  The utility specified by utility was found, but could not be invoked. 

    127  The utility specified by utility could not be found. 

COMPATIBILITY 
    The historic - option has been deprecated but is still supported in this implementation. 

SEE ALSO 
    execvp(3), environ(7) 

STANDARDS 
    The env utility conforms to IEEE Std 1003.2-1992 (``POSIX.2''). 

BUGS 
    env doesn't handle commands with equal (``='') signs in their names, for obvious reasons. 

BSD        August 27, 1993       BSD 

回答

9

使用unset命令。來自man pages

unset 

Remove variable or function names - the opposite of set. 

Syntax 
    unset [-fv] [name ...]  

    Key 
    -v Each name refers to a shell variable.(default) 

    -f Each name refers to a shell function, and the function definition is removed. 

    Example 

$ unset myvariable 

Each unset variable or function is removed from the environment passed to subsequent commands. If any of RANDOM, SECONDS, LINENO, HISTCMD, FUNCNAME, GROUPS, or DIRSTACK are unset, they lose their special properties, even if they are subsequently reset. 

The exit status is true unless a name is readonly. It is not an error for nothing to be unset. 

unset is a bash built in command. 

"Look Dave, I can see you're really upset about this" ~ HAL (Space 2001)