Linux で tail プログラムの出力をファイルに書き込む

Linux で tail プログラムの出力をファイルに書き込む

画面出力をファイルにリダイレクトするには、以下の形式を使用できることがわかっています。

$ your_program > /tmp/output.txt

しかし、以下のコマンドを使用すると、「-bash: /home/user/errors.txt: アクセス権が拒否されました」

sudo tail /var/log/apache2/error.log > ~/errors.txt

この出力を機能させる方法を教えていただけますか? ~/errors.txt が存在しません。リダイレクト コマンドを使用する前に、まずこの txt ファイルを作成する必要がありますか?

答え1

パイプの後ろでは、sudo は機能しません。なぜホームに書き込めないのかわかりません。ファイルがルートに属しているのかもしれません。

 sudo tail /var/log/apache2/error.log | sudo tee ~/errors.txt

パイプの背後に別のユーザーが必要なのかもしれません。確かに、既存のファイルは必要ありません。

答え2

と書くとsudo somecommand > ~/errors.txt、 を呼び出している(そしてあなたとして実行されている)シェルがsudoリダイレクトと のオープンを実行します~/errors.txt。 を参照してください。書き込み権限のないファイルに stdout をリダイレクトする通常、その場合の問題は、root にファイルに書き込むようにすることです。これを行う方法については、リンクされた質問を参照してください。

ここで、ホーム ディレクトリのファイルに書き込めないのは奇妙です。おそらく、以前に に root として出力を保存し/home/user/errors.txt、そのファイルが存在し、root に属している可能性があります。ファイルを削除します ( に書き込み権限がある限り/home/user、これを行うことができます)。その後、ユーザーとしてファイルを作成できるようになります。

rm ~/errors.txt
sudo tail /var/log/apache2/error.log > ~/errors.txt

ファイルが本当に存在しない場合は、ホーム ディレクトリへの書き込み権限がありません。技術的には可能ですが、一部の制限されたユーザーにとっては実際に役立つこともありますが、非常にまれです。

関連情報