重複の可能性:
書き込み権限のないファイルに標準出力をリダイレクトします。
次のコマンドを実行するとsudo echo 'text' >> /file.txt
失敗します。
bash: /file.txt: Permission denied
答え1
リダイレクトは、適用されたコマンドではなくシェルによって実行されるため、機能しません。ただし、シェルはrootのようにrootとして実行されませんecho 'text'
。
ファイルへの書き込みにはルートアクセスが必要ですが、データを生成する必要がない場合は、一般的な方法は以下を使用することですtee
。
echo 'text' | sudo tee -a /file.txt
tee
また、テキストを標準出力として印刷します。これをサイレントにしてシェルを追加する(>>
)のように動作させるには、stdoutを次にルーティングします/dev/null
。
echo 'text' | sudo tee -a /file.txt > /dev/null
データを生成するためにルートアクセスが本当に必要な場合は、2つの別々のsudo
コマンドを実行するか、内部でシェルを実行しsudo
てそこにリダイレクトできます(引用符に注意してください)。
sudo echo 'text' | sudo tee -a /file.txt
sudo sh -c 'echo "text" >>/file.txt'
追加せずに上書きするときに演算子>
()を使用してset -o noclobber
既存のファイルを切り捨てることを拒否するシェルに慣れている場合は、この保護が適用されないことに注意してください。無視sudo sh -c 'echo >/etc/passwd'
してその設定をランチャーにも適用する必要があります。sudo tee /etc/passwd
/etc/passwd
sudo sh -o noclobber -c 'echo >/etc/passwd'
noclobber
sh
sudo
答え2
bashにファイルを開き、そのファイルにコマンド出力を追加するように指示しますsudo echo 'text'
。もちろん、bashがrootではなくユーザーとして実行されているため、動作しません。対話的に、私は通常sudo -s
この問題を解決するために実行します(それからシェルはrootとして実行され、ファイルを開くことができます)。あるいは、実行するsudo sh -c "echo 'text' >> /file.txt"
と機能しますが、すべての補間/エスケープが干渉する可能性がある複雑な式がある場合は、少し面倒です。