2017-08-22 7 views
0

"/ dir"というディレクトリがあります。このディレクトリの中に私はarg1_config.tclarg2_config.tclarg3_config.tclという名前のファイルを持っています。同じ拡張子のファイルがさらに存在する可能性があります。私はこの場合、arg1、arg2、arg3のエイリアスを動的に生成しようとしています。変数を使ってシェルスクリプトにエイリアスを作成する

foreach i (`ls <path>/dir/*.tcl`) 
set app = `echo $i | sed -e 's/.*\///g' | sed 's/_config.tcl//g'` 
echo "app is $app" 
alias $app 'run -app $app' # run is an internal script that takes arg1/2/3 as a switch 
echo "alias $app 'run -app $app'" 
end 

私は、このファイルをソースする場合、それは

app is arg1 
alias arg1 'run -app arg1' 
app is arg2 
alias arg2 'run -app arg2' 
app is arg3 
alias arg3 'run -app arg3' 

を印刷し、私はwhich arg3を実行したときしかし、それは-app $のアプリを実行するために、エイリアスとアプリ値が何らかの形で必ずforeachループ、すなわちを出た後、最後の値であると言いますこの場合arg3。私はすなわち、上記印刷メッセージのようなエイリアスを作成することはできませんよ。

alias arg1 'run -app arg1' 
alias arg2 'run -app arg2' 
alias arg3 'run -app arg3' 
+1

単一引用符を使用すると、変数が展開されなくなります。二重引用符に切り替えます。 –

+0

ありがとうグレン!それが問題でした。二重引用符に切り替えると – Rancho

答えて

2

私はそれがbashのよくある質問だけど、ParsingLsガイドラインはここにも適用されます。 lsの出力を解析しないでください。ただしないでください。 cshにもglobがあります。

foreach i (`ls <path>/dir/*.tcl`) 

は単にグレンコメントで示唆されているようにあなたが約求めている問題である、と述べた

foreach i (<path>/dir/*.tcl) 

でなければなりません。単一引用符と二重引用符は、sh/bashと同じようにcshで動作します。単一引用符は変数の拡張をブロックします。エイリアスはエイリアスを実際に設定していません。実行すると実行時に変数を展開しようとします。二重引用符を使用して、それが期待する動作を得るかどうかを確認してください。

シェルエイリアスの代替戦略として、パス上の複数の名前にスクリプトをリンクまたはシンボリックリンクし、代わりに$0を有効にすることを検討してください。これはシェルのハッキングを少なくする必要があります。これは、誰かが別のシェルを試してみることを決めて、これらの "コマンド"が本当に単なるシェルエイリアスであることを忘れたときに特に顕著になります。 :)

+1

と言われました。[this](https://www-uxsup.csx.cam.ac.uk/misc/csh.html)は読んだだけです。 – ghoti

+0

詳細な説明をありがとう。問題は一重引用符で問題が発生した。二重引用符に切り替えると、それが解決されました – Rancho

+0

@glennjackman、そう、私は質問に 'csh'タグを追加しました。 'foreach'文で使われる単語リストは、パス名拡張(cshは"ファイル名置換 "と呼ばれます)を行います。私が答えて言ったように、一重引用符と二重引用符は、bashと同じようにcshで同じように動作し、 'ls 'を解析することの危険性はどのシェルにとっても排他的ではなく、' ls '。 – ghoti

関連する問題