2017-06-08 10 views
1

私はsedコマンドを直接実行すると動作します。Bash変数からsedコマンドを実行するにはどうすればよいですか?

echo foo > /home/user/bar 
sed -i 's/foo/zoo/' /home/user/bar 

直接$(...)または `...`に埋め込まれたときにも動作します。私はbashの変数からそれを実行しようとした場合

はしかし、私はエラーを取得する:

CMD="sed -i 's/foo/zoo/' /home/user/bar" 
$CMD 

エラー:私はそれをエコーし​​、ファイルをソースの場合にも動作します

sed: -e expression #1, char 1: unknown command: `''

echo $CMD > file 
source file 

ここでは何が起きていますか、sedコマンドをBash変数から実行するにはどうすればよいですか?

答えて

3

ワード分割を避けるために完全なコマンドに文字列変数を格納しないでください。

# store command in an array 
cmd=(sed -i 's/foo/zoo/' /home/user/bar) 

# execute the command 
"${cmd[@]}" 

さもないと、シェルの機能を使用します:配列またはシェルの機能を使用し、これらの作業の

fn() { 
    sed -i 's/foo/zoo/' /home/user/bar 
} 

#call it as: 
fn 

Read this BASH FAQ: I'm trying to put a command in a variable, but the complex cases always fail!

+0

両方を、しかし、文字列のバージョンは動作しませんなぜ私が興味?文字列のバージョンは、Bashの初心者には少し読みやすくなっています – jglouie

+0

文字列変数にコマンドを格納し、後で実行すると、特に引用符が使用されているときに単語の分割が発生します。 – anubhava

+0

FAQを追加しました。 – anubhava

0

使用eval:なぜあなたはそれをしたいのか分かりません。 evalを使用することは、脆弱性の解決策であり、スクリプトが壊れる可能性があることに注意してください。

eval $CMD 
関連する問題