2016-08-30 4 views
1

は、私がcshellを使用してコマンドを実行するときに何が起こるかです:これまでのところのTclのexec、通常のLinuxは正しい答えを与えるのに対し、ここで

find /projects/corpeng/members/ldagan/adm/utils/Synopsys/CCK/shared_tcl_code -name "*.tcl" | grep -v regression | xargs grep -Plc "^[ ]*namespace[ ]+eval[ ]+DlgViolationKeepProcs " 
> /projects/corpeng/members/ldagan/adm/utils/Synopsys/CCK/shared_tcl_code/DlgViolationKeepProcs.tcl 

、そこそこ良いです。しかし、TCL 8.4で同じことをしようとするとどうなるかを見てください。

exec find /projects/corpeng/members/ldagan/adm/utils/Synopsys/CCK/shared_tcl_code -name "*.tcl" | grep -v regression | xargs grep -Plc "^[ ]*namespace[ ]+eval[ ]+DlgViolationKeepProcs " 
> grep: nothing to repeat 

なぜですか?何か案は?
ありがとうございます。

答えて

2

問題は、二重引用符で囲まれた[ ... ]がTclコマンド置換として処理されることです。特に、[ ]は、空の文字列、すなわち、削除された文字列に置き換えられる。最も単純な修正は、{の中括弧}にgrep termを置き換えて、置換を禁止することですが、[の前にバックスラッシュ(\)を置くこともできます。

はのは、いくつかの戦略的な変数を使用して、あまりにも読み少し楽にあなたのコードを作ってみましょう:

# Where to search from; often a nice thing to separate out 
set basedir /projects/corpeng/members/ldagan/adm/utils/Synopsys/CCK/shared_tcl_code 

# What to look for; note the braces! 
set term {^[ ]*namespace[ ]+eval[ ]+DlgViolationKeepProcs } 

exec find $basedir -name "*.tcl" | grep -v "regression" | xargs grep -Plc $term 

あなたが言っただろう場合にも動作します:

set term "^\[ ]*namespace\[ ]+eval\[ ]+DlgViolationKeepProcs " 

しかし、経験をしようとする私に指示しますバックスラッシュを必要以上に使用しないようにします。彼らは長期的にはより混乱しています。

+0

Tclの人とギャルはあなたと一緒に何をしますか? – user1134991

関連する問題