2011-12-29 10 views
0

私はシェルスクリプトを作成しており、STDOUTをsuコマンド内のファイルにパイプしたいと考えています。出力されたファイルは別のユーザーが所有する必要があります。したがって、suを使用します。しかし、出力するテキストと出力ファイルの名前がの変数(下の例を参照)である場合、suと連携するパイプを取得できません。suと変数付きパイプ

私の回避策は、suを使用せずにファイルにパイプし、必要なユーザーにそのファイルをchownすることです。しかし、suを使ってこれを行う「一歩」の方法があるのだろうか? (例示のみのため)

例:

bash: : No such file or directory 

私はダブルを削除する場合:

#!/bin/sh 

message="Hello World"; 
file="/tmp/HelloWorld.txt"; 

su someuser -c 'echo "${message}" > "${file}"'; 

この例では、私は次のエラーを取得するように私は、二重引用符で${file}を置く場合

bash: ${file}: ambiguous redirect 
+0

鮮やかな - それは動作します!そして、このような迅速な返事、ありがとう! – Francis

+0

ファイルに「リダイレクト」し、プロセスに「パイプ」します。通常のファイルはパイプではありません。 –

答えて

1

試し:周り-quotes ${file}、私は次のエラーを取得しますsu someuser -c "echo \"${message}\" > ${file}";

一重引用符内の変数は展開されません。

+0

はい、thx v多く、これは素晴らしいです! – Francis

+0

これらのエスケープされた二重引用符は必要ないと少しだけ注意してください。コードを削除することで、コードをもっと見やすくしてください(例えば、[...] -c "echo $ message> $ file")。 – dimir

+0

@dimir、一般的にはそれらを必要とするか、または引数を単一引用符で囲む必要があります(これも同様です)。 'rm'や' echo'の代わりに他のコマンドを呼び出すことを考えてください。引用なしでは、 'rm'は' Hello''と 'World'の二つの引数で呼び出され、一つの引数' HelloWorld'が必要です。 – khachik

関連する問題