jon*_*jon 3 environment-variables pam-environment
在环境变量的值中使用美元符号是一种不好的做法吗?
前任:
MY_VAR="$toto"
Run Code Online (Sandbox Code Playgroud)
更准确地说,我想在/etc/environment文件中将它设置为可由 Java 程序访问。我做了一个测试,它正在工作,但我只是想确保我不会遇到任何灾难性的副作用。变量的值是一个密码,以美元符号开头,所以我别无选择。
Gun*_*son 10
你的例子没有说明你的问题。
$ toto="somevalue"
$ MY_VAR="$toto"
$ echo $MY_VAR
somevalue
$
Run Code Online (Sandbox Code Playgroud)
要执行您的要求,您需要:
MY_VAR='$toto'
Run Code Online (Sandbox Code Playgroud)
或者
MY_VAR="\$toto"
Run Code Online (Sandbox Code Playgroud)
不能确定这是否是不好的做法。就我个人而言,我没有看到任何明显的问题。
许多人士指出,MY_VAR="$toto"将分配到MY_VAR的电流值$toto或情况下一个空字符串$toto未设置(或情况$toto本身就含有一个空字符串明显),但我很惊讶没有一个人指出然而,这MY_VAR="$toto"将不设置环境变量,而是一个 shell 变量(除非MY_VAR环境中已经存在命名的变量,可能是因为这只是与实际问题相切的)。
然而更重要的是,这不是一个坏习惯,或者它与在变量中包含任何其他 shell 特殊字符一样糟糕,这通常是无法避免的。
在 99% 的情况下,shell 只会在当前 shell 中扩展变量一次(或者根本不会扩展它,例如用单引号括起来时):
$ MY_VAR='$toto'
$ echo $MY_VAR
$toto
$ echo '$MY_VAR'
$MY_VAR
$ echo "$MY_VAR"
$toto
$ echo $(echo $MY_VAR)
$toto
Run Code Online (Sandbox Code Playgroud)
例如,1% 的情况是在eval表达式中引用变量时,这会增加一个间接级别:
$ MY_VAR='$toto'
$ eval echo $MY_VAR
$
Run Code Online (Sandbox Code Playgroud)
但这显然是预期的结果,同样,在变量中包含任何其他 shell 特殊字符应该被视为一种不好的做法:
$ MY_VAR='&&'
$ eval echo $MY_VAR
bash: syntax error: unexpected end of file
Run Code Online (Sandbox Code Playgroud)
(事实是,由于这个原因,使用eval通常是一种不好的做法)。
所以不,在 shell / 环境变量中使用美元符号并不是一个坏习惯,至少不会超过任何其他 shell 特殊字符。
对于 的具体情况/etc/environment,不,$变量值中的 a 并不意味着任何特殊。/etc/environment是一个由名为 的 PAM 模块读取的文件pam_env,并且pam_env具有用于解释的特定语法$:
/etc/environment,它未被解释。在/etc/security/pam_env.confand ~/.pam_environment(特定于用户的文件)中,当看到具有以下语法的行时会进行特殊pam_env处理:$
FOO DEFAULT=SOMETHING${BAR}SOMETHINGELSE$BAR
FOO OVERRIDE=SOMETHING${BAR}SOMETHINGELSE$BAR
Run Code Online (Sandbox Code Playgroud)
在本例中,${BAR}被替换为变量 的值BAR,但不是$BAR。
在这两种情况下,对于如下行:
FOO=BAR$BAR${BAR}
Run Code Online (Sandbox Code Playgroud)
变量的内容FOO将是文字字符串BAR$BAR${BAR}。
联机帮助页pam_env.conf有示例:
FOO DEFAULT=SOMETHING${BAR}SOMETHINGELSE$BAR
FOO OVERRIDE=SOMETHING${BAR}SOMETHINGELSE$BAR
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20245 次 |
| 最近记录: |