このコマンドを正常に実行するスクリプトがあります。私はこの行にエラーが表示される別のスクリプトでこのコマンドを使用しています(.md5: Permission denied
)。パイプコマンドとsudo
私は以前のスクリプトをsudoで実行しています。
for i in ${NAME}*
do
sudo md5sum $i | sed -e "s/$i/${NAME}/" > ${NAME}.md5${i/#${NAME}/}
done
このコマンドを正常に実行するスクリプトがあります。私はこの行にエラーが表示される別のスクリプトでこのコマンドを使用しています(.md5: Permission denied
)。パイプコマンドとsudo
私は以前のスクリプトをsudoで実行しています。
for i in ${NAME}*
do
sudo md5sum $i | sed -e "s/$i/${NAME}/" > ${NAME}.md5${i/#${NAME}/}
done
出力をルートとしてリダイレクトするとします。リダイレクトは実行の一部ではないため、コマンドの実行ユーザーは実行しませんが、現在のユーザーはコマンドをsudo
で実行しても問題ありません。
共通トリックはtee
を使用することです:
for i in ${NAME}*
do
md5sum $i | sed -e "s/$i/${NAME}/" | sudo tee ${NAME}.md5${i/#${NAME}/}
done
注:おそらく、あなたがそれを必要としないように私は、md5sum
からsudo
を落としました。
注:tee
は、指定されたファイルと標準出力の2つの方向で出力します。 stdoutの出力を抑制するには、/dev/null
にリダイレクトします。
出力はsudo md5sum $i
で、ルートとして実行されていないsedにパイプします。 sudoはこのsedが存在することさえ知りません。
しかし、これは問題ではありません。なぜなら、sedにはroot権限が必要ないからです。問題は> ${NAME}...
です。これは、sedの出力をこの名前のファイルにリダイレクトします。しかし、リダイレクトは実際にあなたのユーザーとして実行されているシェルによって実行されます。 >
はシェル組み込み演算子であるため、接頭辞としてsudoを付けることはできません。
単純な解決策は、tee
を使用することです。 tee
は、標準出力とファイル(T-Pipeのような名前)に入力を書き込むプログラム(sudoで実行できるように)です。 だから、あなただけのことができます。
for i in ${NAME}*
do
md5sum $i | sed -e "s/$i/${NAME}/" | sudo tee ${NAME}.md5${i/#${NAME}/}
done
注これはまたあなたの標準出力にすべてのハッシュをダンプします。
私は上記のコマンドを使用してエラー((sed:-e expression#1、char 0:以前の正規表現はありません)) – Sherry
@Sherryは完全に無関係の問題のようです。たとえば、 '$ i'の値が空である場合に起こります。 'md5sum ...'行の前に 'echo" i = $ i "'行を追加して、値が正しいことを確認してください – janos