是否可以设置一个可以从任何 shell(而不是特定 shell)访问的环境变量,并且在会话结束后不会立即衰减?
我想在系统范围内设置一个NODE_ENV
变量,如何实现?
答案1
如果您感兴趣的所有 shell 都与 Bourne 兼容,则可以用于/etc/profile
此目的。
的标题/etc/profile
:
# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...)
为了确保您已掌握csh
并tcsh
涵盖,您还可以将变量添加到/etc/csh.login
.
的标题/etc/csh.login
:
# /etc/csh.login: system-wide .login file for csh(1) and tcsh(1)
为了zsh
,你想要/etc/zshenv
。
为了便于维护
我会将您想要的所有变量写入一个文件中,并编写一个简单的 Perl(或其他)脚本来读取这些变量并更新所有 shell 的相关文件。
Perl 中类似以下的内容应该可以工作:
#!/usr/bin/perl
use strict;
use warnings;
my $bourne_file = '/etc/profile';
my $csh_file = '/etc/csh.login';
my $zsh_file = '/etc/zshenv';
open my $BOURNE,'>>', $bourne_file;
open my $CSH,'>>', $csh_file;
open my $ZSH,'>>', $zsh_file;
while(<DATA>){
chomp;
my $delimiter = ','; #Change , to whatever delimiter you use in the file
my ($var, @value) = split /$delimiter/;
my $value = join $delimiter,@value;
print $BOURNE qq{export $var="$value"\n};
print $CSH qq{setenv $var "$value"\n};
print $ZSH qq{export $var="$value"\n};
}
close $BOURNE;
close $CSH;
close $ZSH;
__DATA__
var1,val1
var2,val2
您可以使用除分隔变量和值之外的分隔符,,
只要变量名称中不允许使用此分隔符即可。
这可以通过在您希望脚本在每个文件中写入的部分周围插入唯一的分隔符来进一步整理,以便每次使用脚本更新文件时,它不会重复以前的条目,而是替换它们就地。