239

bashヒアドキュメント内で変数を補間しようとしています:

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

>outfilesudo を使用していない現在のシェルでファイルを開くため、機能しません。

4

3 に答える 3

297

最初の質問への回答では、区切り文字を引用符で囲んだため、パラメーターの置換はありません-bashマニュアルには次のように書かれています:

ヒアドキュメントの形式は次のとおりです。

      <<[-]word
              here-document
      delimiter

wordでは、パラメーター展開、コマンド置換、算術展開、またはパス名展開は実行されません。word内の文字が引用されている場合、 区切り文字は word での引用の削除の結果であり、ヒアドキュメント内の行は展開されません。wordが引用符で囲まれていない場合、ヒアドキュメントのすべての行がパラメーター展開、コマンド置換、および算術展開の対象となります。[...]

最初の例を<<EOF代わりに使用するように変更する<< "EOF"と、それが機能することがわかります。

2 番目の例では、シェルはsudoパラメーターcatでのみ呼び出し、リダイレクトはsudo cat元のユーザーとしての出力に適用されます。試してみるとうまくいきます:

sudo sh -c "cat > /path/to/outfile" <<EOT
my text...
EOT
于 2011-02-08T20:43:53.027 に答える
116

で引用符を使用しないでください<<EOF:

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

変数展開は、ヒアドキュメント内のデフォルトの動作です。ラベルを (一重引用符または二重引用符で) 引用することにより、その動作を無効にします。

于 2011-02-08T20:43:55.127 に答える