linux - 为什么这行 Shell 在 eval() 中有效但在 bash 中失败

标签 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

顺便说一句,我的默认 shell 是 RHEL6.3 上的 BASH 4.1.2。

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

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

最佳答案

因为使用 eval 你的命令会变成这样:

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

但是只用分词的话,你的命令只是这样的:

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

变量不会被双重解析,即它只会被分词一次,其中的引号会被忽略。

关于linux - 为什么这行 Shell 在 eval() 中有效但在 bash 中失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24882446/

相关文章:

regex - 我正在尝试使用包含 "awk"的 shell 脚本来针对文件运行

linux - 如何从输入文件读取路径

python - 在Linux上编译的Python源代码

linux - 通读所有文件并在 Linux 中应用命令

macos - 如何在不显示乱码输出的情况下使 bash 反向搜索在 Terminal.app 中工作?

bash - 在 bash 脚本中随机循环几天

c - 将数据写入 fork 管道不起作用

c - 如何在 C 中获得不同时区的 Epoch 日期和时间?

linux - Grep,查找具有确切数量的匹配模式的行

linux - 如何将当前路径复制到剪贴板?