我正在尝试在 bash heredoc 中插入变量:
var=$1 sudo tee "/path/to/outfile" > /dev/null << "EOF" Some text that contains my $var EOF
这不像我预期的那样工作(按$var字面意思处理,而不是扩展)。
$var
我需要使用sudo tee,因为创建文件需要 sudo。做类似的事情:
sudo tee
sudo cat > /path/to/outfile <<EOT my text... EOT
不起作用,因为>outfile在当前 shell 中打开文件,而不是使用 sudo。
>outfile
在回答您的第一个问题时,没有参数替换,因为您已将分隔符放在引号中 - bash 手册说:
这里文档的格式是: <<[-]word here-document delimiter 不会对word 执行参数扩展、命令替换、算术扩展或路径名扩展。如果 word 中的任何字符被引用,则 分隔符 是 word 上去除引号的结果,并且 here-document 中的行不展开。如果 word 没有被引用,则 here-document 的所有行都经过参数扩展、命令替换和算术扩展。[…]
这里文档的格式是:
<<[-]word here-document delimiter
不会对word 执行参数扩展、命令替换、算术扩展或路径名扩展。如果 word 中的任何字符被引用,则 分隔符 是 word 上去除引号的结果,并且 here-document 中的行不展开。如果 word 没有被引用,则 here-document 的所有行都经过参数扩展、命令替换和算术扩展。[…]
如果您将第一个示例更改为使用<<EOF而不是,<< "EOF"您会发现它有效。
<<EOF
<< "EOF"
在您的第二个示例中,shellsudo仅使用参数调用cat,并且重定向适用于sudo cat原始用户的输出。如果您尝试,它将起作用:
sudo
cat
sudo cat
sudo sh -c "cat > /path/to/outfile" <<EOT my text... EOT