sudoを付けたリダイレクトは失敗する
一般ユーザーで/etc配下などroot権限が必要なファイルにリダイレクト(>)で書き込もうとすると、sudoを付けても失敗する。
$ echo newcontent > /etc/protected.conf
bash: /etc/protected.conf: Permission denied
$ sudo echo newcontent > /etc/protected.conf
bash: /etc/protected.conf: Permission denied
リダイレクトはシェル自身がファイルを開く処理であり、sudoはその後ろのechoコマンドにしか適用されない。ファイルを開く時点ではまだ一般ユーザーの権限のままのため、権限エラーになる。
sudo teeで書き込む
sudoをteeコマンドに対して付けると、ファイルを開く処理自体がroot権限で行われるため書き込める。
コマンド | sudo tee ファイルパス
$ echo newcontent | sudo tee /etc/protected.conf
newcontent
$ cat /etc/protected.conf
newcontent
パイプの左側echoは一般ユーザーのまま実行されるが、右側のteeコマンドがsudoによってroot権限で実行され、ファイルを開いて書き込む。
標準出力への表示が不要な場合
sudo teeは画面にも内容を表示するため、不要であれば標準出力を/dev/nullにリダイレクトする方法と組み合わせられる。
$ echo newcontent | sudo tee /etc/protected.conf > /dev/null
参考: teeコマンドで標準出力を捨ててファイルにだけ保存する
\第一線のプログラマーの行動原理を学べる!/
