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 代码中的除法;
语句,因此发生的是运行eval
,LS_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
的列表。;