書き込み権限のないファイルに標準出力をリダイレクトします。

書き込み権限のないファイルに標準出力をリダイレクトします。

書き込み権限なしでファイルを変更しようとすると、次のエラーメッセージが表示されます。

> touch /tmp/foo && sudo chown root /tmp/foo
> echo test > /tmp/foo
zsh: permission denied: /tmp/foo

Sudoingはコマンドをrootとして実行するので役に立ちませんが、シェルはstdoutリダイレクトとファイルを開くことをユーザーが行った方法で処理します。

> sudo echo test > /tmp/foo
zsh: permission denied: /tmp/foo

rootでシェルを開き、そのようにファイルを操作するだけでなく、書き込み権限のないファイルにstdoutをリダイレクトする簡単な方法はありますか?

> sudo su
# echo test > /tmp/foo

答え1

はい、使用してくださいteeecho test > /tmp/foo

echo test | sudo tee /tmp/foo

>>()を追加することもできます。

echo test | sudo tee -a /tmp/foo

答え2

ファイルの内容をシェルリダイレクト演算子の出力echoに置き換えます。>

echo test | sudo dd of=/tmp/foo

切り捨てなしでファイルに書き込むには(最初はseek出力に別のオフセットを使用できますが)(1<>Bourneシェル演算子に似ています):

echo test | sudo dd of=/tmp/foo conv=notrunc

GNUを使用してファイルに追加するには(例>>:)dd

echo test | sudo dd of=/tmp/foo oflag=append conv=notrunc

既存のファイルが破損しないようddにするには(POSIXシェルのように)GNUを参照し、その逆(既存のファイルのみを更新する場合)も参照してください。conv=exclset -o noclobberconv=nocreat

答え3

teeおそらく最善の選択でしょう。しかし、状況によっては、次のようにしても十分です。

sudo sh -c 'echo test > /tmp/foo'

答え4

spongemoreutils パッケージで使用されます。標準出力に書き込まないという利点があります。

echo test | sudo sponge /tmp/foo

-aファイルを上書きするのではなくファイルに追加するには、このオプションを使用します。

関連情報