2017-12-30 23 views
-1

元々文字列変数から来るブレース拡張を拡張するにはどうすればよいですか?文字列変数は要件であることに注意してください。BASHの文字列からのブレース拡張変数

#!/usr/bin/env bash 

TEXT_DIRS='opt/*/{doc,gtk-doc}' 
私の意図は、zshや他の言語(PerlやPythonなど)からbashソースを読むことです。以下のように、/etc/makepkg.confから設定を取得します。

DOC_DIRS=(usr/{,local/}{,share/}{doc,gtk-doc} opt/*/{doc,gtk-doc}) 

これはまさに学習目的のためのものです。 文字列から展開することは可能ですか?

答えて

1

ここで難しいのは、Bashが環境変数を解決すると、その内容をもう一度処理する別のパスを作成しないということです。変数の内容をで別ののパス(たとえば別のシェルコマンド)で評価する必要があります。ここで

はそれを行うための一つの方法です。ここで

bash-4.4# TEXT_DIRS='/usr/*/{bin,src,lib}' 
bash-4.4# bash -c ls\ $TEXT_DIRS 
ls: /usr/*/src: No such file or directory 
/usr/local/bin: 

/usr/local/lib: 

、私は動的に私は、eval uateは、第二の拡張を処理するためのシェルコマンドを生成しています。 (私は、典型的なシステムで一致するものにパスを変更する自由を取ったので、テストしようとすると、パスを元に戻すようにしてください)。

入力を信頼できない場合、動的生成コードは常に危険です。それは基本的にコマンド注入攻撃の仕組みです。しかし、信頼できる入力を持つ自分のシェルでevalを使用することは、あなたのような人為的なシナリオや自分の悪いアイディアの場合を除き、ほとんど使用しませんが、多かれ少なかれ安全です。

+0

優秀な回答 正確に私が必要とするもの。 これで、zshのbash行を解析できます。 これは私の最初の投稿stackoverflowで、コメントの私のakwardnessを許します。 –

+0

あなたは、あなたが何を考えていて何をしようとしているかを説明してくれました。それは最初の大きな質問でした。多くの質問はこの時点で重複していますので、あなたの質問が閉じられたことにあまりにも失望しないようにしてください。 –

関連する問題