it-swarm-ja.com

/ etc / Apache2 / sites-availableでsedを使用するにはどうすればよいですか?

sedを使用してApacheのdefaultファイルをコピーして書き込むスクリプトを作成しようとしています/var/www(以下の$DOC_ROOT)を自分のディレクトリ$NEW_SITES_DIRに置き換えた新しいファイル。ただし、sedはSudoで正しく動作していません。次の場合に "permission denied"エラーが発生します。

Sudo sed -ie 's:$DOC_ROOT:$NEW_SITES_DIR:g' < default > $NEW_SITE

私はしようとしました サブシェルをスポーンします

Sudo sh -c "sed -ie 's:$DOC_ROOT:$NEW_SITES_DIR:g' < default > $NEW_SITE"

そして使用する tee

Sudo sed -ie 's:$DOC_ROOT:$NEW_SITES_DIR:g' < default | Sudo tee $NEW_SITE

しかし、代わりに "入力ファイルがありません"エラーが発生します。

私が書いた最後の2つの試みは少しずれていると確信しています。任意の提案をいただければ幸いです。


[〜#〜]回答済み[〜#〜]

皆様のご協力に感謝いたします。正確なコマンドは次のとおりです。

Sudo sed -e "s:$DEF_SITES_DIR:$NEW_SITES_DIR:g" < $DEF_SITE | Sudo tee $NEW_SITE

そしてここに この参照 からのキーフレーズがあります:

これで眠りにつくことはありませんが、いつか便利になります。コマンドの「>」の後に「Sudo」が適用されない理由がわかったら、Tシャツを覚えてここに戻ってください。

4
Matt Norris

あなたの問題は-iです。これは、sedにファイルをその場で編集するように指示していますが、リダイレクトすることによってstdinでファイルを提供しています。 -iを削除してみてください。

sedはファイル名を引数として受け入れるため、入力ファイルをリダイレクトする必要はありません。ファイルの読み取り権限が制限されている場合は、Sudo sed(およびリダイレクトを使用しない)がそれを処理します。 -iを使用しないと、元のファイルはそのまま残ります。

Sudo teeは、必要に応じて出力の書き込み権限を処理する必要があります。