Unset an environment variable for a single command
在bash中,我们可以通过以下方式为单个命令设置环境变量:
如果我们想为单个命令取消设置一个变量怎么办?
- 相关的不仅仅是单个命令:stackoverflow.com/questions/6877727/…
从技术上讲,它们不是环境变量,除非有人使用它们。但您至少可以将它们设置为空:
如果将它们从环境中删除足够多,则可以使用env:
- 您还可以使用子外壳:(unset FOO; some command)。但是无论如何,我认为空环境变量不同于不存在的环境变量,所以我不会使用FOO= some command方法。
- (我也是)。(哎呀,好久不见了!)
- 从技术上讲,它们是环境变量,而不是当前环境:变量被添加到执行命令的环境中,不会影响当前shell环境。
- @Glennjackman不,JB所说的是,单独运行FOO=bar不会设置环境变量,除非FOO被导出。
- 我又看了一眼bash文档,它实际上也使用了shell局部变量的术语environment。但是对于非导出的,我认为这确实是一个实现细节。我今晚不去查查它是否打电话给setenv。
- @jb:它也不为导出的变量调用setenv,但它会将它们添加到传递给子进程的环境变量列表中。由于bash并没有真正区分环境变量和其他类型的变量,因此在执行的shell中,export的结果并不特别可见。(当然,您可以看到declare -p的区别。)无论您对空变量和不存在变量的感觉如何,bash也不会真正区分它们,除非您set -u--如果您这样做,许多标准脚本都将中断。
- 将变量设置为空是为了达到我的目的(尽管我没有预料到)。谢谢!
- @约翰:我就是这样,我没注意到。我将删除我的评论。
- @蓖麻毒素,作为一个command,可能有一个make,它不同于哪些环境变量是未设置的,哪些环境变量只是空的。
- @jb.,对于该特定命令,FOO将被设置为环境变量。
- @是的,这就是命令周围的文本所解释的。
这将从somecommand进程环境中删除环境变量FOO。
取消设置多个变量:
1
| env -u FOO -u FOO2 somecommand |