読者です 読者をやめる 読者になる 読者になる

Web就活日記

愛と夢と人生について書きます

sudoでリダイレクトをしたいとき

Shell

sudoでリダイレクトに失敗

  • UNIX/Linuxコマンドラインで実行した結果をファイルにリダイレクトしたい時があります。(例えばPHPのバッチを実行した時に処理のログとエラーログをファイルに書き込んでおきたい。)
  • ユーザに実行権限がないディレクトリのファイルに対してリダイレクトでデータを書き込みたいとき、sudo をつけても失敗します。
  • 次はリダイレクトが失敗する例です。zsh: permission deniedと怒られます。
$ sudo echo 'redirect' >> /var/test/hoge.txt  
zsh: permission denied: /var/test/hoge.txt

うまくいく方法

以下に方法を書きます。私が知る限りでは2つ方法があります。

回避策1 : shのオプションに-cを付ける

man sudoを見てみます。そうすると以下のように実行せよという記述がありました。-cとして実行したいコマンドを""でくくるみたいです。

To make a usage listing of the directories in the /home partition.
Note that this runs the commands in a sub-shell to make the cd and file
redirection work.

$ sudo sh -c "cd /home ; du -s * | sort -rn > USAGE"

上で失敗したコマンドをこの方法でやってみます。

$ sudo sh -c "echo 'redirect' >> /var/test/hoge.txt"
$ less /var/test/hoge.txt
redirect

問題なく書き込まれました。

回避策2 : teeを使う

パイプ(|)とteeを使う事でリダイレクトを実行する事ができます。

$ echo 'redirect redirect' | sudo tee -a /var/test/hoge.txt
redirect redirect
$ less /var/test/hoge.txt
redirect
redirect redirect

※teeは-aというオプションを付けると追記モードになります。

スポンサーリンク