Linux 中花括号的评估

Evaluation of curly braces in Linux

我注意到我们可以使用花括号使一些命令在评估为参数列表时更短。

输入:

echo a{,b,c}

输出:

a ab ac

如何在从文件传递参数时强制执行相同的行为?

输入:

cat file.txt | xargs echo

输出:

a{,b,c}

预期输出 - 与前面的示例相同。

那个 {} 扩展是一个 bash / zsh 特性,因此你需要明确地 运行 它通过任何这些 shell,在你的情况下是(使用 -I<STRING> 让 xargs 在 运行 之前的字符串中替换它):

cat file.txt |xargs -I@ bash -c 'echo @' 
  1. xargs 调用 $PATH 中的 echo,而不是 shell 的内置回显。
  2. 检查 list of bash expansions:首先发生大括号扩展,因此它不会有机会在该管道中扩展。

你必须做类似的事情

while read -r line; do eval echo "$line"; done < file.txt

如果有人在该文件中放入恶意内容,您将面临各种恶意攻击。

除了询问您为什么要这样做...我提供以下内容:

将字符串添加到文件中:

echo 'a{,b,c}' > /tmp/foo

将字符串放入变量中:

export thing=`cat /tmp/foo`

eval 字符串:

eval $thing

如果文件中有一堆这样的文件,那么 运行 文件通过一个循环并评估循环值:

echo 'a{,b,c}' >> /tmp/foo
echo 'a{,b,c}' >> /tmp/foo
echo 'a{,b,c}' >> /tmp/foo

for i in `cat /tmp/foo`; do eval echo $i; done