在 bash 定界文档中使用变量
我正在尝试在 bash Heredoc 中插入变量:
var=$1
sudo tee "/path/to/outfile" > /dev/null << "EOF"
Some text that contains my $var
EOF
这并不像我期望的那样工作($var
按字面意思处理,而不是扩展)。
我需要使用 sudo tee,因为创建文件需要 sudo。执行以下操作:
sudo cat > /path/to/outfile <<EOT
my text...
EOT
不起作用,因为 >outfile
在当前 shell 中打开文件,而当前 shell 不使用 sudo。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
在回答您的第一个问题时,没有参数替换,因为您已将分隔符放在引号中 - bash 手册说:
如果您将第一个示例更改为使用
< 而不是
<< “EOF”
你会发现它有效。在第二个示例中,shell 仅使用参数
cat
调用sudo
,并且重定向适用于作为原始用户的sudo cat
的输出。如果你尝试的话,它会起作用:In answer to your first question, there's no parameter substitution because you've put the delimiter in quotes - the bash manual says:
If you change your first example to use
<<EOF
instead of<< "EOF"
you'll find that it works.In your second example, the shell invokes
sudo
only with the parametercat
, and the redirection applies to the output ofsudo cat
as the original user. It'll work if you try:不要在
< 中使用引号:
变量扩展是此处文档中的默认行为。您可以通过引用标签(使用单引号或双引号)来禁用该行为。
Don't use quotes with
<<EOF
:Variable expansion is the default behavior inside of here-docs. You disable that behavior by quoting the label (with single or double quotes).
作为此处早期答案的最新推论,您可能最终会遇到这样的情况:您希望对一些变量进行插值,而不是对所有变量进行插值。您可以通过使用反斜杠来转义美元符号和反引号来解决这个问题;或者您可以将静态文本放入变量中。
演示: https://ideone.com/rMF2XA
请注意,任何引用机制 -
\ ____HERE
或"____HERE"
或'____HERE'
-- 将禁用所有变量插值,并将此处文档转换为一段文字。一个常见的任务是将本地变量与脚本结合起来,脚本应该由不同的 shell、编程语言或远程主机进行评估。
As a late corollary to the earlier answers here, you probably end up in situations where you want some but not all variables to be interpolated. You can solve that by using backslashes to escape dollar signs and backticks; or you can put the static text in a variable.
Demo: https://ideone.com/rMF2XA
Note that any of the quoting mechanisms --
\____HERE
or"____HERE"
or'____HERE'
-- will disable all variable interpolation, and turn the here-document into a piece of literal text.A common task is to combine local variables with script which should be evaluated by a different shell, programming language, or remote host.