在bash中使用variablesheredoc

我试图插入一个bash heredoc里面的variables:

var=$1 sudo tee "/path/to/outfile" > /dev/null << "EOF" Some text that contains my $var EOF 

这不工作,因为我所期望的($ var是字面上处理,不扩大)。

我需要使用sudo tee,因为创build文件需要sudo。 做的事情如:

 sudo cat > /path/to/outfile <<EOT my text... EOT 

不起作用,因为> outfile在当前shell中打开文件,而不是使用sudo。

在回答你的第一个问题时,没有参数replace,因为你已经把分隔符放在了引号中 – bash手册说 :

这里的文件格式是:

  <<[-]word here-document delimiter 

执行参数扩展,命令replace,算术扩展或path名扩展。 如果单词中的任何字符被引用,则分隔符是对单词的引用删除的结果,并且这里的文档中的行不被扩展。 如果单词不加引号,那么这里的文档的所有行都要进行参数扩展,命令replace和算术扩展。 […]

如果你改变你的第一个例子使用<<EOF而不是<< "EOF"你会发现它的工作原理。

在第二个示例中,shell仅使用参数cat调用sudo ,并且redirect适用于作为原始用户的sudo cat的输出。 它会工作,如果你尝试:

 sudo sh -c "cat > /path/to/outfile" <<EOT my text... EOT 

不要使用带<<EOF引号:

 var=$1 sudo tee "/path/to/outfile" > /dev/null <<EOF Some text that contains my $var EOF 

variables扩展是here-docs中的默认行为。 您可以通过引用标签(使用单引号或双引号)来禁用该行为。