質問: ``` echo -e "\nexport PYENV_ROOT=$PYENV" | sudo tee -a ~/.bash_profile >> /dev/null ``` というシェルスクリプトの書き方を見かけたのですが ``` echo "\nexport PYENV_ROOT=$PYENV" >> ~/.bash_profile ``` と何か違いがあるのでしょうか tee -a コマンド 自分が所持してるに決まってる .bash_profile に sudo をつける意図 の2点がよくわからないのですが説明していただけるとありがたいです .bash_profile が存在しなかった場合 .bash_profile が作成され所有者は実行ユーザではなく root で作成されてしまうのでかえってまずい結果になりそうな気がします 単なるミスなのかこういう書き方をすることでメリットや慣習があれのか知りたいです
回答: echo -e echo コマンドは外部コマンドかシェルの内部コマンドか、また内部コマンドでもシェルの種類によって動作が違うので、`man echo` では動作の詳細がわからない事が有ります。 今回の場合はおそらく bash の内部コマンドの echo の動作だと思うので、`man bash` で調べる必要が有ります。 bash のマニュアルでの echo の説明には以下のように書かれています。 > > If the -e option is given, interpretation of the following backslash-escaped characters is enabled. > > ~略~ > > \n new line > > > つまり `-e` を付けると `\n` が改行に変換されて出力されるという事です。逆に `-e` を付けないと '\n' がそのまま出力されます。 tee -a `tee -a` は標準入力から読んだ内容をファイルに追加すると同時に標準出力にも出力するコマンドですが、標準出力は /dev/null にリダイレクトして捨てているので、単純にファイルに追記するコマンドとして利用しています。 これだけだと `>>` で追記するのと違いが判りづらいですが、今回の場合は `sudo` と組み合わせている事に意味があります。 `echo -e "hoge" | sudo tee -a ~/.profile >> /dev/null` の場合は `tee` がroot権限で起動されてファイルに追記します。 一方 `sudo echo "hoge" >> ~/.profile` の場合は、echo コマンドがroot権限で起動されますが、その出力をリダイレクトでファイルに書き込む(出力先を~/.profileにする)のはシェルが行う為、`sudo`による権限昇格の影響を受けません。