2016-05-04 13 views
2

以前はいつも特権ファイルを変更するためにsedteeを組み合わせて使用​​しました。これは素晴らしい仕事を、時特権付きシンボリックリンクでSedを使用

sed -r 'script' "/etc/hosts" | sudo tee "/etc/hosts" 1>/dev/null 

:シェル自体がroot権限を持っていないので、私は、ファイルにコマンド出力を書き込むために創造的な取得しなければなりませんでした。ホストファイルを広告ブロックに使用し始めてから、パイプがバッファに限定されていることが分かりました。その後、ファイルが喜んで上書きされ、残りのファイルは消えてしまいます。問題のファイルがシンボリックリンクであることから、

sed -r 'script' "/etc/hosts" > "/etc/hosts.tmp" && sudo mv "/etc/hosts.tmp" "/etc/hosts" 

残念ながら、これはあまりにも動作しません。

は私もはるかに簡単なバージョンを検討しました。 mvは、下のファイルとは対照的に、シンボリックリンクを上書きします。

私の現在のソリューションはこれです:

sed -r 'script' "/etc/hosts" | sudo tee "/etc/hosts.tmp" 1>/dev/null && 
    sudo cat "/etc/hosts.tmp" | sudo tee "/etc/hosts" 1>/dev/null && 
    sudo rm "/etc/hosts.tmp" 

うわ!どのように冗長です!

これを行うクリーナーの方法はありますか?

+0

'cat'の無用な使用:' sudo tee/etc/hosts chepner

+0

役に立たないと言う無駄な迷惑メール。 'sudo tee 'で作成された'/etc/hosts.tmp'がシェルによって読み込み可能であるという保証はないので、これはうまくいかないでしょう。 –

+0

ファイルを作成しています。ファイルを作成するために 'sudo'を使う必要はありません(最初に'/etc'に一時ファイルを作成する必要はありません)。 – chepner

答えて

3

GNU sedを使用している場合は、-i in-place editionフラグを使用して、その実行結果を処理するファイルに直接保存することができます。その後、sedコマンドをsudoにするだけで十分です。

さらに、リンクではなくファイルを書き込むには、sedの--follow-symlinksフラグを使用します。

その他の場合は、this answer to a similar question on SOをチェックしてください。

+0

はい、それでも私はまだクリーンアップが必要ですか? (sedがバケツをキックするとファイルが半分になります)**編集**気にしないで、残っているファイルは '-i'に接尾辞を付ける場合にのみ表示されます。サフィックスと別の旗の違いをどうやって伝えることができるのだろうと思っていますが... –

+0

実際に私はこの答えをチェックしなくてはなりません。 'sed -i'は' mv'と同じ問題を抱えています。ファイルへのシンボリックリンク! (私はreadlinkとrealpathを試してみると、コンボが見つかると質問に投稿します) –

+0

@JV私が何かを見つけることができるかどうかをチェックさせてください – Aaron

関連する問題