为什么这一系列的shell在eval()中起作用,但在bash中失败了

时间:2014-07-22 08:30:47

标签: linux bash shell eval cut

制作了一个简单的Shell脚本,如下所示:

#!/bin/sh
SHOWIT="echo \"a b c\""
GETIT="cut -f 3 -d' '"
echo "$SHOWIT|$GETIT"
eval "$SHOWIT|$GETIT"
$SHOWIT|$GETIT

表达式" $ SHOWIT | $ GETIT"通过eval工作,但直接将它放到Shell命令时命中错误。

echo "a b c"|cut -f 3 -d' '
c
cut: ': No such file or directory  <== Hit error at here

BTW,我的默认shell是RHEL6.3上的BASH 4.1.2。

#bash --version
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)

任何人都可以帮助找到错误的根本原因?非常感谢。

1 个答案:

答案 0 :(得分:1)

因为使用eval你的命令就像这样:

echo "a b c" | cut -f 3 -d' '

但仅使用单词拆分,您的命令只有这样:

echo "\"a" "b" "c\"" | cut "-f" "3" "-d'" "'"

变量不会被双重解析,即只能进行一次单词分词,并且内部的引号只会被忽略。