在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中的默认行为。 您可以通过引用标签(使用单引号或双引号)来禁用该行为。