sudo権限でリダイレクト処理を行ってファイルに書き込む方法

sudo権限でリダイレクト処理を行ってファイルに書き込む方法

やりたかったこと

使用するシェルを変更しようと、/etc/shells末尾にコマンドラインからパスを追記したかったです。

which zsh >> /etc/shells

この時、/etc/shellsはrootの所有物なので、permission error が発生したため、sudo をつけて再度実施しました。

sudo which zsh >> /etc/shells

permission denied: /etc/shells

は?(強め)

原因

ファイルに書き込む際の>>>リダイレクトと呼びますが、このリダイレクト処理はsudoを頭につけようがログインユーザーの権限で行われるそうです。

解決方法: tee コマンドにパイプする

teeコマンドを使うことが解決方法の一つに挙げられることが多いようです。

teeとは入力された値を標準出力とファイル出力の両方処理するコマンドです。

コマンドなのでsudoを頭につけることができて、

which zsh | sudo tee -a /etc/shells

とすることで解決できました!

💡
-a オプションはファイル末尾に追記するときに使用します。
先頭に追加する際は外してください。

💡
標準出力が不要なら > /dev/nullを後ろにつけることで回避できます。

まとめ

最近職場に触発されて色々とコマンドライン上でやろうとする気持ちが芽生えてきているので、少しずつ覚えていこうと思います!