长话短说

长话短说

eval当语句作为命令的一部分附加到文件时,如何阻止语句进行评估cat << __EOF__

长话短说

我管理大量 Linux 服务器上的服务。通常,由于 指定的一些默认终端颜色LS_COLORS,我最终会感到头疼,因此我编写了一个快速脚本,只需将其粘贴到终端中即可解决颜色问题。这个脚本是:

cat >> ~/.dircolors << __EOF__
OTHER_WRITABLE 01;30;41 # dir that is other-writable (o+w) and not sticky
__EOF__
cat >> ~/.bashrc << __EOF__

# Customize directory listing colors.
eval `dircolors ~/.dircolors`
export LS_COLORS
__EOF__
eval `dircolors ~/.dircolors`

这对于我指定的会话效果很好,但是当我重新登录时,出现以下错误:

-bash: 30: command not found
-bash: 41:: command not found
[me@myserver ~]$

我确信你们中的一些人已经意识到,当我查看我的 时.bashrc,最后 4 行如下所示:

# Customize directory listing colors.
eval LS_COLORS='ow=01;30;41:';
export LS_COLORS
export LS_COLORS

但是,如果我将其改回:

eval `dircolors ~/.dircolors`

下次登录时一切正常。

答案1

这里评估的不是eval.eval你脚本中的单词是完全惰性的。毕竟,您会注意到它出现在输出中。

评估的是命令替换(反引号中的部分)。要在写入文件的文本中包含文字反引号,请使用反斜杠保护它们:

cat >> ~/.bashrc << __EOF__

# Customize directory listing colors.
eval \`dircolors ~/.dircolors\`
export LS_COLORS
__EOF__

或者,使此处文档成为文字文档,即按原样采用文本而不是执行变量和命令替换。您可以通过在运算符后面引用结束标记的任何部分来完成此操作<<

cat >> ~/.bashrc <<\__EOF__

# Customize directory listing colors.
eval `dircolors ~/.dircolors`
export LS_COLORS
__EOF__

答案2

shell 代码中的除法;语句,因此发生的是运行evalLS_COLORS=ow=01然后是命令30,然后是命令41:。这可以通过一些测试echo调用观察到:

% echo 'test;echo hi;echo there'
test;echo hi;echo there
% eval echo 'test;echo hi;echo there'
test
hi
there
% 

一个解决方案涉及更多引用:

% eval "echo 'test;echo hi;echo there'"
test;echo hi;echo there
% 

这样eval只能看到一个命令(带有一些参数)而不是分隔命令echo的列表。;

相关内容